欢迎光临散文网 会员登陆 & 注册

设计原则(一)

2023-07-21 10:12 作者:香草味的lollipop  | 我要投稿

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

    • 定义:应该有且只有一个引起类变更的原因=>一个类,只能做一件事

    • 好处:

        1. 提高了代码的可读性,提高系统的可维护性

        2. 降低类的复杂度,一个模块只负责一个职责,提高系统的可扩展性和可维护性

        3. 降低类变更引起的风险,变更是必然的,如果单一职责做的好,当修改一个功能的时候可以显著的降低对另一个功能的影响

二. 开放封闭原则(Open Closed Principle)

    ○ 开放封闭原则是面向对象所有原则的核心

    ○ 对功能开放,面向修改代码封闭

    ○ 需求改变时,在不改变软件实体源代码(类、接口、方法等)的前提下,通过扩展功能,使其满足新的需求

    ○ 面向抽象编程:使用抽象,封装变化

三. 依赖倒置原则(Dependency Inversion Principle)

    ○ 开放封闭原则是面向对象设计的终极目标,而依赖倒置原则 是实现开放封闭原则的基础

    1. 高层模块(调用者)不应该依赖于低层模块(被调用者),两个都应该依赖于抽象

    2. 抽象不应该依赖于细节,细节应该依赖于抽象

    3. 依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,互不影响,实现模块间的松耦合

    ○ 面向接口编程,不要面向实现编程

4. 关于依赖

    i. 一个优秀的面向对象程序设计,核心原则之一就是将变化【隔离】/【封装】

    ii. 为了实现这个目的,需要面向接口编程,使用后,客户类,不再直接依赖于服务类,而是依赖一个抽象的接口,这样,客户类就不能在内部直接实例化服务类

    iii. 但是在客户类运行的过程中,又需要具体的服务类来提供服务,因为接口是不能被实例化的,就产生了一个矛盾:客户类不允许实例化服务类,但是客户类又需要服务类的服务

    iv. 为了解决这个矛盾,我们设计了一种解决方案,即:客户类定义一个注入点,用于服务类的注入,而客户类的客户类(Program类),负责根据具体情况,实例化服务类,注入到客户类中,从而解决了这个矛盾

5. 依赖注入的方式

    i. 通过接口传递(接口注入)

    ii. 通过构造函数传递

    iii. 通过属性的set方法传递

四. 里氏替换原则(Liskov Substitution principle)

    ○ 所有引用父类对象的地方,都可以使用其子类代替

    ○ 如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象

五. 接口隔离原则(Interface Segragation Principle)——设计接口时采用的指导思想

    1. 客户端不应该依赖它不需要的接口

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

    3. 接口尽量细分,不要在一个接口中放很多方法

    4. 接口隔离原则和单一职责原则的关系

        § 单一职责:一个类干一件事  //影响类变化的原因只有一个      高内聚(模块内部元素的相似程度高)

        § 接口隔离:// 低耦合  模块之间的依赖程度较低

    5. 根据接口隔离原则拆分接口时,首先必须满足单一职责原则

六. 迪米特原则(Law of Demeter)(最小知识原则(The Least Knowledge Principle))——设计类的时候采用的指导思想

    1. 要求一个对象应该对其它对象有最少的了解(最小知识原则)

    2. 降低类之间的耦合

    3. 迪米特原则实际上就是一个类在创建方法和属性时要遵守的法则

    4. 只和直接朋友通信!

    i. 成员对象

    ii. 方法参数

    iii. 方法返回值

    iv. 注意:出现在局部变量中的类,不是直接朋友

七. 合成复用原则(Composite Reuse Principle)

    ○ 合成复用原则,又称组合/聚合复用原则

    ○ 尽量使用对象组合,而不是继承来达到复用

    ○ 合成复用原则是将已有的对象纳入到新对象中,作为新对象的对象成员来实现的,新对象可以调用已有对象的功能,从而达到复用

    ○ 继承的“bug”

        § 破坏了系统的封装性,基类如果发生了改变,子类的实现也会发生改变

        § 子类如果不需要父类中新添加的方法,则系统耦合度会变高

        § 继承是静态的,不能在程序运行时发生改变

    ○ has-a关系 使用合成复用

    ○ is-a关系    使用继承


设计原则(一)的评论 (共 条)

分享到微博请遵守国家法律