软件设计思想以及面向对象的设计原则

软件设计思想以及面向对象的设计原则

    概要

    在日常开发中,如果要评判代码的质量如何,我们是不是需要有一种标准?

    相信大家都听说过“高内聚,低耦合”,即类的内聚性是不是很高,耦合度是不是很低。这一原则可以作为我们评判软件设计的好坏。

    通俗的说,我们就需要尽量让写出的程序易于维护,减少程序与程序之间的复杂性、耦合度。其目的就是为了让对象A和其依赖的其他对象解耦,减少二者的依赖。即通过“注入”的方式去解决依赖问题。

    下面介绍一些软件设计的思想以及面向对象设计的原则。在日常开发中,如果对这些知识能够熟练掌握并且灵活运用,就能写出更优质的代码。

    一、软件设计思想

    1.  控制反转( Inversion of Control,简称 IOC)

    从字面上可以理解为对xx的控制进行了一个反转,换句话说就是对xx的控制的另一种实现,是一种思路,一种逻辑思想。这个很容易理解。既然是一种思路,那总有一种解决方案可以实现吧。这就是我们接下来要介绍的依赖注入。

    2. 依赖注入(Dependency Injection,简称 DI)

    依赖注入是 IOC 的一种典型实现简单的说,依赖注入就是把对象A所依赖的其他对象B、对称C之类的,以属性或者构造函数的方式传递到对象A的内部,而不是直接在对象A内实例化。

    其目的就是为了让对象A和其依赖的其他对象解耦,减少二者的依赖。即通过“注入”的方式去解决依赖问题

   二、面向对象的五个基本原则(SOLID)

    1.  单一职责原则(Single Responsibility Principle,SRP)

    定义:一个类应该只有一个引起变化的原因

    换句话说,一个类应该只有一个责任。这有助于降低类的复杂性,并使其更容易理解和维护。

   2.  开闭原则(Open/Closed Principle,OCP)

   定义:要求软件实体(类、模块、函数等)应该对扩展是开放的,但对修改是封闭的。这意味着在添加新功能时,不应该修改现有代码,而是通过扩展现有代码来实现。

   3.  里氏替换原则(Liskov Substitution Principle,LSP)

   定义:子类型必须能够替换掉他们的父类型

   分析:子类拥有父类所有非 private 的行为和属性,正因为有了里氏替换原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。正是由于子类的可替换性才使得父类类型的模块在无需修改的情况下就可以扩展。

   4. 接口隔离原则(Interface Segregation Principle,ISP)

   一个类不应该被强迫实现它不使用的接口。这意味着一个类应该只实现它需要的接口,而不是实现一些不相关的接口。

   5.  依赖倒置原则(Dependency Inversion Principle,DIP)

   定义:高层模块不应该依赖于低层模块,两者都应该依赖于抽象。同时,抽象不应该依赖于具体实现,具体实现应该依赖于抽象。这有助于减少系统的耦合

   理解:

   1)高层模块不应该依赖于底层模块,两者都应该依赖于抽象。

   说明: 这意味着高层模块(上层代码)和底层模块(下层代码)都应该依赖于共同的抽象接口而不是具体的实现细节。通过共享抽象,可以确保高层和底层之间的松耦合,使系统更加灵活和可扩展。

   2)抽象不应该依赖于具体,具体应该依赖于抽象。

   说明:这一点强调的是抽象接口应该是稳定的,而具体的实现可以根据需要进行变化。具体的实现应该遵循抽象定义的接口,而不是反过来。这保证了系统的稳定性和可维护性。

   在传统软件设计中,高层代码依赖于下层代码,当低层出现变动时, 高层代码也要相应变化,维护成本较高。

   DIP的的核心思想是高层定义接口,低层实现这个接口, 从而使得低层依赖于高层,实现模块之间的松耦合,提高系统的可维护性、可扩展性和可复用性。通过引入抽象层,高层模块不需要关心底层模块的具体实现细节,只需要依赖于抽象接口。这样,当底层模块发生变化时,高层模块不受影响,只需要保持对抽象的依赖关系

   三、其他面向对象设计的原则

   1.  迪米特原则(Law of Demeter,也叫最少知道原则)

   定义: 如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

   分析:迪米特原则强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。

 

     参考链接:http://www.manks.top/yii2-analysis-dependency-injection-principle-inversion-of-control.html

posted @ 2024-02-04 16:17  欢乐豆123  阅读(14)  评论(0编辑  收藏  举报