软件设计七大原则(上)

1.开闭原则

1.开闭原则的定义
        开闭原则(Open Closed Principle,OCP)由勃兰特梅耶(Bertrand Meyer)提出,他在1988年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。

这里的软件实体包括以下几个部分:

  • 项目中划分出的模块;
  • 类与接口;
  • 方法。

开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块功能,使其满足新的需求。

2.开闭原则的作用
        开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适用性和灵活性的同时具备稳定性和延续性。具体来说,作用如下:
(1)对软件测试的影响
        软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
(2)可以提高代码的可复用性
        粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
(3)可以提高软件的可维护性
        遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
3.开闭原则的实现方法
        可以通过“抽象约束、封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。
        因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

2.里氏替换原则——面向对象设计原则

1.里氏替换原则的定义
        里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在1987年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立。
        里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原则是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
2.里氏替换原则的作用

  • 里氏替换原则是实现开闭原则的重要方式之一;
  • 它克服了继承中重写父类造成的可复用性变差的缺点;
  • 它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性;
  • 加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性、降低需求变更时引入的风险。

3.里氏替换原则的实现方法
        里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。 也就是说子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类中的方法。
        根据上述理解,对里氏替换原则的定义可以总结如下:

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;
  • 子类中可以增加自己特有的方法;
  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松;
  • 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(及方法的输出/返回值)要比父类的更严格或相等。

        通过重写父类的方法来完成新的功能写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。
        如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方会出现运行错误。这时其修正方法是:取消原来的继承关系,重新设计它们之间的关系。

3.依赖倒置原则——面向对象设计原则

1.依赖倒置原则的定义
        依赖倒置原则(Dependence Inversion Principle,DIP) 是Object Mentor公司总裁罗伯特马丁(Robert C.Martin)于1996年在C++ Report上发表的文章。
        依赖倒置原则的原始定义为:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。
        依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。
        由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定的多。这里的抽象指的是接口或者抽象类,而细节指的是具体的实现类。
        使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给它们的实现类去完成。
2.依赖倒置原则的作用

  • 依赖倒置原则可以降低类间的耦合性;
  • 依赖倒置原则可以提高系统的稳定性;
  • 依赖倒置原则可以减少并行开发引起的风险;
  • 依赖倒置原则可以提高代码的可读性和可维护性。

3.依赖倒置原则的实现方法
        依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下四点,就能在项目中满足这个规则:

  • 每个类尽量提供接口或抽象类,或者两者都具备;
  • 变量的声明类型尽量是接口或者抽象类;
  • 任何类都不应该从具体类派生;
  • 使用继承时尽量遵循里氏替换原则。

4.单一职责原则——面向对象设计原则

1.单一职责原则的定义
        单一职责原则(Single Responsibility Principle,SRP) 又称单一功能原则,由罗伯特C.马丁(Robert C.Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。
        该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:

  • 一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;
  • 当客户端需要该对象的某一职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。

2.单一职责原则的优点
        单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点:

  • 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
  • 提高类的可读性。复杂度降低,自然其可读性会提高;
  • 提高系统的可维护性。可读性提高,那自然更容易维护了;
  • 变更引起的风险降低。变更时必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。

3.单一职责原则的实现方式
        单一职责原则是最简单但又最难运用的原则,需要开发人员发现类的不同职责并将其分离,再封装到不同的类或模块中。而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值