JDK源码分析之Set类详解

     摘要: JDK源码分析Set类,因为Set类是经常要用到的,那我们知道JDK源码中Set类在其中不可以有相同的元素,那么判断这个元素是否相同是如何实现的呢,我们看下下面这张图:    对JDK源码分析之Set类在这张类图上,首先我们看见一个经典模式的应用,那就是适配器模式,我们把map接口的对象,包装成为了Set的接口;在代码中,我们来分析一下; 首先,我...  阅读全文

posted @ 2010-02-05 14:28 键盘动物 阅读(280) | 评论 (0)编辑 收藏

java 命名规范

标识符类型 命名规则 例子 
包 
(Packages) 一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department),项目(project),机器(machine),或注册名(login names)。 com.sun.eng 
com.apple.quicktime.v2 
edu.cmu.cs.bovik.cheese 
类 
(Classes) 命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像URL,HTML) class Raster; 
class ImageSprite; 
接口(Interfaces) 命名规则:大小写规则与类名相似 interface RasterDelegate; 
interface Storing; 
方法 
(Methods) 方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。 run(); 
runFast(); 
getBackground(); 
变量(Variables) 除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。 
变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。 char c; 
int i; 
float myWidth; 
实例变量(Instance Variables) 大小写规则和变量名相似,除了前面需要一个下划线 int _employeeId; 
String _name; 
Customer _customer; 
常量(Constants) 类常量和ANSI常量的声明,应该全部大写,单词间用下划线隔开。(尽量避免ANSI常量,容易引起错误) static final int MIN_WIDTH = 4; 
static final int MAX_WIDTH = 999; 
static final int GET_THE_CPU = 1; 

posted @ 2010-02-04 14:07 键盘动物 阅读(291) | 评论 (0)编辑 收藏

重构,改善既有代码的设计 第二章(1)

@关于间接层的概念。

间接层就是我们所提炼出来的小函数。本来事情是可以交给一个大函数一次性去执行完的,可是我们为什么还要把他分割成小函数,再委托小函数这个间接层去完成事情呢。以下是作者总结出来的三点间接层的好处。

1、 允许逻辑共享。也就是说小函数做的这些小事情,子类也同样可以做,而且跟其他事情互不干扰。

2、间接层给了我们一个解释自己意图的机会。间接层允许我们选择最适合表达我们意图的名字来命名,那在调用这些函数的时候,我一看他们的名字就知道他们可能会做些什么事情。就像Justin昨天写的那个 A()

                            {

                                     …

                                     ….

                                     ….   200 

}

改成

A()

{

         A1();

         A2();

         A3();

}

A1()

{

         …….

}

A2(){….}

A3(){….}

这样你在整理逻辑的时候,头脑会很清醒。(因为名字是我们赋予他们的意义)

3、将变化加以隔离,当我需要修改一些逻辑的时候,我可以把我在整个项目中掀起的波澜降低很多。

@在有些开源的框架内,我的接口名字已经公布了,可是现在我在重构的时候需要改变这些接口名字,改怎么办呢?

这时候可以保留旧的接口,然后在旧的接口中用新接口来实现逻辑。一直持续到所有用户都开始使用新接口的时候,再把这个旧接口去掉。

@这个世界不存在一条万能的定律能解决一切问题(我曾经想象要是有这么一条定律就好了,这也是很多哲学家,科学家所追求过的),所以不要试图用重构来拯救整个世界。有以下几种情况重构不适用。

当代码已经腐朽到连正常功能都不能运行的时候,也许重写(从头再来一遍)比重构要来的简单。

有的时候临近发布,我们要赶眼前的时间,就不应重构了。重构其实是一剂中药,虽然药效很好,但是效果却也来的慢一些。如果是赶时间发布,那就不要寄希望于重构了。重构是我们欠的债,很多时候我们都是举债来发布的,但是债都是有利息的,“过于复杂的代码所造成的【维护和扩展的额外开销】就是利息。一定的利息我们可以承受,但是利息过高就会被拖垮。“出来混总是要还的”。最近几次发布都通宵,这也许就是我们的重构债欠的有点过多的信号。是时候来偿还一些债了。


