软件开发:面向对象设计的七大原则!

这篇具有很好参考价值的文章主要介绍了软件开发:面向对象设计的七大原则!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

七大原则

开闭原则、里氏代换原则、迪米特原则(最少知道原则)、单一职责原则、接口分隔原则、依赖倒置原则、组合/聚合复用原则。

软件开发:面向对象设计的七大原则!

开闭原则(The Open-Closed Principle ,OCP)

开闭原则:软件实体(模块,类,方法等)应该对扩展开放,对修改关闭。

概念理解

开闭原则是指在进行面向对象设计中,设计类或其他程序单位时,应该遵循:

(1)对扩展开放(open)

(2)对修改关闭(closed) 的设计原则。

开闭原则是判断面向对象设计是否正确的最基本的原理之一。

根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。

扩展开放:某模块的功能是可扩展的,则该模块是扩展开放的。软件系统的功能上的可扩展性要求模块是扩展开放的。

修改关闭:某模块被其他模块调用,如果该模块的源代码不允许修改,则该模块修改关闭的。软件系统的功能上的稳定性,持续性要求模块是修改关闭的。

开闭原则的实现方法

为了满足开闭原则的对修改关闭原则以及扩展开放原则,应该对软件系统中的不变的部分加以抽象,在面向对象的设计中,

(1)可以把这些不变的部分加以抽象成不变的接口,这些不变的接口可以应对未来的扩展;

(2)接口的最小功能设计原则。根据这个原则,原有的接口要么可以应对未来的扩展;不足的部分可以通过定义新的接口来实现;

(3)模块之间的调用通过抽象接口进行,这样即使实现层发生变化,也无需修改调用方的代码。

接口可以被复用,但接口的实现却不一定能被复用。

接口是稳定的,关闭的,但接口的实现是可变的,开放的。

可以通过对接口的不同实现以及类的继承行为等为系统增加新的或改变系统原来的功能,实现软件系统的柔性扩展。

好处:提高系统的可复用性和可维护性。

简单地说,软件系统是否有良好的接口(抽象)设计是判断软件系统是否满足开闭原则的一种重要的判断基准。现在多把开闭原则等同于面向接口的软件设计。

开闭原则的相对性

软件系统的构建是一个需要不断重构的过程,在这个过程中,模块的功能抽象,模块与模块间的关系,都不会从一开始就非常清晰明了,所以构建100%满足开闭原则的软件系统是相当困难的,这就是开闭原则的相对性。

但在设计过程中,通过对模块功能的抽象(接口定义),模块之间的关系的抽象(通过接口调用),抽象与实现的分离(面向接口的程序设计)等,可以尽量接近满足开闭原则。

软件开发:面向对象设计的七大原则!

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

只有满足以下2个条件的OO设计才可被认为是满足了LSP原则:

(1)不应该在代码中出现if/else之类对派生类类型进行判断的条件。

(2)派生类应当可以替换基类并出现在基类能够出现的任何地方,或者说如果我们把代码中使用基类的地方用它的派生类所代替,代码还能正常工作。

里氏替换原则(LSP)是使代码符合开闭原则的一个重要保证。

LSP体现

类的继承原则:如果一个派生类的对象可能会在基类出现的地方出现运行错误,则该派生类不应该从该基类继承,或者说,应该重新设计它们之间的关系。

动作正确性保证:从另一个侧面上保证了符合LSP设计原则的类的扩展不会给已有的系统引入新的错误。

里式替换原则的引申意义

子类可以扩展父类的功能,但不能改变父类原有的功能。

子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

子类中可以增加自己特有的方法。

当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。

当子类的方法实现父类的方法时(重载/重写或实现抽象方法)的后置条件(即方法的输出/返回值)要比父类更严格或相等。

里式替换原则的优点

约束继承泛滥,是开闭原则的一种体现。

加强程序的健壮性,同时变更时也可以做到非常好地提高程序的维护性、扩展性。降低需求变更时引入的风险。

软件开发:面向对象设计的七大原则!

迪米特原则(最少知道原则)(Law of Demeter ,LoD)

概念理解

对于面向OOD来说,又被解释为下面两种方式:

