软件设计原则【三原则】



在软件开发中,为了提⾼软件系统的可维护性和可复⽤性,增加软件的可扩展性和灵活性,程序员要尽量根据 6条原则 来开发程序,从⽽提⾼软件开发效率、节约软件开发成本和维护成本。这里我主要介绍三个原则;

一、开闭原则

对扩展开放,对修改关闭。在程序需要进⾏拓展的时候,不能去修改原有的代码,实现⼀个热插拔的效果。简⾔之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使⽤接⼝和抽象类。因为抽象灵活性好,适应性⼴,只要抽象的合理,可以基本保持软件架构的稳定。⽽软件中易变的细节可以从抽象派⽣来的实现类来进⾏扩展,当软件需要发⽣变化时,只需要根据需求重新派⽣⼀个实现类来扩展就可以了。


二、⾥⽒代换原则

⾥⽒代换原则是⾯向对象设计的基本原则之⼀。
⾥⽒代换原则:任何基类可以出现的地⽅,⼦类⼀定可以出现。通俗理解:⼦类可以扩展⽗类的功能,但不能改变⽗类原有的功能。换句话说,⼦类继承⽗类时,除添加新的⽅法完成新增功能外,尽量不要重写⽗类的⽅法。
如果通过重写⽗类的⽅法来完成新的功能,这样写起来虽然简单,但是整个继承体系的可复⽤性会⽐较差,特别是运⽤多态⽐较频繁时,程序运⾏出错的概率会⾮常⼤。


三、依赖倒转原则

⾼层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。简单的说就是要求对抽象进⾏编程,不要对实现进⾏编程,这样就降低了客户与实现模块间的耦合。

下⾯看⼀个例⼦来理解依赖倒转原则
在这里插入图片描述

创建cpu接⼝
public interface Cpu {
 //运⾏cpu
 public void run();
}

创建IntelCpupublic 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();
}

创建KingstonMemorypublic 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 提出的,它强调软件实体(类、模块、函数等)应该对扩展开放,但对修改封闭。也就是说,软件实体应该能够在不修改原有代码的基础上进行扩展。这可以通过抽象和封装来实现,使得软件能够适应新的需求变化,提高其灵活性和可维护性。
总的来说,这三大原则是面向对象设计中不可或缺的部分,它们帮助软件工程师创建出更加灵活、可维护和可扩展的软件系统。在软件开发过程中,遵循这些原则能够减少代码的复杂度,提高代码的质量。

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值