posted @ 2010-02-04 11:36 键盘动物 阅读(253) | 评论 (1)编辑 收藏

日志级别的选择:Debug、Info、Warn、Error还是Fatal?

在此描述您的新便笺。软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。

因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。

当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。

=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:

所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。

所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。

也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

=== 一些疑惑 ===
不过在实际使用中,基于上面的这种考虑,也还是有一些具体问题。最常见的就是要在最终产品中将输出日志打开到那种级别才算好呢?

例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?

个人观点,Info 的级别应该比 Warn 更高才对,Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。

因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。

当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。

因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。

当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。

=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:

所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。

所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。

也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

=== 一些疑惑 ===
不过在实际使用中,基于上面的这种考虑,也还是有一些具体问题。最常见的就是要在最终产品中将输出日志打开到那种级别才算好呢?

例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?

个人观点,Info 的级别应该比 Warn 更高才对,Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。

目前我所采用的解决方法是,对于 Warn、Error、Fatal 都添加一个相应的系统断言,这样,可以保证当发生这种问题时,在调试阶段,可以立即得到提示。在软件发布以后,这些信息也能被记录到日志文件中去。
{{{
log.Warn("message");
System.Diagnostics.Debug.Fail("警告", "message");
}}}
Debug.Fail 将导致编译为 Debug 输出时,会弹出一个消息警告窗口,这可保证在测试、调试阶段不漏过任何一个潜在的错误。而在发布时,Release 编译的输出不会包括 Debug 语句,这就不会打扰最终用户,而错误信息仍然能通过 log 记录到日志中
=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:

所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。

所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。

也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

=== 一些疑惑 ===
不过在实际使用中,基于上面的这种考虑,也还是有一些具体问题。最常见的就是要在最终产品中将输出日志打开到那种级别才算好呢?

例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。

因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。

当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。

=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:

所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。

所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。

也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

=== 一些疑惑 ===
不过在实际使用中,基于上面的这种考虑,也还是有一些具体问题。最常见的就是要在最终产品中将输出日志打开到那种级别才算好呢?

例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?

个人观点,Info 的级别应该比 Warn 更高才对,Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。

目前我所采用的解决方法是,对于 Warn、Error、Fatal 都添加一个相应的系统断言,这样,可以保证当发生这种问题时,在调试阶段,可以立即得到提示。在软件发布以后,这些信息也能被记录到日志文件中去。
{{{
log.Warn("message");
System.Diagnostics.Debug.Fail("警告", "message");
}}}
Debug.Fail 将导致编译为 Debug 输出时,会弹出一个消息警告窗口,这可保证在测试、调试阶段不漏过任何一个潜在的错误。而在发布时,Release 编译的输出不会包括 Debug 语句,这就不会打扰最终用户,而错误信息仍然能通过 log 记录到日志中
个人观点,Info 的级别应该比 Warn 更高才对,Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。

目前我所采用的解决方法是,对于 Warn、Error、Fatal 都添加一个相应的系统断言,这样,可以保证当发生这种问题时,在调试阶段,可以立即得到提示。在软件发布以后,这些信息也能被记录到日志文件中去。
{{{
log.Warn("message");
System.Diagnostics.Debug.Fail("警告", "message");
}}}
Debug.Fail 将导致编译为 Debug 输出时,会弹出一个消息警告窗口,这可保证在测试、调试阶段不漏过任何一个潜在的软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。

因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。

当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。

=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:

所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。

所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是尽可能地保留系统有效数据并停止运行。
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别:
    × Debug
    × Info
    × Warn
    × Error
    × Fatal
一个等级比一个高,但是在具体开发中,关于应该如何选择适应的等级,却没有找到好的文章进行说明。记录一下自己的一些看法,以便日后使用吧。

=== Debug ===
这个级别最低的东东,一般的来说,在系统实际运行过程中,一般都是不输出的。

因此这个级别的信息,可以随意的使用,任何觉得有利于在调试时更详细的了解系统运行状态的东东,比如变量的值等等,都输出来看看也无妨。

当然,在每一个 Debug 调用之前,一定要加上 If 判断。

=== Info ===
这个应该用来反馈系统的当前状态给最终用户的,所以,在这里输出的信息,应该对最终用户具有实际意义,也就是最终用户要能够看得明白是什么意思才行。

