封装 What:隐藏信息,保护数据访问。
How:暴露有限接口和属性,需要编程语言提供访问控制的语法。
Why:提高代码可维护性;降低接口复杂度,提高类的易用性。

抽象 What: 隐藏具体实现,使用者只需关心功能,无需关心实现。
How: 通过接口类或者抽象类实现,特殊语法机制非必须。
Why: 提高代码的扩展性、维护性;降低复杂度,减少细节负担。

继承 What: 表示 is-a 关系,分为单继承和多继承。
How: 需要编程语言提供特殊语法机制。例如 Java 的 “extends”,C++ 的 “:” 。
Why: 解决代码复用问题。

多态 What: 子类替换父类,在运行时调用子类的实现。
How: 需要编程语言提供特殊的语法机制。比如继承、接口类、duck-typing。
Why: 提高代码扩展性和复用性。

3W 模型的关键在于 Why,没有 Why,其它两个就没有存在的意义。从四大特性可以看出,面向对象的终极目的只有一个:可维护性。易扩展、易复用,降低复杂度等等都属于可维护性的实现方式。


1 封装 常见编程语言通过 public protected privite 来支持 封装的意义 。 关掉直接操作数据的口子,让数据的修改更贴合真实业务。 例如:创建时间,就没有修改数据的场景。 钱包的钱数,只能通过增加,减少接口进行调整,不开放直接设置金额的接口(口子一开,对账就是个麻烦事) 另一个意义,调用类,没有必要知道太多的实施类的具体实现细节。让操作更为简单。 个人思考: 封装就是让代码遵守开闭原则的重要手段。 当调用类,关注过多实施类的继节时,一个需求的变化,可能引发多个依赖模块都发生了级联的改动,而一但调用类过度的知道了太多了实施类的细节(然后各种调用类代码再一散落),这时程序也相应地变得出各种毛病出来,既然这样,把实现的方法封装起来多好,让调用端少操点心。 Law of Demeter 有个别名,就叫最少知道原则,争哥说的第二个意义,感觉就是在描述遵守迪米特法则的好处. 再乱想一下, 人体,不就是最好的的封装么, 给你物料的入口(吃),出口(拉),还给你调节增强的接口(训练) 有多少人,并不知道其内部细节,不照样过着精彩的一生。 还有,调用类,总想知道更多被调用类的信息,以期更精准的控制,这种代码风格,就是完美主义病,而完美主义的并发症就是拖延症,以及极高的复杂度造成项目越写越混乱。
2 抽像。 抽像讲的是如何隐藏信息,而抽像讲的是隐藏方法的具体实现,让调用者只关心方法提供了哪些功能即可。 通常借 interface 和 abstract class 来实现 抽像这一特性。当implement 某接口时,只要知道接口干了啥,即可,无需要关心实施类的细节实现。 抽你的意义,能解决啥问题。 1 处理复杂性的有效手段。人脑承受信息有限,抽像做为不关注实现细节的套路,正好管用。 2抽像指导了很多的oo原则 , 凡时对实现进行封装抽离的,都可以叫抽像,例如malloc() 3 定义类时,要有抽像思维,不要在方法中,暴露太多细节。(建议一层抽象层,让功能分解得更细,让意图和实现分享) 个人理解 (抽象处理的复杂度是人月神话里描述 的本质复杂度(Essential Complexity), 也是尊重人脑的认知学的 ,大脑的特性是很烂的( 抽像的工具包记重点,归纳特性,忽视细节),(推荐阅读google 整理术) 再瞎想一下,抽像是将很多的知道点给封装起来了(encoding 成为一个模型) , 归纳法便是抽象的重要实现套路,也是支撑及发展文明的利器。 抽像在开发中的意义 ,是让具体的实施类,在合适的场所下编写 (最好满足sru),然后通过合理的ood ,去调用或运行时create 具体的子类对象,去实现。 拜抽象所赐,一种各有分工,又能有序协同的场景就出来了 其三,个人套路包,我沟通时,当和建议相同方向时,就往抽像了说,当想有差异时,就很细节说。 (套路是双韧剑,就看你如何用了),我个人发现很多营销大的套路,抽像来看和传销是一至的,有些技术大牛的工作套路,和某著名贪官一模一样。(例如,把话说明白了再干,明确职责)
3继承 继续用来表示类之间是 is -a 关系。 猫是动物,于是就拥有的动物的自带属性行为。(移动速度,移动距离) 进一步的,动物属生物(于是) 有了生命的共有属性,年龄 有些语言单继续,有些多继承。 意义 和解决问题。 1 符合认知美感 。 2 减少重复coding . 问题: 重要隐患,父子类,大量方便藕合。 个人理解。 继续和不停的复杂粘贴代码是两个极度,复制代码虽散但各管各的,继续父一改,子跟着改,而复制代码这事,是问题是,实现一个细节后,其它的相联代码,都要不停的改。而继随相反,一改全刷了,除非你子类完全重写了,而一些不成熟的开发,前期的父类往往考虑不周,后期一折腾,悲剧从此开场。 再者 复制粘贴代码,两段代码关联太轻,基本上就是要一处一处的改,而复制这事,就关联得太重了。 一但重了,就往往产生大量的不必要的负担。 我学设计模式最开心的就是,基于原则,而不是基于规则,不同场景就用不同的套路。 基于职责太重这事,我是很反感用多重继续的。 需要啥,再组合一个类多好。 多关联一个类,死不了人的。 搞出菱形继随这种蛋疼的东西,又要不停的去关注细节,活着会很累的
4 多态。 多态指子类替代父类。 三种语法机制。(父可以) 实现多态,除继续外,还有利用接口类语法, duck-typing 个人理解:理解不深。有感觉描述不出来,就觉得,继续把事搞死了,多态就要死的东西搞活。 于是支持这种把事搞活的套路出来。