说人话的设计模式1:OOP基本概念
Posted 说人话的算法工程师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说人话的设计模式1:OOP基本概念相关的知识,希望对你有一定的参考价值。
准备开坑记录一下设计模型的学习笔记,主要参考极客时间王争的设计模式课,也会包含一些其他地方查的资料和自己的思考。内容大致分为以下几个部分:
面向对象理论+实战
设计原则理论+实战
规范与重构理论+实战
设计模式理论+实战
开源代码剖析+系统设计实战
01 面向对象4大特性
1.封装
What:隐藏信息,保护数据访问。
How:暴露有限接口和属性,需要编程语言提供访问控制的语法。
Why:提高代码可维护性;降低接口复杂度,提高类的易用性。
举例:员工的薪资互相不能get,并且只能由hr来set
2.抽象
What: 隐藏具体实现,使用者只需关心功能,无需关心实现。
How: 通过接口类或者抽象类实现,特殊语法机制非必须。
Why: 提高代码的扩展性、维护性;降低复杂度,减少细节负担。
抽象类 | 接口 | |
可以包含属性 | ✅ | ❌ |
可以包含方法 | ✅ | ✅ |
可以包含代码实现 | ✅ | ❌ |
使用方式 | 不能实例化,只能继承,必须实现所有抽象方法 | 不能实例化,只能实现,实现声明的所有方法 |
关系 | is-a | has-a |
目的 | 代码复用 | 抽象 |
举例 | logger类:具有name,enabled和minPermittedLevel属性,用于区分不同类型日志以及输出等级 | doFilter方法:不需要属性和包含具体实现的方法。实现接口时定义过滤逻辑即可 |
抽象类更多的是为了代码复用,而接口就更侧重于解耦。
3.继承
What: 表示 is-a 关系,分为单继承和多继承。
How: 需要编程语言提供特殊语法机制。例如 Java 的 “extends”,C++ 的 “:” 。
Why: 解决代码复用问题。
4.多态
What: 子类替换父类,在运行时调用子类的实现。
How: 需要编程语言提供特殊的语法机制。比如继承、接口类、duck-typing。
Why: 提高代码扩展性和复用性。
接口类语法:不同的类实现相同的接口,使用相同的方法名
duck-typing:python中函数不需要指定数据类型,随便传什么类型的类进去,只要有那个方法名就可以调用
02 为什么要用OOP
定义一个函数到处调用,同样可以达到代码复用的目的。但是当逻辑比较复杂时候,我们可能会不得不在一个函数里塞很多个参数,或者很多个函数共用参数,这样就会带来难以维护的问题。
什么叫难以维护?改一个参数需要同时改每个调用这个函数的地方;对于某些参数不了解而做了不应该做的操作;参数太多理解难度大。。。。
最后,用OOP会带来一些额外的工作量,不用OOP并不是不能实现功能。但是不用OOP容易引起难以发现的问题而带来更大的麻烦。
03 OOP中的坑
1.滥用setter,getter方法
有些属性不宜提供setter/getter方法,比如说员工这个对象,薪资这个属性就是不能随便set和get的
2.滥用全局对象,全局方法
What:所有的常量/utils方法放到一个大类中
Why:难以维护,影响单元测试编译效率
How:按照主题分拆成多个类
When:当有多个对象都用到一个方法,又不适宜抽象一个父类。比如mkstring拼接字符串方法
3.定义数据和方法分离的类
贫血模型:类只有属性+一堆setter/getter方法,不具有封装/抽象特性,还是面向过程的风格(与之相对的关键词是充血模型,DDD(领域驱动设计),后面会分享,敬请期待~)
以上是关于说人话的设计模式1:OOP基本概念的主要内容,如果未能解决你的问题,请参考以下文章
架构师成长之路-纯干货系列:什么是架构和架构分类(程序员突破内卷大法)说人话接地气