码迷,mamicode.com
首页 > 其他好文 > 详细

软件设计原则

时间:2019-05-29 22:05:40      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:独立   朋友   改进   专用   modules   不可变类   子类   异常   面向接口编程   

1. 开闭原则

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

具体含义

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

一般实现

通过接口与抽象类提供较为稳定的中间层,编程过程中应该面向接口,而不是面向实现编程。

2.里氏转换原则

继承必须确保超类所拥有的性质在子类中仍然成立

具体含义

子类不应该改变父类的行为。

一般实现

abstract class Bird {
    public abstract int FlySpeed();
    
}
class Kiwi:Bird{
    public override int FlySpeed(){
        return 0;
    }
}
//...
void Main(){
    Bird kiwi = new Kiwi();
    Console.WriteLine("Kiwi飞行{0}公里,需要{1}小时",30,30/bird.FlySpeed());
}

很明显,这段代码将会抛异常,原因在于我们考虑Brid时并没有考虑到它不会飞的情况。

改进方案:

abstract class Animal{
    public abstract int WalkSpeed();
}
abstract class Bird : Animal{
    public abstract int FlySpeed();
    
}
class Kiwi : Animal{
    public override int WalkSpeed(){
        return 10;
    }
}
class Swallow : Bird{
    public override int WalkSpeed(){
        return 2;
    }
    public override int FlySpeed(){
        return 15;
    }
}
//...
void Main(){
    Animal kiwi = new Kiwi();
    Animal swallow = new Swallow();
    Console.WriteLine("Kiwi行走{0}公里,需要{1}小时",30,30/kiwi.WalkSpeed());
    Console.WriteLine("燕子行走{0}需要{1}小时",30,30/swallow.WalkSpeed());
}

添加BirdKiwi的共同基类,调用WalkSpeed方法,此方法是动物所共有的。

3. 依赖倒置原则

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。

具体含义

其核心思想是:要面向接口编程,不要面向实现编程

一般实现

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

4.单一责任原则

单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分

具体含义

一个类(方法)不应该承担过多的功能。

一般实现

大学学生工作管理程序。

分析:大学学生工作主要包括学生生活辅导和学生学业指导两个方面的工作,其中生活辅导主要包括班委建设、出勤统计、心理辅导、费用催缴、班级管理等工作,学业指导主要包括专业引导、学习辅导、科研指导、学习总结等工作。如果将这些工作交给一位老师负责显然不合理,正确的做 法是生活辅导由辅导员负责,学业指导由学业导师负责,其类图如图 1 所示。

技术图片

5. 接口隔离原则

要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法

具体含义

要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

注意事项

接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:

  • 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
  • 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

一般实现

设计学生管理类,需要实现的功能有插入成绩、修改成绩、计算总分、计算均分、打印成绩

技术图片

6.迪米特法则

如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

具体含义

当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。

一般实现

从迪米特法则的定义和特点可知,它强调以下两点:

  1. 从依赖者的角度来说,只依赖应该依赖的对象。
  2. 从被依赖者的角度说,只暴露应该暴露的方法。

注意:

  1. 创建弱耦合类,提高复用
  2. 降低访问权限
  3. 优先考虑不可变类
  4. 尽量不要引用其他类的对象
  5. 不要暴露字段,而是提供访问器
  6. 谨慎使用序列化

分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图 1 所示。

技术图片

7.聚合复用原则

它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。

具体含义

优先考虑组合而不是继承,使用继承时,严格遵循里氏转换原则

软件设计原则

标签:独立   朋友   改进   专用   modules   不可变类   子类   异常   面向接口编程   

原文地址:https://www.cnblogs.com/ywxt/p/10946491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!