1. DRY
这是指不写重复的代码,取而代之是使用抽象共性的东西。如果超过一次使用硬编码,那么就要考虑将其公开为final修饰的不变量;如果你在两个以上地方有相同的代码块,那么就要考虑使其成为一个单独的方法。SOLID设计原理的好处是在维护。值得注意的是重复的不是指代码,而是对于功能而言的。
示例:硬编码字符串处理
修改前
public class BeforeRefactor {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
修改后
public class AfterRefactor {
public static void main(String[] args) {
System.out.println(DemoConstant.HELLO_WORLD);
}
}
public class DemoConstant{
public static final String HELLO_WORLD = "Hello World";
}
2.封装变化
在软件领域唯一不变的就是“变”,所以封装那些你估计在未来可能被改变的代码。这种设计的好处是容易测试和易于维护。如果你是进行Java编码,那么就要使变量和方法变成私有。有几个Java设计模式采用封装,工厂设计模式封装的是对象创建代码,并提供了在不改变现有的代码情况下推出新产品的灵活性。
示例:封装日志的变化
3.开闭原则
开放利用了抽象,而闭合则是利用了封装。
类,方法或函数应该对扩展开放(新功能)和对修改关闭。这又是一个漂亮的面向对象的设计原则,防止对已经测试过的代码尝试修改。
示例:排序算法的开闭原则
修改前:违反开闭原则
修改后:遵循开闭原则
4.单一职责
不应该有超过一个理由去修改类,因为一个类只能有一个职责功能,如果你将多于一个功能增加到一个类中,相当于在两个功能之间引入了紧耦合。
5.依赖注入或反转控制
不要主动要求依赖,因为它已经由框架提供给你。比如Spring框架等,这样的设计原则妙处在于,它是由DI注入框架的注入匹配需要的类,这样更容易进行测试维护,因为创建对象的代码都集中在框架,而客户端代码是不参与的。
示例
6. 组合胜过于继承
如果可能的话组合composition总是胜过继承。组合比继承拥有更多的灵活性。组合允许在运行时设置属性,并通过使用接口来实现,我们可以使用多态在类运行时改变类的行为,从而提供更好的接口实现。
7. LSP原则
根据里氏替换原则,子类型必须是可替代超类型,即方法或函数,它使用超类的类型必须能够与子类的对象时一样没有任何问题,如果一个类比子类有更多的功能,而子类可能不支持某些功能,这没有违反LSP。为了遵循LSP的设计原理,派生类或子类必须是增强功能不是减少它。
示例:鲸鱼和鱼的关系
8.接口分离原则ISP
接口隔离原则要求:客户端不应该实现它不使用的接口。当一个接口包含一个以上的功能而客户端只需要一个功能时容易出现这种情况,因为一旦你释放你的接口,你就不能改变它。
示例
9. 面向接口而不是实现编程
面向接口编程而不是面向实现子类,这有灵活性的好处,特别是同样接口有不同实现子类时。典型的模式MVC中的spring就是面向接口的编程。
10.委托原则
不要自己做所有的事情,可以委托给相应的类去完成。