从某种角度上说,Info 输出的信息可以看作是软件产品的一部分(就像那些交互界面上的文字一样),所以需要谨慎对待,不可随便。

=== Warn、Error、Fatal ===
警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态,他们之间的区别,要区分还真不是那么简单的事情。我大致是这样区分的:

所谓警告,应该是这个时候进行一些修复性的工作,应该还可以把系统恢复到正常状态中来,系统应该可以继续运行下去。

所谓错误,就是说可以进行一些修复性的工作,但无法确定系统会正常的工作下去,系统在以后的某个阶段,很可能会因为当前的这个问题,导致一个无法修复的错误(例如宕机),但也可能一直工作到停止也不出现严重问题。

所谓Fatal,那就是相当严重的了,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话,可以肯定必然会越来越乱。这时候采取的最好的措施不是试图将系统状态恢复到正常,而是http://www.cnblogs.com/shwen99/rss尽可能地保留系统有效数据并停止运行。

也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

=== 一些疑惑 ===
不过在实际使用中,基于上面的这种考虑,也还是有一些具体问题。最常见的就是要在最终产品中将输出日志打开到那种级别才算好呢?

例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?

个人观点,Info 的级别应该比 Warn 更高才对,Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。

目前我所采用的解决方法是,对于 Warn、Error、Fatal 都添加一个相应的系统断言,这样,可以保证当发生这种问题时,在调试阶段,可以立即得到提示。在软件发布以后,这些信息也能被记录到日志文件中去。
{{{
log.Warn("message");
System.Diagnostics.Debug.Fail("警告", "message");
}}}
Debug.Fail 将导致编译为 Debug 输出时,会弹出一个消息警告窗口,这可保证在测试、调试阶段不漏过任何一个潜在的错误。而在发布时,Release 编译的输出不会包括 Debug 语句,这就不会打扰最终用户,而错误信息仍然能通过 log 记录到日志中
也就是说,选择 Warn、Error、Fatal 中的具体哪一个,是根据当前的这个问题对以后可能产生的影响而定的,如果对以后基本没什么影响,则警告之,如果肯定是以后要出严重问题的了,则Fatal之,拿不准会怎么样,则 Error 之。

=== 一些疑惑 ===
不过在实际使用中,基于上面的这种考虑,也还是有一些具体问题。最常见的就是要在最终产品中将输出日志打开到那种级别才算好呢?

例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?

个人观点,Info 的级别应该比 Warn 更高才对,Warn 信息和 Debug 一样,应该在产品测试和调试时使用,而 Info、Erro 以及 Fatal 则在产品发布后需要继续使用。

目前我所采用的解决方法是,对于 Warn、Error、Fatal 都添加一个相应的系统断言,这样,可以保证当发生这种问题时,在调试阶段,可以立即得到提示。在软件发布以后,这些信息也能被记录到日志文件中去。
{{{
log.Warn("message");
System.Diagnostics.Debug.Fail("警告", "message");
}}}
Debug.Fail 将导致编译为 Debug 输出时,会弹出一个消息警告窗口,这可保证在测试、调试阶段不漏过任何一个潜在的错误。而在发布时,Release 编译的输出不会包括 Debug 语句,这就不会打扰最终用户,而错误信息仍然能通过 log 记录到日志中错误。而在发布时,Release 编译的输出不会包括 Debug 语句,这就不会打扰最终用户,而错误信息仍然能通过 log 记录到日志中
目前我所采用的解决方法是,对于 Warn、Error、Fatal 都添加一个相应的系统断言,这样,可以保证当发生这种问题时,在调试阶段,可以立即得到提示。在软件发布以后,这些信息也能被记录到日志文件中去。
{{{
log.Warn("message");
System.Diagnostics.Debug.Fail("警告", "message");
}}}
Debug.Fail 将导致编译为 Debug 输出时,会弹出一个消息警告窗口,这可保证在测试、调试阶段不漏过任何一个潜在的错误。而在发布时,Release 编译的输出不会包括 Debug 语句,这就不会打扰最终用户,而错误信息仍然能通过 log 记录到日志中

