王争《设计模式之美》学习笔记
哪些代码设计看似是面向对象,实际是面向过程的?
滥用 getter、setter 方法
- 文中首先通过一段JAVA代码例子来说明问题。说有的同学会给所有的属性都定义getter、setter 方法,这在我们写PHP的同学身上好像没有这个特质,有点无厘头。
- 给所有的属性都定义public的getter、setter 方法,这就跟将这两个属性定义为 public 公有属性,没有什么两样,违反面向对象封装的访问权限控制。这里作者说因此代码就退化成面向过程编程风格的了,我要说这个锅面向过程真不能背,面向过程编程风格并不是一无是处的反面样例。
- 文中用JAVA举例,如果用getter方法拿到了一个List集合容器,外部调用者在拿到这个容器之后,是可以操作容器内部数据,PHP倒是没有这个问题。
滥用全局变量和全局方法
- 在面向对象编程中,常见的全局变量有单例类对象、静态成员变量、常量等,常见的全局方法有静态方法。
- 全局变量和全局方法中,Constants 类和 Utils类最常用到。
- 将 Constants 类拆解为功能更加单一的多个类,或者不单独地设计 Constants 常量类,而是哪个类用到了某个常量,我们就把这个常量定义到这个类中。
- 设计 Utils 类的时候,最好也能细化一下,针对不同的功能,设计不同的 Utils 类。
定义数据和方法分离的类
- 传统的 MVC 结构做前后端分离之后,分为 Controller 层、Service 层、Repository 层。
- 在每一层中,我们又会定义相应的 VO(View Object)、BO(Business Object)、Entity。
- VO、BO、Entity 中只会定义数据,不会定义方法,所有操作这些数据的业务逻辑都定义在对应的 Controller类、Service 类、Repository 类中。
- 这种开发模式叫作基于贫血模型的开发模式.。
在面向对象编程中,为什么容易写出面向过程风格的代码?
- 符合人的这种流程化思维方式。
- 面向对象编程要比面向过程编程难一些,面向对象编程需要设计、思考、封装和考虑类之间的交互。
面向过程编程及面向过程编程语言就真的无用武之地了吗?
- 脚本式的面向过程的编程风格就更适合一些。
- 类中每个方法的实现逻辑,就是面向过程风格的代码。
- 面向对象和面向过程两种编程风格,也并不是非黑即白、完全对立的。最终的目的还是写出易维护、易读、易复用、易扩展的高质量代码。