标签:独立 朋友 改进 专用 modules 不可变类 子类 异常 面向接口编程
开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。
当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。
通过接口与抽象类提供较为稳定的中间层,编程过程中应该面向接口,而不是面向实现编程。
继承必须确保超类所拥有的性质在子类中仍然成立
子类不应该改变父类的行为。
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());
}
添加Bird
和Kiwi
的共同基类,调用WalkSpeed
方法,此方法是动物所共有的。
高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(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 所示。
要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法
要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
设计学生管理类,需要实现的功能有插入成绩、修改成绩、计算总分、计算均分、打印成绩
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
从迪米特法则的定义和特点可知,它强调以下两点:
注意:
分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,其类图如图 1 所示。
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
优先考虑组合而不是继承,使用继承时,严格遵循里氏转换原则
标签:独立 朋友 改进 专用 modules 不可变类 子类 异常 面向接口编程
原文地址:https://www.cnblogs.com/ywxt/p/10946491.html