posted @ 2010-01-25 10:10 键盘动物 阅读(11653) | 评论 (1)编辑 收藏

ubuntu下 漂亮的 桌面日历 (linux下通用)

http://www.rainlendar.net/cms/index.php?option=com_rny_download&Itemid=32

posted @ 2010-01-22 11:23 键盘动物 阅读(705) | 评论 (0)编辑 收藏

tnsnames.ora配置小结

listener.ora、 tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,其中listener.ora是和数据库服务器端 相关,而tnsnames.ora和sqlnet.ora这2个文件不仅仅关系到服务器端,主要的还是和客户端关系紧密。
检查客户端oracle网络的时候可以先检查sqlnet.ora文件:

# SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora
# Generated by Oracle configuration tools.

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)

##NAMES.DEFAULT_DOMAIN = us.oracle.com

上面的sqlnet.ora文件说明:
SQLNET.AUTHENTICATION_SERVICES= (NTS)——这个表示采用os认证,在数据库服务器上,可以利用sqlplus “/ as sysdba”。一般这个配置在windows上是ok的,在unix环境下可能会有问题,一般在unix下可以去掉这个配置。

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname解析;如果hostname解析不 到,将采用onames进行解析。

被注释掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示采用默认的domain name为us.oracle.com,在tnsnames.ora中如果配置对应的解析,如果原来的别名oralocal,那么,当启用这个参数后,在 tnsnames中的配置要改成oralocal.us.oracle.com。在使用tnsping时或者sqlplus登录时,只需写前面的别名,系 统会自动加上后面的domain name来进行解析。

检查完毕sqlnet.ora,一般都会发现是使用tnsname来解析别名的,那么,tnsnames.ora中可以有哪些配置种类呢?

# TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
# Generated by Oracle configuration tools.


###### 一般的配置 ##################################
ORALOCAL =
  
(DESCRIPTION =
    
(ADDRESS_LIST =
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    
)
    
(CONNECT_DATA =
      
(SERVER = DEDICATED)
      
(SERVICE_NAME = oralocal)
    
)
  
)


###### 这样也行,用SID=oralocal ###########################
ORALOCAL_2 =
  
(DESCRIPTION =
    
(ADDRESS_LIST =
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    
)
    
(CONNECT_DATA =
      
(SERVER = DEDICATED)
      
(SID = oralocal)
    
)

###### RAC的配置(3节点rac) ###############################
ORALOCAL =
  
(DESCRIPTION =
  
(load_balance = yes)
  
(failover = on)
    
(ADDRESS_LIST =
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))   
    
)
    
(CONNECT_DATA =
        
(SERVICE_NAME = oralocal)
        
(SERVER = DEDICATED)
        
(failover_mode=(type=select)(method=basic)(retries=20)(delay=20))
    
)
  
)
  
ORALOCAL_NODE1 =
   
(DESCRIPTION =
     
(ADDRESS_LIST =
       
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
       
)
       
(CONNECT_DATA =
         
(SERVICE_NAME = oralocal)
         
(INSTANCE_NAME = oralocal_node1)
       
)
   
)


ORALOCAL_NODE2=
   
(DESCRIPTION =
     
(ADDRESS_LIST =
       
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
       
)
       
(CONNECT_DATA =
         
(SERVICE_NAME = oralocal)
         
(INSTANCE_NAME = oralocal_node2)
       
)
   
)
   

ORALOCAL_NODE3 =
   
(DESCRIPTION =
     
(ADDRESS_LIST =
       
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
       
)
       
(CONNECT_DATA =
         
(SERVICE_NAME = oralocal)
         
(INSTANCE_NAME = oralocal_node3)
       
)
   
)


  
)


###### DATA GUARD配置(primary库和standby库都需要配置)##############
standby =
  
(DESCRIPTION =
    
(ADDRESS_LIST =
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
        
)
    
(CONNECT_DATA =
          
(SERVER=DEDICATED)
          
(SERVICE_NAME = oralocal)
      
)
  
)

primary =
  
(DESCRIPTION =
    
(ADDRESS_LIST =
      
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521))
        
)
    
(CONNECT_DATA =
          
(SERVER=DEDICATED)
          
(SERVICE_NAME = oralocal)
      
)
  
)

