吐槽 OOP
轮到 OOP 规范了,这块是重灾区,十分需要规范来支持。
首先要理解及时刻关注 OOP 的目的:让代码组织可维护,或降低维护难度,或规模增长时维护难度增长可控。
强调这点是为了区分可工作的代码和可维护的代码之间的天壤之别。这也是导致重灾区的头号因素,拿着可工作但不可维护的代码,然后发现和 OOP 没啥联系,或者发现了错误的联系并深信之。
OOP 基本概念澄清:类型有原始类型和复合类型,在大部分编程语言中都有实物对应,表示也基本一致;对象的表示差异就大了,需要吐槽一下。
不过,吐之前还是先强调下对象的作用,或设计目的:让代码维护变简单的一种方法。进一步明确一下,是组织代码逻辑的一种方法,代码除了逻辑,另一半是数据,组织数据的方法是类型,定义各自领域的复合类型。
槽点 1:本来数据和逻辑是正交分解的,数据管理用类型定义,逻辑管理用对象关系的定义。但在使用中,很容易一锅烩,分不清数据处理和逻辑处理。
这点很重要,需要多个角度来阐述。究其原因,造成混淆的因素有语言设计的问题,也有使用者的问题。不过就是语言设计存在问题,也可以借助编程规范来正确使用,所以主要还是使用者的问题。
语言设计方面,对象做的好的有 go,rust。去掉了 class 概念,因为用复合类型就够了,class 是过度设计。关键是能组合定义对象的方法。
小结一下,OO 是个很普世的方法,符合人脑概念的形成。编程方法从这个角度开始也是不错的,但编程需要精确性,所以人为把概念分成类型和对象。为了方便区分可以这样理解,类型之间是没有关系的,只有对象有关系。也可以从解决问题的角度理解,类型解决数据的组织,对象解决逻辑的组织。举个例子,函数参数传数据就用类型,传函数/回调就用对象。
vo,dto 这些就是为了避免对象滥用提出来的约束方法,统一为复合类型就很好理解,当然扩充了类型的分类也很有用。
对象的精华在接口,interface 尤其是能默认实现的接口。接口相当于关系的协议让逻辑表达变得简洁。
版权声明: 本文为 InfoQ 作者【顿晓】的原创文章。
原文链接:【http://xie.infoq.cn/article/3662fcd2ab61fc2c60b795f99】。文章转载请联系作者。
评论