- 面向对象的编程中,不要对于所有属性都实现getter和setter,那样会暴露数据,使其容易被修改,退化为面向过程的方法。
- 在类内部向外部必须提供一个类对象时,这样,相关的属性就会被修改。应避免外部可以修改内部对象属性。
- 对于例如Constant类、Util类等采用面向过程来组织的类尽量做到职责单一,定义一些细化的小类。
接口和抽象类
- 抽象类(
is-a
)
抽象类不允许被实例化
抽象类可以包含属性和方法
子类继承抽象类必须实现抽象类中的方法
解决代码复用,一般是自底向上 - 接口(
has-a
)
接口不能包含属性
接口只能声明方法
实现接口时,必须实现接口中全部方法(除了默认方法)
解决抽象,一般是自顶向下
设计原则
- 基于抽象编程而非实现编程,通过抽象,实现扩展性,灵活性。
- 命名脱离实际实现
组合和继承
- 继承用来表示
is-a
关系,可以解决代码复用性,但是,当涉及到继承层次深,情况多变且复杂时,很容易造成冗余,分支多,这种情况下少用或者不用继承。 - 继承的作用:表示
is-a
关系,支持多态,代码复用,可以通过接口、组合、委托三者结合来替换。 - 结构稳定,不易替换,可以使用继承,比如基本的几个设计模式,模板设计模式、建造者模式等,或者业务逻辑不复杂,继承层次浅,可以使用继承。其他的层次深,较复杂的使用接口+组合+委托更好。