在软件开发中,为了提⾼软件系统的可维护性和可复⽤性,增加软件的可扩展性和灵活性,程序员要尽量根据 6条原则 来开发程序,从⽽提⾼软件开发效率、节约软件开发成本和维护成本。这里我主要介绍三个原则;
一、开闭原则
对扩展开放,对修改关闭。在程序需要进⾏拓展的时候,不能去修改原有的代码,实现⼀个热插拔的效果。简⾔之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使⽤接⼝和抽象类。因为抽象灵活性好,适应性⼴,只要抽象的合理,可以基本保持软件架构的稳定。⽽软件中易变的细节可以从抽象派⽣来的实现类来进⾏扩展,当软件需要发⽣变化时,只需要根据需求重新派⽣⼀个实现类来扩展就可以了。
二、⾥⽒代换原则
⾥⽒代换原则是⾯向对象设计的基本原则之⼀。
⾥⽒代换原则:任何基类可以出现的地⽅,⼦类⼀定可以出现。通俗理解:⼦类可以扩展⽗类的功能,但不能改变⽗类原有的功能。换句话说,⼦类继承⽗类时,除添加新的⽅法完成新增功能外,尽量不要重写⽗类的⽅法。
如果通过重写⽗类的⽅法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复⽤性会⽐较差,特别是运⽤多态⽐较频繁时,程序运⾏出错的概率会⾮常⼤。
三、依赖倒转原则
⾼层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进⾏编程,不要对实现进⾏编程,这样就降低了客户与实现模块间的耦合。
下⾯看⼀个例⼦来理解依赖倒转原则
创建cpu接⼝
public interface Cpu {
//运⾏cpu
public void run();
}
创建IntelCpu类
public class IntelCpu implements Cpu {
public void run() {
System.out.println("使⽤Intel处理器");
}
}
创建HardDisk接⼝
public interface HardDisk {
//存储数据
public void save(String data);
//获取数据
public String get();
}
创建内存条接⼝
public interface Memory {
public void save();
}
创建KingstonMemory类
public class KingstonMemory implements Memory {
public void save() {
System.out.println("使⽤⾦⼠顿内存条");
}
}
创建Computer)类
public class Computer {
private HardDisk hardDisk;
private Cpu cpu;
private Memory memory;
public HardDisk getHardDisk() {
return hardDisk;
}
public void setHardDisk(HardDisk hardDisk) {
this.hardDisk = hardDisk;
}
public Cpu getCpu() {
return cpu;
}
public void setCpu(Cpu cpu) {
this.cpu = cpu;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
//运⾏计算机
public void run() {
System.out.println("运⾏计算机");
String data = hardDisk.get();
System.out.println("从硬盘上获取的数据是:" + data);
cpu.run();
memory.save();
}
}
测试类
public class ComputerDemo {
public static void main(String[] args) {
//创建计算机的组件对象
HardDisk hardDisk = new XiJieHardDisk(); //使⽤希捷硬盘
Cpu cpu = new IntelCpu(); //使⽤英特尔CPU
Memory memory = new KingstonMemory(); //使⽤⾦⼠顿内存
//创建计算机对象
Computer c = new Computer();
//组装计算机
c.setCpu(cpu); //设置CPU
c.setHardDisk(hardDisk); //设置硬盘
c.setMemory(memory); //设置内存
//运⾏计算机
c.run();
}
}
⾯向对象的开发很好的解决了这个问题,⼀般情况下抽象的变化概率很⼩,让⽤户程序依赖于抽象,实
现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这⼤⼤降低了客户程序与实现细节的耦合度。
总结
软件设计的三大原则是面向对象设计中非常重要的概念,它们分别是:里氏代换原则、依赖倒转原则和开闭原则。这些原则旨在提高软件的灵活性、可维护性和可扩展性。
里氏代换原则(Liskov Substitution Principle, LSP) 里氏代换原则是由芭芭拉·里斯科夫(Barbara Liskov)提出的,它要求对象之间的替换必须是安全的。换句话说,任何一个基类对象替换子类对象,程序的行为都不应该有任何异常。子类应该能够透明地替换基类,而不会引起程序错误。这个原则鼓励设计者写出能够被子类化的基类,并且避免在基类中使用那些在子类中不可能实现的操作。
依赖倒转原则(Dependency Inversion Principle, DIP) 依赖倒转原则是由罗伯特·C·马丁(Robert C. Martin)提出的,它说的是高层模块不应该依赖于低层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这意味着在设计软件时,应该尽量减少模块之间的直接依赖关系,通过接口或抽象类来建立依赖关系,从而使系统的模块更加独立,易于理解和维护。
开闭原则(Open/Closed Principle, OCP) 开闭原则是由伯特兰· Meyer 提出的,它强调软件实体(类、模块、函数等)应该对扩展开放,但对修改封闭。也就是说,软件实体应该能够在不修改原有代码的基础上进行扩展。这可以通过抽象和封装来实现,使得软件能够适应新的需求变化,提高其灵活性和可维护性。
总的来说,这三大原则是面向对象设计中不可或缺的部分,它们帮助软件工程师创建出更加灵活、可维护和可扩展的软件系统。在软件开发过程中,遵循这些原则能够减少代码的复杂度,提高代码的质量。