1. 一定要让数据私有
这是最为首要的一点,否则,就会破坏封装性.虽然让数据私有,可能需要编写访问方法或更改方法, 但保持实例字段私有具有更多的好处.很多惨痛的经验告诉人们,数据表示方式很可能会发生改变,但对其的使用方式却很少变动.让数据保持私有的话,改变其表 示方法就不会影响该类的使用者,bug也就很容易发现.
2. 一定要初始化数据
Java不会为你初始化局部变量,但它会初始化对象中的实例字段.不过, 绝不要依赖于那些默认值,而应该显示地初始化变量.手段可以是提供默认值,也可以是在所有构造器中设置默认值.
3. 不要在类中使用过多基本类型
这句话指的是应用期货类代替多个相关的基本类型字段,这样使类更易理解并且更容易修改.举例来说,可以用一个名为Address的新类替Customer类中下列实例字段:
private String street;
private String city;
private String state;
private int zip;
通过这种方式,可以容易地处理地址上的变化,比如增加对国际地址的处理.
4. 并非所有字段都需独自的字段访问方法和更改方法.
你可能需要获取和设置员工的薪金.但显然,对象构造之后,你就不会改变其雇佣日期.而且,对象中常常包含不希望其他人存取或设置的实例字段,比如,Address类中存放州缩写的数组.
5. 为类定义使用标准格式
我们总以下面的顺序列出类的内容:
i. 公有特性
ii. 包作用域特性
iii. 私有特性
而在每一部份中,我们列出顺序是:
i. 实例方法
ii. 静态方法
iii. 实例方法
iv. 表态字段
毕竟,类的使用者对公开接口比对私有实现的细节更感兴趣,对方法比对数据更感兴趣.
不过,究竟哪种风格最好并没有统一的意见.Sun公司对Java语言的编码风格提倡先列出字段,然后再列出方法.无论具体使用哪种风格,最重要的一点就是一致.
6. 分解职责太多的类
这句话显然有些含糊不清:究竟多少处是”太多”,相信每个人都有不同的看法.在实际中,如果显然可以把一个复杂的类分成两个概念上更为简单的类的话,那么一般就把它分解.(但不能走入极端:如果设计了10个类,而每个类只有一个方法,显然也并不合理.)
下面给出一个设计很糟糕的例子:
class CardDeck //糟糕的设计
{
public CardDeck(){…..}
public void shuffle(){….}
public int getTopValue(){….}
public int getTopSuit(){…..}
public void draw(){….}
private int [] value;
private int [] suit;
}
这个类实际上实现了两个单独的概念:一副牌(含有shuffle和draw方法)、一张牌(含有检查牌值和花色的方法)。另外,引入Card类,用以表示单张纸牌类更有意义。这样应有了两个类,第个类实现自己的职责。
class CardDeck
{
public CardDeck(){…..}
public void shuffle(){….}
public Card getTop(){….}
public void draw(){….}
private Card[] cards;
}
class Card
{
public Card(int aValue,int aSuit){…..}
public int getValue(){….}
public int getSuit(){….}
private int value;
private int suit;
}
7. 让类和方法的名字反映它们的职责
如同变量名应该反映它们表示的什么一样,类名和方法名也应如此。(当然,标准库中也存在不明确的例子,例如Date类用来描述的是时间。)
按照惯例,一般是用名词(Order)、前面有开窍词修饰的名词(RushOrder)、前面有动名词修饰的名词(BillingAddress)为类命 名。而对于方法,访问方法以小写get开始(getSalary),更改方法以小写set开始(setSalary).
这是最为首要的一点,否则,就会破坏封装性.虽然让数据私有,可能需要编写访问方法或更改方法, 但保持实例字段私有具有更多的好处.很多惨痛的经验告诉人们,数据表示方式很可能会发生改变,但对其的使用方式却很少变动.让数据保持私有的话,改变其表 示方法就不会影响该类的使用者,bug也就很容易发现.
2. 一定要初始化数据
Java不会为你初始化局部变量,但它会初始化对象中的实例字段.不过, 绝不要依赖于那些默认值,而应该显示地初始化变量.手段可以是提供默认值,也可以是在所有构造器中设置默认值.
3. 不要在类中使用过多基本类型
这句话指的是应用期货类代替多个相关的基本类型字段,这样使类更易理解并且更容易修改.举例来说,可以用一个名为Address的新类替Customer类中下列实例字段:
private String street;
private String city;
private String state;
private int zip;
通过这种方式,可以容易地处理地址上的变化,比如增加对国际地址的处理.
4. 并非所有字段都需独自的字段访问方法和更改方法.
你可能需要获取和设置员工的薪金.但显然,对象构造之后,你就不会改变其雇佣日期.而且,对象中常常包含不希望其他人存取或设置的实例字段,比如,Address类中存放州缩写的数组.
5. 为类定义使用标准格式
我们总以下面的顺序列出类的内容:
i. 公有特性
ii. 包作用域特性
iii. 私有特性
而在每一部份中,我们列出顺序是:
i. 实例方法
ii. 静态方法
iii. 实例方法
iv. 表态字段
毕竟,类的使用者对公开接口比对私有实现的细节更感兴趣,对方法比对数据更感兴趣.
不过,究竟哪种风格最好并没有统一的意见.Sun公司对Java语言的编码风格提倡先列出字段,然后再列出方法.无论具体使用哪种风格,最重要的一点就是一致.
6. 分解职责太多的类
这句话显然有些含糊不清:究竟多少处是”太多”,相信每个人都有不同的看法.在实际中,如果显然可以把一个复杂的类分成两个概念上更为简单的类的话,那么一般就把它分解.(但不能走入极端:如果设计了10个类,而每个类只有一个方法,显然也并不合理.)
下面给出一个设计很糟糕的例子:
class CardDeck //糟糕的设计
{
public CardDeck(){…..}
public void shuffle(){….}
public int getTopValue(){….}
public int getTopSuit(){…..}
public void draw(){….}
private int [] value;
private int [] suit;
}
这个类实际上实现了两个单独的概念:一副牌(含有shuffle和draw方法)、一张牌(含有检查牌值和花色的方法)。另外,引入Card类,用以表示单张纸牌类更有意义。这样应有了两个类,第个类实现自己的职责。
class CardDeck
{
public CardDeck(){…..}
public void shuffle(){….}
public Card getTop(){….}
public void draw(){….}
private Card[] cards;
}
class Card
{
public Card(int aValue,int aSuit){…..}
public int getValue(){….}
public int getSuit(){….}
private int value;
private int suit;
}
7. 让类和方法的名字反映它们的职责
如同变量名应该反映它们表示的什么一样,类名和方法名也应如此。(当然,标准库中也存在不明确的例子,例如Date类用来描述的是时间。)
按照惯例,一般是用名词(Order)、前面有开窍词修饰的名词(RushOrder)、前面有动名词修饰的名词(BillingAddress)为类命 名。而对于方法,访问方法以小写get开始(getSalary),更改方法以小写set开始(setSalary).