OOP的四大特性的意义与缺陷
封装
封装也叫作信息隐藏或者数据访问保护。
意义一:限制修改
如果我们对类中属性的访问不做限制,属性可以随意被以各种奇葩的方式修改,这会导致:
- 修改逻辑可能散落在项目中的各个角落,代码实现得五花八门。
- 破坏某些不能被修改的数据。
封装的好处:
- 修改数据的代码集中在一个类中,通过搜索函数名即可得知哪里修改了数据。
- 保护那些不可以被修改的数据。
意义二:降低调用方心智成本
除此之外,类仅仅通过有限的方法暴露必要的操作,也能提高类的易用性。如果我们把类属性都暴露给类的调用者,调用者想要正确地操作这些属性,就势必要对业务细节有足够的了解。而这对于调用者来说也是一种负担。相反,如果我们将属性封装起来,暴露少许的几个必要的方法给调用者使用,调用者就不需要了解太多背后的业务细节,用错的概率就减少很多。这就好比,如果一个冰箱有很多按钮,你就要研究很长时间,还不一定能操作正确。相反,如果只有几个必要的按钮,比如开、停、调节温度,你一眼就能知道该如何来操作,而且操作出错的概率也会降低很多。
抽象
抽象隐藏了方法的具体实现,从更高的维度去定义一组对象的共同特征,一般用接口实现抽象。
意义一:降低代码的耦合性
面向接口编程类似于面向“协议”编程,代码是松散非耦合的。
意义二:提高可测试性
Mock 工具都是依赖接口生成 Mock 类的,没有 Mock 的话,测试业务代码可谓寸步难行。
滥用的后果:增加心智成本,影响写代码心情
有些人在实现代码的时候,无论如何也要定义接口,导致项目里面一大堆接口,看吐了。对某个类的改动常常意味着需要同步修改其接口,增加无谓的工作量。
说实在的,如果几乎用不到上述的两个接口的优势,那么是没必要定义接口的。
继承
意义:复用代码
滥用的后果:过度使用继承,继承层次过深过复杂,就会导致代码可读性、可维护性变差。
继承能不用就不用。
继承大多可以用组合模式替代、用单例模式替代。
如果非要用的话,答应我,最多一层继承。
多态
多态指的是:子类可以替换父类,实现可以替代接口。
多态一般和抽象结合使用。
原文链接:OOP的四大特性的意义与缺陷