类设计方法

类设计技巧

​ 我们不会面面俱到,也不会过于沉闷,下面简单介绍几点技巧,应用这些技巧可以使得设计出来的类更具有OOP的专业水准。

  1. 一定保证数据私有

    这是最重要的:绝对不要破坏封装性。有时候,需要编写一个访问器方法或者更改器方法,但是还是最好保持其实例域的私有性。很多惨痛的教训告诉我们,数据的表示形式很可能会发生改变,但他们的使用方式却不会经常发生变化。当数据保持私有时,他们的表示形式的变化会对类的使用者产生影响,即使出现bug也易于检测。

  2. 一定要对数据初始化

    ​ Java不对局部变量进行初始化,但是会对对象的实例域进行初始化。最好不要依赖于系统的默认值,而是应该显式的初始化所有的数据,具体的初始化方式可以是提供默认值,也可以是在所有的构造器中设置默认值。

  3. 不要在类中使用过多的数据类型

    ​ 就是说,用其他类代替多个相关的基本类型的使用,这样会使类更加易于理解和易于修改。例如,用一个称为Address的心的类替换一个Customer类中的以下的实例域:

    private String street;
    private String city;
    private String state;
    private int zip;
    

    这样,可以很容易处理地址的变化,例如,需要增加对国际地址的处理。

  4. 不是所有的域都需要独立的域访问器和更改器

    ​ 或许,需要获得或设置雇员的薪金。而一旦构造了雇员对象,就应该禁止更改雇佣日期,并且在对象中,常常包含一些不希望别人获得或设置的实例域,例如,在Address类中存放州缩写的数组。

  5. 将职责过多的类进行分解

    ​ 这样说似乎有点含糊不清,究竟多少算是“过多”?每个人的看法不同,但是,如果明显的可以将一个复杂的类分解成两个更为简单的类,就应该将其分解(但另一方面,也不要走极端,设计十个类,每个类只有一个方法,显然有些娇枉过正了)。

    ​ 下面就是一个反面的设计实例。

    public class CarDeck{
    	private int[] value;
        private int[] suit;
        public CarDeck(){ ... }
        public void shuffle(){ ... }
        public int getTopValue(){ ... }
        public int getTopSuit(){ ... }
        public void draw(){ ... }
    }
    

    ​ 实际上,这个类实现了两个独立的概念,一副牌(含有shuffle方法和draw方法)和一张牌(含有查看面值和花色的方法)。另外,引入一个表示但张牌的Card类。现在有两个类,每个类完成自己的职责。

    public class CarDeck{
    	private Card[] cards;
        public CarDeck(){ ... }
        public void shuffle(){ ... }
        public Card getTop(){ ... }
        public void draw(){ ... }
    }
    
    public class Card{
        private int value;
        private int suit;
        public Card(int value,int suit){ ... }
        public int getValue(){ ... }
        public int getSuit(){ ... }
    }
    
  6. 类名和方法名要能够体现它们的职责

    ​ 与变量应该有一个能够反映其含义的名字一样,类也应该如此(在标准类库中,也存在着一些含义不明确的例子,如:Date类实际上是一个用于描述时间的类)。

    ​ 明明类名最好的习惯就是采用一个名词(Order)、前面有形容词修饰的名词(RushOrder)或者动名词(有"_ing"后缀)修饰名词(例如,BillingAddress)。对与方法来说,习惯是访问器方法用小写get开头(getSalary),更改器方法用小写的set开头(setSalary)。

  7. 优先使用不可变的类

    ​ LocalDate类以及java.time包中的其他类是不可变的——没有方法能修改对象的状态。类似plusDays的方法并不是更改对象,二十返回状态已修改的新对象。

    ​ 更改对象的问题在于,如果多个线程试图同时更新一个对象,就会发生并发更改。其结果是不可预料的。如果类是不可变的,就可以安全地在多个线程间共享其对象。

    ​ 因此,要尽可能的让类是不可变的,这是一个很好的想法,对于表示值的类,如一个字符串或一个时间点,这尤其容易。计算会生成新值,而不是更新原来的值。

    ​ 当然,并不是所有类都应当是不可变的。如果员工加薪时让rsiseSalary方法返回一个Employee对象就会显得很奇怪。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值