另外需要注意的2点情况:
(1)如果tnsnames中的service_name配置错误,配置成了instance_name了,这个时候会发生tnsping能通,但是 sqlplus连接不上的奇怪情况。报错ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。这个时候查错的时候,需要检查对应的service_name。
(2)如果远程数据库是rac,而且本地客户端端远程数据库处于不同的网段,通过公网链接,rac对外的ip映射只有一个,即只映射到一个节点。请注意在 客户端配置tnsnames的时候按照单机的情况来配置。呵呵,dba不仅仅要学习oracle,了解一些网络的知识,特别是自己系统的网络架构,也是需 要的。

posted @ 2010-01-21 13:48 键盘动物 阅读(263) | 评论 (0)编辑 收藏

类的设计原则

1. 开-闭原则(对扩展开放,对修改关闭)
2. 里氏替换原则(父类的方法都要在子类中实现或者重写)
3. 依赖倒转原则(要针对接口编程,不要针对实现编程)
4. 接口隔离原则
5. 合成/聚合复用原则(尽量使用合成/聚合,而不是使用继承)
6. 迪米特法则(talk only to your immediate friends)

posted @ 2009-12-21 10:22 键盘动物 阅读(282) | 评论 (0)编辑 收藏

ubuntu9.10下面使用google音乐乱码问題

用下面命令:sudo rm /etc/fonts/conf.d/49-sansserif.conf 在应用程序->附件->终端 中执行就可以了.已经测试

posted @ 2009-12-02 11:14 键盘动物 阅读(166) | 评论 (0)编辑 收藏

Ubuntu安装apache

准备工作:下载httpd.2.2.9.tar.gz
安装apache2.2
tar zxvf httpd.2.2.9.tar.gz
cd httpd.2.2.9
./configure --enable-dav --enable-so --prefix=/opt/apache2.2

说明:--enable-dav允许Apache提供DAV协议支持;--enable-so允许运行时加载DSO模块, --prefix指定apache的安装目录

make
make install

说明:在configure与make很可能会出现一些fail,而往往是因为缺少一些必要的库,就直接安装一下apt-get install *****,即可,我安装出现过三个,反正这个比较直观

这样,apache 应该安装好了,测试一下,/opt/apache2/bin/apachectl -k start, 在浏览器里输入:http://locahost

正常情况下应该出现It works!

posted @ 2009-11-29 22:39 键盘动物 阅读(170) | 评论 (0)编辑 收藏

windows下安装grub安装ubuntu

1.首先下载ubuntu-9.10-desktop-i386.iso(http://www.ubuntu.com/getubuntu/download)文件
存放在C盘(ntfx/fat32)的根目录下;
2.下载Grub4rDos(http://sourceforge.net/projects/grub4dos),将grldr和grub.exe放入C盘根目录;
3.从ubuntu-9.10-desktop-i386.iso文件中复制menu.lst文件到c盘根目录,在最后加入如下内容:
title Install ubuntu
find --set-root /ubuntu-9.10-desktop-i386.iso
kernel /vmlinuz boot=casper find_iso=/ubuntu-9.10-desktop-i386.iso
initrd /initrd.gz
4.复制ubuntu-9.10-desktop-i386.iso里 Casper和 .disk两个目录到C盘根目录;
5.复制ubuntu-9.10-desktop-i386.iso里Casper目录中的vmlinuz和initrd.lz文件到C盘根目录,将initrd.lz文件修改为initrd.gz
6.修改C盘根目录下的boot.ini文件,在文件末尾加入下面代码:
C:\grldr="GRUB"
7.重新启动,在启动菜单处,选择Grub,然后再选择Install Ubuntu就可以开始安装了
8.安装时选择手动分区,可以保留原来的windows系统
9.可能会无法卸载isodevice分区(我遇到了)到挂载的时候,同时按下Ctrl+Alt+F2,然后在:后输入sudo umount -l /isodevice 输好后,然后回车,再同时按下 Ctrl+Alt+F7,回到安装界面
基本上就ok了

posted @ 2009-11-29 20:34 键盘动物 阅读(618) | 评论 (0)编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页 
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔档案

新闻分类

搜索

最新评论

阅读排行榜

评论排行榜