面向对象的设计原则,即我们熟知的SOLID设计原则,学习它有什么用呢?
我们通过思考一个问题来理解,如何判断一个代码的好坏?
从我个人的观点来看,有三点:
- 易读性。代码是写给人看的,因此一定要有易读性,否则就过一段时间程序员自己和接手代码的人就都不认识这个代码了。从最基本的考虑来说,代码要命名、注释良好,这是最低的要求了。
- 功能完整性。一段代码,就是为了完成一个功能,如果功能都不具备,那么写这个代码是不合格的。
- 可扩展可复用。满足如上两点基本要求后,进一步考虑的就是可扩展、可复用。怎么样可扩展、可复用,这个时候面向对象的设计原则就上场了,通过这些设计原则,我们在类的使用级别上,可以将我们的代码做到可扩展、可复用。
通过如上三点,可以判断我们的代码写的如何,通过SOLID些设计原则,我们可以判断我们的代码设计的如何,这是我们学习面向对象原则的根本作用--判断代码优劣,帮助改进代码。
OpenClose
SOLID是面向对象的5个设计原则的首字母,但是我们除了记忆,还要区分清楚哪些设计原则重要性。其中Open-Close原则是最重要的设计原则,其含义是对变化开放,面对修改关闭。
先上例子:例如说有一堆形状,要显示出来,那么应该怎么设计。
一开始只有方形和圆形,那么怎么写呢,不考虑什么,用最快的速度完成代码,我们知道要抽象一个长方形,再抽象一个圆形:
interface Shape {
public show()
}
class Rectanglar extends Shape {
public show() {
System.out.println("rectanglar");
}
}
class Circle extends Shape {
public show() {
System.out.println("Circle");
}
}
int mian() {
new Rectanglar() -> show();
new Circle() -> show();
}
但是,再增加第三个、第四个图形呢,这个时候就有必要重构代码了,如何使用开闭原则呢?
这个时候,增加形状就是一种扩展了,但是main中就不断的再修改了,怎么设计呢?
class Processor {
private List<Shape> shapes = new ArrayList();
void add(Shape shape) {
shapes.add(shape);
}
void do() {
shapes.stream().foreach(shape -> shape.show());
}
int main() {
Processor processor = new Processor();
processor.add(new rectanglar());
processor.add(new Circle());
processor.do();
}
通过简单的重构,我们构造了一个符合开闭原则的代码,新构造的代码,增加一种形状可以不做任何修改,仅仅是在控制函数main中增加控制逻辑即可。
这里增加一下我个人的理解,编程的本质 = 控制 + 逻辑,我们设计的时候,把所有的扩展都写在逻辑类中,然后让控制类去搭积木一样来组合逻辑类。我们扩展的是逻辑类,扩展的是积木块,然后通过控制类来组合控制新的逻辑类。代码不是不修改,修改在控制类中。
小结
学习面向对象的设计原则,首先我们要理解拿这些设计原则来干什么,否则学无用武之地。我们学习了就是为了判断代码的优先劣。
其次学习要融汇贯通,从最底层看,OpenClose离不开多态的使用;然后就是面向对象设计原则;再高一层就是编程的本质=控制+逻辑;这些东西环环相通,需要仔细体会。
网友评论