说人话的设计模式1:OOP基本概念

Posted 说人话的算法工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说人话的设计模式1:OOP基本概念相关的知识,希望对你有一定的参考价值。

准备开坑记录一下设计模型的学习笔记,主要参考极客时间王争的设计模式课,也会包含一些其他地方查的资料和自己的思考。内容大致分为以下几个部分:

  1. 面向对象理论+实战 

  2. 设计原则理论+实战

  3. 规范与重构理论+实战

  4. 设计模式理论+实战

  5. 开源代码剖析+系统设计实战


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基本概念的主要内容,如果未能解决你的问题,请参考以下文章

架构师成长之路-纯干货系列:什么是架构和架构分类(程序员突破内卷大法)说人话接地气

设计模式太难了?看看这个 “说人话” 的版本再说!

程序员突破内卷大法:聊聊软件架构师成长之路(干货系列,说人话接地气)

GWAS分析-说人话(1)啥是GWAS,都分析啥?

人机大战输赢不重要!重要的是说人话

恒源云 (Gpushare)_炼丹必备调参心法(说人话系列)