推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

c++ 面向对象设计五大原则

   2023-08-23 网络整理佚名2710
核心提示:面向对象设计(OOD)是面向对象编程(OOP)必不可少的一个环节,只有好的设计,才能保障程序的质量。依赖于抽象就是不对实现编程,而对接口编程。上面五条面向对象设计原则,可以帮助我们设计出代码易于复用、功能易于扩展、运营易于维护的程序,需要我们在实践中遵守。

面向对象设计(OOD)是面向对象编程(OOP)的重要组成部分。 只有好的设计才能保证程序的质量。 面向对象设计的主要任务是类的设计。 许多面向对象(OO)的先驱和前辈提出了许多关于类的设计原则来指导OOP,其中包括类设计的五个基本原则。

1.单一职责原则(SRP)

专心是一个人的良好品质,责任单一也是一个班级的良好设计。 单一职责的核心思想:一个类只做好一件事。

单一责任原则可以看作是高内聚、低耦合在面向对象原则上的延伸。 一个类的职责太多,很容易导致类间的职责,提高耦合性,降低内聚性。 通常意义上的单一职责意味着一个类只有一个功能。 不要为一个类设计太多的功能。 杂乱的函数会让代码变得杂乱,增加程序开发的难度和系统出错的概率,降低系统出错的风险。 可维护性。

单一职责原则最常见的例子无疑是STL中迭代器的设计。 有些人认为容器和迭代器的分离是一个糟糕的设计。 他们觉得这样增加了复杂度,而且直接把迭代器放在容器里更简洁。 不过,很多人还是不这么认为,因为类越多,就越复杂。 另外,如果将迭代器放在容器中,会暴露出容器的一些内部结构,这也不符合封装的思想。 还有可扩展性的问题,因为访问和遍历容器会有各种需求。 如果把迭代器隔离出来,就不需要修改容器类,然后定义一些特殊的迭代器,所以不管有什么奇怪的只要需要自己写一个对应的迭代器就出来了。

2. 开放与封闭原则(Open,OCP)

开闭原则指的是开闭原则,即对扩展开放,对修改封闭。

所谓修改和关闭,是指以前设计的类不应该被修改。 例如,删除成员函数、更改成员函数的形参列表、更改数据成员类型等。实现修改闭包的关键在于抽象。 抽象一个事物本质上就是对一个事物进行概括、概括、总结,用类来抽象地表达它的本质特征,这样类就会相对稳定,不需要改变。

所谓扩展性和开放性,是指在不改变现有类的情况下,可以增加很多功能。 一般是通过继承和多态来实现的。 这样父类就可以保持原样,只需要在子类中添加一些需要的新功能。

“需求总是在变化。” 如果遵循开放性和封闭性的原则,合理的设计可以封闭变化,从而使类可以灵活地扩展所需的功能。

3.里氏替换原理( ,LSP)

替换原则是指子类可以替换父类,并且出现在父类能出现的任何地方。 这个原则是在1987年提出的,也可以源自Meyer的DBC(by, by )的概念。

C++语言机制在继承的基础上建立了类抽象和多态性,其实现方式是面向接口编程:通过抽取纯虚类(Class),将公共部分抽象为基类接口或由子类覆盖基类方法达到多态的目的。 替换原则的作用是保证继承重用的可靠性。

这是违反替代原则的一个特殊示例:

正方形和长方形的问题也属于“圆不是椭圆”类型的问题。 我们知道正方形是一种特殊的矩形,所以我们可以设计两个类,正方形类继承自矩形类。 矩形类有两个成员变量,分别代表长度和宽度,以及一个计算面积的成员函数。 如果计算面积的方法为Yes,这样就可以实现多态。 先设置长宽后调用计算面积的方法。 我们知道,正方形的长和宽是相等的。 如果设置长和宽不同,然后调用正方形的面积计算公式,肯定是错误的。 你可能会问为什么这么废话,为什么要设置长度和宽度不同。 很多设计思路和方法都是为了方便,其次是为了用户少犯错误,也就是无论怎么使用都不会出错。 如果你犯了错误,你应该在编译时犯错误,并将其放在运行时。 如果发生上述情况,编译器无法让您知道出现了问题。

所以继承矩形类的正方形类的设计是不好的(注意,如果你违反了替换原则,并不是说你写的代码会出错,而是说这个设计不合理。事实上,你可能这样设计代码,正常运行是很好的,如果没有特殊情况,可能根本没有bug,只是设计不合理导致一些安全隐患)。

4. 依赖倒置原则(DIP)

它的核心思想是:依靠抽象。 具体来说,高层模块不依赖于低层模块,低层模块都依赖于抽象; 抽象不依赖于具体,具体又依赖于抽象。 依赖倒置原则是对传统过程式设计方法的“倒置”,是高层模块重用和可维护性的有效规范。

类与类、模块与模块之间必须存在依赖关系。 当类之间存在依赖时,对依赖倒置原理的理解可以这样描述:依赖就是一开始具体细节之间的相互依赖,我们将实现细节变成抽象类,以降低类之间的耦合程度。 然后是一个抽象类,继承它的实现类也依赖于它。 倒立这个词怎么理解? 一般我们都是先关注细节,然后根据细节抽象出一些通用的方法。 所以按照常理来说,抽象取决于细节,但现在却反过来了,确定了一个抽象类。 最后,这些细节的实现可以基于抽象的方法,细节变得依赖于抽象。 否则,如果你继承了一个抽象类,如果你没有完全实现它的方法,你将不被允许实例化该对象。

当两个模块之间存在紧耦合关系时,最好的办法就是接口和实现分离:在依赖关系之间定义一个抽象接口供高层模块调用,底层模块实现接口的定义,从而有效控制耦合关系,达到依赖抽象的设计目标。

依赖抽象并不是针对实现进行编程,而是针对接口进行编程。 依赖抽象是一般原则,有时也难免依赖细节。 我们需要根据具体情况来选择抽象和具体。

5.接口分离原则(、ISP)

这一原则的核心思想是:使用多个小型专用接口,而不是使用一个大型通用接口。 具体来说,接口应该具有内聚性,并且应该避免“胖”接口。 一个类对另一个类的依赖应该基于最小的接口,不要强迫它依赖不同的方法,这是一种接口污染。

其实简单来说,和上面提到的单一责任类似。 这里的接口不是函数接口,而是类。 C#中有特殊的接口,与类区别开来,而C#并不像C++那样支持类的多重继承,而只支持接口的多重继承,所以这里的接口可以理解为更小更特殊的类,一个接口也许只是几个方法就OK了。

接口分离的方法主要有两种:

(1)使用委托来分离接口;

(2)使用多重继承来分隔接口。

六、总结

简而言之,面向对象的设计原则仍然是面向对象思想的体现。 例如,

(1)单一职责原则要求一个类只负责一件事。 接口分离的原则让客户只关心自己需要的接口。 单一责任、接口分离的原则本来就体现了内聚的思想;

(2)开放闭包原则要求类可以不需修改而扩展,这就体现了类的封装性和继承性;

(3)替换原则,要求派生类能够替换基类,是对类继承的规范;

(4)依赖倒置原则要求类依赖于抽象而不是实现,这是抽象思维的体现。

以上五个面向对象的设计原则可以帮助我们设计出代码易于重用、功能易于扩展、操作易于维护的程序,这是我们在实践中需要遵循的。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON