文章目录
参考资料
参考资料:视频资料
面向对象设计,Object Oriented Design,简称OOD。
在进行软件开发时,需要考虑项目的可维护性和可复用性,开发项目一般是由一个开发团队来维护,因此我们在编写代码时,应可能规范,防止项目出现越来越多的BUG。
一、单一职责原则 SRP
参考资料:查看文档
单一职责原则, Single Responsibility Principle 又称单一功能原则,是最简单的面向对象设计原则,用于控制类的粒度大小。
出自《敏捷软件开发:原则、模式与实践》 Robert C. Martin
一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中
例:用类描述人们的会做的事情
- 反例:违背 SRP 单一职责原则
public class People{
// 程序员: 敲代码
public void coding(){
}
// 飞行员: 驾驶飞机
public void pilot(){
}
}
类中出现了范围偏多的敲代码和驾驶飞机,实际上,生活中很少有人同时具备这两项技能,故根据 SRP 原则,上述的类应变更为:
- 正例:符合 SRP 原则
// 程序员
class Programmer{
public void coding(){
}
}
// 飞行员
class Piloter{
public void pilot(){
}
}
总结:SRP 单一职责原则 要求在设计类的时候,里面的方法或属性是同一类的,颗粒度尽可能小的。
二、开闭原则 OCP
参考资料:查看文档
开闭原则,Open Close Principle,OCP 原则规定软件中的对象(类、模块、函数等)应对扩展开放,对修改关闭。
出自:《面向对象软件构造》
软件对扩展(提供方)开放,对修改(调用方)关闭
正例:用类描述不同编程语言领域的程序员
public abstract class Programmer{
public abstract void Codding();
}
// Java程序员
class JavaProgrammer extends Programmer{
@Override
public void coding(){
}
}
// Python 程序员
class PythonProgrammer extends Programmer{
@Override
public void coding(){
}
}
// C++语言程序员
class CppProgrammer extends Programmer{
@Override
public void coding(){
}
}
通过提供一个 Programmer 抽象类,定义出编程的抽象行为,这样给其他具体类型的程序员来实现,这样就可以根据不同的业务进行灵活扩展,具有更好的扩展性。除了抽象类,更多的则是使用接口和接口实现类来遵循OCP原则
三、里氏替换原则 LSP
参考资料:查看文档
里氏替换原则,Liskov Substitution Principle,LSP 原则是对子类型的特别定义。
出自:演讲《数据的抽象与层次》 Barbara Liskov
所有引用基类的地方必须能透明的使用其子类的对象
简单来说,子类可以扩展父类的功能,但不能改变父类原有的功能:
- 子类可以实现父类的抽象方法,但不能覆盖父类原有的功能
- 子类可以增加自己持有的方法
- 子类重载父类方法时,方法的前置条件(即方法的入参)要比父类的该方法入参更宽松
- 子类实现父类方法时,(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或与父类一样
例: 描述一个Java程序员会做的事情
反例:违背 LSP 原则
public abstract class Programmer{
public void coding()