一文一点 | 你真的以为自己在面向对象编程吗

你好,这是【一文一点】的第3篇文章,不拘泥于篇幅字数,用一篇文章说清一个知识点。

1、

什么是面向对象编程。

 

那我们先说什么是对象,一个对象包含属性和行为,有时候属性又叫做状态。

 

说到对象,还想到了封装、集成、多态。

 

按照这样理解,应该知道怎么是面向对象编程了。

 

2、

但是,自从何时你使用了spring之后,你不觉得你在使用spring的时候,属性和行为被 “天然” 的分离了吗。

 

你的工程被分成了manger/service/dao层,还有vo层,vo里面都是get/set。

 

你在service里面写的都是crud,是函数吧,嗯也可以叫做方法,而不是类,也不是接口。

 

不对呀,我写了接口了呀,那些service 和 impl 我不是写了么。

 

有工具可以帮你生成这些,好,就算是你自己写的,然后呢,你就写了一个“干瘪”的service,你的数据、属性呢。

 

都放入了vo里面了。

 

所以,你真不是在做面向对象编程,而是在做面向过程编程。

 

3、

有一个听起来让人不舒服的词语:贫血模型,上面说的情况就是符合这种模型的了。

 

说到spring,还要再往前说起ejb2,打从ejb2就开始了这样的风格了,spring把这样的编程方式又再一次发挥到了极致。

 

当年有一本书叫做《Expert One-on-One J2EE Development without EJB》很受欢迎。

 

4、

应该还有充血模型吧,是的。

 

对象是行为和状态的集合体,比如一个订单相关的功能,贫血的做法是

 

类:Order+OrderService

保存订单:orderService.save(Order order);

 

充血的做法是

类:Order

保存订单:order.save();行为就是保存它自己。

 

5、

如果是一个有“追求”的程序员呢,应该向充血倾斜。

 

封装、继承、多态,最有魅力的莫过于多态,无论是代码还是架构都在解决一个问题:分离逻辑和控制。

 

就是依靠多态。

 

面向对象编程就是以多态为手段来对源代码中的依赖关系进行控制的能力。

 

这种能力让我们可以构建出插件式架构,让高层策略性组件与底层实现组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开放和部署。

 

最后,在程序运行中就可以动态的改变对象的行为。

一文一点 | 你真的以为自己在面向对象编程吗