1)一个软件实体应当尽可能少地与其他实体发生相互作用。

2)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

朋友圈的确定

“朋友”条件:

1.当前对象本身(this)

2.以参量形式传入到当前对象方法中的对象

3.当前对象的实例变量直接引用的对象

4.当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友

5.当前对象所创建的对象

任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。

迪米特原则的优缺点

迪米特原则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。

迪米特原则不希望类直接建立直接的接触。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特原则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系,这在一定程度上增加了系统的复杂度。

软件开发:面向对象设计的七大原则!

单一职责原则

永远不要让一个类存在多个改变的理由。

换句话说,如果一个类需要改变,改变它的理由永远只有一个。如果存在多个改变它的理由,就需要重新设计该类。

单一职责原则原则的核心含意是:只能让一个类/接口/方法有且仅有一个职责。

为什么一个类不能有多于一个以上的职责?

如果一个类具有一个以上的职责,那么就会有多个不同的原因引起该类变化,而这种变化将影响到该类不同职责的使用者(不同用户):

一方面,如果一个职责使用了外部类库,则使用另外一个职责的用户却也不得不包含这个未被使用的外部类库。

另一方面,某个用户由于某个原因需要修改其中一个职责,另外一个职责的用户也将受到影响,他将不得不重新编译和配置。

这违反了设计的开闭原则,也不是我们所期望的。

软件开发:面向对象设计的七大原则!

接口分隔原则(Interface Segregation Principle ,ISP)

不能强迫用户去依赖那些他们不使用的接口。

概念理解

换句话说,使用多个专门的接口比使用单一的总接口总要好。

它包含了2层意思:

接口的设计原则:接口的设计应该遵循最小接口原则,不要把用户不使用的方法塞进同一个接口里。如果一个接口的方法没有被使用到,则说明该接口过胖,应该将其分割成几个功能专一的接口。

接口的依赖(继承)原则:如果一个接口a继承另一个接口b,则接口a相当于继承了接口b的方法,那么继承了接口b后的接口a也应该遵循上述原则:不应该包含用户不使用的方法。 反之,则说明接口a被b给污染了,应该重新设计它们的关系。

如果用户被迫依赖他们不使用的接口,当接口发生改变时,他们也不得不跟着改变。换而言之,一个用户依赖了未使用但被其他用户使用的接口,当其他用户修改该接口时,依赖该接口的所有用户都将受到影响。这显然违反了开闭原则,也不是我们所期望的。

指导意义

一个类对一个类的依赖应该建立在最小的接口上

建立单一接口,不要建立庞大臃肿的接口

尽量细化接口,接口中的方法尽量少

软件开发:面向对象设计的七大原则!

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

高层模块不应该依赖于低层模块,二者都应该依赖于抽象

抽象不应该依赖于细节,细节应该依赖于抽象 C.针对接口编程,不要针对实现编程。

概念理解

依赖:在程序设计中,如果一个模块a使用/调用了另一个模块b,我们称模块a依赖模块b。

高层模块与低层模块:往往在一个应用程序中,我们有一些低层次的类,这些类实现了一些基本的或初级的操作,我们称之为低层模块;另外有一些高层次的类,这些类封装了某些复杂的逻辑,并且依赖于低层次的类,这些类我们称之为高层模块。

依赖倒置(Dependency Inversion)

面向对象程序设计相对于面向过程(结构化)程序设计而言,依赖关系被倒置了。因为传统的结构化程序设计中,高层模块总是依赖于低层模块。

抽象接口是对低层模块的抽象,低层模块继承或实现该抽象接口。

这样,高层模块不直接依赖低层模块,而是依赖抽象接口层。抽象接口也不依赖低层模块的实现细节,而是低层模块依赖(继承或实现)抽象接口。

类与类之间都通过抽象接口层来建立关系。

软件开发:面向对象设计的七大原则!

组合/聚合复用原则(Composite/Aggregate Reuse Principle ,CARP)

尽量使用组合/聚合,不要使用类继承。

概念理解

即在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。就是说要尽量的使用合成和聚合,而不是继承关系达到复用的目的。

组合和聚合都是关联的特殊种类。

