面向对象编程的设计原则

设计原则

谈到设计原则想必我们都听过SOLID一词,他就是几个设计原则的首字母合并起来的简称,以前我对几个设计原则我都是死记硬背,但发现很容易忘记,当知道有SOLID这个单词的时候,脑开中每个字母联想一个单子就很容易记住这几个原则,S(单一职责原则)、O(开放封闭原则)、L(里式替换原则)、I(接口隔离原则)、D(迪米特法则),还有两个依赖倒转和合成复用原则。为什么设计模式要先谈设计原则呢?记得刚毕业面试的时候,面试官问我设计模式,我有时候嘴里会说出设计原则,然后面试官提醒我这是设计原则这不是设计模式,那么这两者是一个什么样的关系呢?后来我才知道23种设计模式万变不离其中,都是遵循这些设计原则的,下面我们弄清楚每一个设计原则。

单一职责原则(SRP)
单一职责原则的定义是对一个类来说,只负责一个职责或者功能。也就是说不要设计大而全的类,要设计力度小、功能单一的类。如果一个类包含两个或者两个以上的业务不相干的功能,那么说它的职责不够单一,应该将它拆分成多个功能单一的类、粒度更细的类。
单一职责原则注意事项和细节
降低类的复杂度,一个类只负责一项职责,一个方法只负责一个职责
提高类的可读性,可维护性
降低变更引起的风险
慎用很多分支的if else的分支判断,耦合度比较高

开放封闭原则(OCP)
OCP开闭原则,对扩展开放,对修改关闭,这是编程中最基础、最重要的设计原则。当软件需求发生变化的时候,尽量通过扩展软件实体的行为为未来实现变化,而不是通过修改已有的代码来实现变化。

里式替换原则(LSP)
子类对象能够替换程序中父类对象出现的任何对象,并且保证原来的程序的逻辑行为不变及正确性不被破坏。这么一说有点跟多态类似,多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现思路。而里式替换是一种设计原则,是用来指导继承关系中子类该如何设计,子类的设计要保证在替换父类的时候,不改变原有程序逻辑以及不破坏原有程序的正确性。

接口隔离原则(ISP)
接口隔离原则的英文翻译是"Interface Segregation Principle",缩写ISP。英文意思是"Clients should not be forced to depend upon interfaces that the do not use."翻译就是:客户端不应该强迫依赖它不需要的接口。其中的"客户端"可以理解为调用者或者使用者。

依赖倒转原则(DIP)
基本介绍
高层模块不应该依赖低层模块,二者都应该依赖其抽象对象
抽象不应该依赖细节,细节应该依赖抽象
依赖倒转(倒置)的中心思想是面向接口编程
依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在C#中,抽象指的是接口或抽象类,细节就是具体实现的类
使用接口或抽象类的目的是定制好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成
依赖关系传递的三种方式
接口传递
构造方法传递
setter方法传递

迪米特法则(LOD)
迪米特法则又叫"最少知道原则",即一个类对自己依赖的类知道的越少越好。每个模块(unit)只应该了解那些与它关系密切的模块的有限知识。或者说,每个模块之和自己的朋友"说话"(talk),不和陌生人"说话"(talk)。“不该有直接依赖关系的类之间,不要有依赖”。“有依赖关系的类之间,尽量只依赖必要的接口”
迪米特法则有一个更简单的定义:只跟直接朋友通信。
直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,默认的类最好不要以局部变量的形式出现在的类的内部。

如何理解"高内聚、低耦合"
“高内聚、松耦合”是一个非常重要的设计思想,能够有效提高代码的可读性和可维护性,缩小功能改动导致的代码改动范围。"高内聚"用来指导类本身的设计,"低耦合"用来指导类与类之间依赖关系的设计。
所谓高内聚,就是指相近的功能应该放到同一个类中,不想近的功能不要放在同一个类中。相近的功能往往会被同时修改,放到同一个类中,修改比较集中。所谓低耦合指的是:在代码中,类与类之间的依赖关系简单清晰。即使两个类有依赖关系,一个类的代码改动也不会或者很少导致依赖类的代码改动。

合成复用原则
原则是尽量使用合成/聚合的方式,而不是使用继承。
举例:如果A类有两个方法,要让B类能够使用这两个方法,我们可以将B继承自A,那么B类就可以使用A类的两个方法,这样就增强了他们的耦合性。但如果A类还有其他方法,但B类并不需要用,那就不太适合。还有一种方案就是让B依赖A,通过参数将A的对象传进来(依赖),或者B类添加一个A类的属性(聚合),或者setter方法,又或者在B类实例化一个A类的对象(组合),这些都是设置依赖方式,如下图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值