类设计技巧

来源:互联网 发布:印度有那些先进 知乎 编辑:程序博客网 时间:2024/05/16 06:43
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). 

 

原创粉丝点击