架构师训练营第二周总结

用户头像
毛叫
关注
发布于: 2020 年 06 月 17 日

对于SOLID设计原则的总结

Single Responsibility Principle

单一职责原则,即一个类的功能做的事应该尽可能的少. 它的功能和实现可能是复杂的,但就职责而言应该是简单的. 有的说法是,一个类应该有且只有一个原因使它改变.

从后者的角度,按照单一职责设计的类,在面对频繁的改变的变更的时候会更好维护.如果一个类有多个职责,

那么其中任一一个变更则会引起该类的变化,听起来还行嘛,一个类变化,改就完事了.但是变化将会沿着依赖的反方向进行传递,也就是说依赖这个类的类也会发生变化,而依赖的类的变化又会引起更上层的类的变化,这样一直传递下去. 这样变化就会非常多了,使得一个小小的需求变更可能使得修改工作量很大.

一个遵守单一职责的类将会更加容易理解,更加容易实现,降低bug出现的可能性,提高开发速度.

当面对需求变更而要修改一个类的时候,可以问自己一个问题,这个类的功能是什么?如果答案是....和...,那就违反了SRP,应该考虑是否有更优的方法去实现需求.



Open/Closed Principle

开闭原则:对扩展开放,对修改封闭

开闭原则显而易见的一个好处是利于测试,如果一个类原有的代码很少的修改,那么就不用花很多精力去做回归测试.



Liskov Substitution Principle

里氏替换原则

这个原则由Barbara Liskov 提出,可以表述为子类可以代替其父类

这个听上去理所当然,但其实我们很多代码是不遵循里氏替换原则的,即子类不能替换父类,

经典的例子

public class Rectangle {
private int weight;
private int height;

public int getWeight() {
return weight;
}

public void setWeight(int weight) {
this.weight = weight;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}
public int getArea() {
return weight * height;
}
public class Square extends Rectangle{

@Override
public void setHeight(int height) {
super.height = height;
super.weight = height;
}

@Override
public void setWeight(int weight) {
super.weight = weight;
super.height = weight;
}
}
public static void main(String[] args) {
Rectangle rectangle = new Square();
rectangle.setWeight(3);
rectangle.setHeight(4);
assert rectangle.getArea() == 12;
}

父类长方形输出12,但是子类会输出16,因此子类和父类的行为不一致,其实这里并不能用继承.



Interface Segregation

接口隔离原则: 用户不应该被强制依赖不需要的接口

SRP和接口隔离的目的一样,通过将软件分隔成独立的部分,即隔离,来尽量减小变化的副作用

实践中,接口隔离原则很难遵守,因为有时候要增加一个feature,在原来的接口里加一个方法是很自然的事情.一不注意就污染了接口,破坏了接口隔离原则.



Dependency Inversion Principle

依赖反转

低层模块进行具体逻辑的实现,高层模块调用低层模块,这是非常自然的,在实际代码编写中就会很自然的使得高层模块依赖低层模块.

有一个说法很有意思,变化将向依赖的反方向传递. 如果低层模块发生了变化,将会沿着依赖的反方向传递到高层.从而高层模块也发生相应的变化.除此之外,高层依赖低层,高层的可服用性也会降低.

依赖倒置有两个原则

1.高层不直接依赖低层,低层和高层应该都依赖与抽象

2.抽象不依赖于细节,细节应该以来于抽象.

用户头像

毛叫

关注

还未添加个人签名 2018.12.25 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第二周总结