聚合表示整体和部分的关系,表示“拥有”。组合则是一种更强的“拥有”,部分和整体的生命周期一样。

组合的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个组合关系的成分对象是不能与另一个组合关系共享的。

组合是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。

在面向对象设计中,有两种基本的办法可以实现复用:第一种是通过组合/聚合,第二种就是通过继承。文章来源地址https://www.toymoban.com/news/detail-466016.html

到了这里,关于软件开发:面向对象设计的七大原则!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面向对象设计的六大原则(SOLID原则)-——单一职责原则

    单一职责原则(Single Responsibility Principle, SRP)是面向对象编程和设计的五大SOLID原则之一。它强调一个类、方法或模块应该只有一个职责,即只做一件事情。如果一个类承担的职责过多,那么它的可维护性、可读性和可扩展性都会受到影响。当需要修改类的某个职责时,可能

    2024年03月12日
    浏览(89)
  • 【设计模式】面向对象设计八大原则

    (1)依赖倒置原则(DIP) 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。 抽象(稳定)不应该依赖于变化),实现细节应该依赖于抽象(稳定)。 (2)开放封闭原则(OCP) 对扩展开放,对更改封闭。 类模块应该是可扩展的,但是不可

    2024年02月10日
    浏览(40)
  • 面向对象的设计原则

    设计模式:对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计 三大特性:封装、继承、多态 接口:若干抽象方法的集合 作用:限制实现接口的类必须按照接口给定的

    2024年02月10日
    浏览(39)
  • 【面向对象设计原则】SOLID

    描述 There should never be more than one reason for a class to change。仅有一种原因引起类的改变。一个类只负责一个职责 特点 一个类负责一个单一职责,避免职责上的交叉实现 保证面向接口实现 参考 SRP 描述 新需求来临时,通过新增类实现,而不是修改已有类 特点 开放:对于扩展开

    2024年02月08日
    浏览(51)
  • 面向对象设计的六大原则(SOLID原则)-——开闭原则

    开闭原则(Open-Closed Principle, OCP)是面向对象设计的五大SOLID原则之一。这个原则主张“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”。也就是说,软件的设计应该允许在不修改原有代码的情况下增加新的功能。这样的设计有助于降低代码的复杂性和维护成本

    2024年03月12日
    浏览(59)
  • 01_面向对象的设计原则

    参考资料: 视频 书籍 《设计模式:可复用面向对象软件的基础》 面对复杂问题如何解决? 分解:分而治之,大问题分解成小问题。 抽象:忽视非本质的细节,处理泛化和理想化的对象模型。 面向对象 从语言实现看,是代码和数据的封装 是一系列的公共接口 某种拥有责任

    2024年02月13日
    浏览(42)
  • 基于面向对象基础设计——里氏替换原则

    在Java中,支持抽象和多态的关键机制之一是继承。正是使用了继承,我们才可以创建实现父类中抽象方法的子类。那么,是什么规则在支配着这种特殊的继承用法呢?最佳的继承层次的特征又是什么呢?在什么情况下会使我们创建的类层次结构掉进不符合开闭原则的陷阱中呢

    2024年02月14日
    浏览(46)
  • 《设计模式的艺术》笔记 - 面向对象设计原则

    1、单一职责原则         一个类只负责单一功能领域中的相应职责。 2、开闭原则         一个软件实体应当对扩展开放,对修改关闭。即软件实体应当尽量在不修改原有代码的情况下进行扩展。 3、里氏代换原则         所有引用基类的地方必须能透明地使用其子类的对

    2024年01月21日
    浏览(57)
  • C++设计模式_02_面向对象设计原则

    变化是复用的天敌!面向对象设计或者说使用了抽象原则的面向对象设计最大的优势在于#

    2024年02月11日
    浏览(47)
  • 设计类的时候面向对象遵循的原则 SOLID

    S(single responsibility):单一职责 O(open closed):对扩展开放,对修改关闭(可以扩展,尽量不要修改) L(liskov substitution):里氏替换    任何时候都可以用子类替代父类(父类必须有所有子类的共性) I(interface segregation):接口分离  如果一个类包含了过多的接口方法,

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包