5
5
6
6
# 补充说明
7
7
8
- 一个软件实体应该通过扩展来实现变化 ,而不是通过修改已有的代码来实现变化
8
+ 系统应该通过扩展来实现变化 ,而不是通过修改已有的代码来实现变化
9
9
10
10
11
- <!-- # 做项目的时候哪些地方违反了开闭原则? -->
11
+ <!-- # 项目中哪些地方违反了开闭原则? -->
12
+ 在项目中,如果我们为了增加第三方库的功能而直接修改第三方库的代码,那么这就违反了开闭原则,因为这是通过修改了已有代码来实现变化
12
13
13
- 具体来说,如果我们为了增加第三方库的功能而直接修改第三方库的代码,那么这就违反了开闭原则
14
14
15
- ** 为什么违反**
16
- 这是通过修改了已有代码来实现变化
15
+ <!-- **造成什么问题** -->
16
+ 这会造成下面的问题:
17
+ 升级第三方库的版本时,会导致原有的修改失效,从而不得不再修改一遍
17
18
18
- ** 造成什么问题**
19
- 升级第三方库的版本时,会导致原有的修改失效,从而不得不再次修改一遍
20
19
21
-
22
- ** 如何改进**
23
-
24
- 有很多改进的方法,其中一个方法就是使用设计模式中的“中间者模式”,增加一个模块A来封装第三方库,让用户改为调用模块A而不是直接调用第三方库。
25
- 这样在需要增加第三方库的功能时,则只增加一个模块B,使其继承模块A,然后在模块B中加入增加的功能代码,让用户改为调用模块B
20
+ <!-- **如何改进** -->
21
+ 有很多改进的方法,其中一个方法就是使用设计模式中的“中间者模式”,增加一个模块A来封装第三方库,让用户改为调用模块A而不是直接调用第三方库
22
+ 这样在需要增加第三方库的功能时,只需增加一个模块B,使其继承模块A,然后在模块B中加入增加的功能代码,并让用户改为调用模块B
26
23
27
24
这样做的话就通过扩展而不是修改来实现了变化,从而符合开闭原则
28
25
26
+ 值得注意的是:因为开闭原则允许修改用户的代码,所以这里允许用户改为调用模块B
27
+
29
28
30
29
# 案例1
31
30
@@ -46,21 +45,20 @@ TODO tu
46
45
47
46
上面三种实现思路都违反了开闭原则,因为它们都是通过修改Cloth的相关代码来实现变化
48
47
49
- 我们可以增加一个继承TShirt的子模块:OffTShirt,在其中增加getOffPrice函数
48
+ 我们可以增加一个继承TShirt的子模块:OffTShirt,在其中覆写getPrice函数,实现打折处理
50
49
领域模型如下:
51
50
TODO tu
52
51
53
- 这样就只需要修改用户模块ClothStore,使其从调用TShirt的getPrice函数改为调用OffTShirt的getOffPrice函数 ,而不需要修改Cloth的相关代码
52
+ 这样就只需要修改用户模块ClothStore,使其从调用TShirt改为调用OffTShirt ,而不需要修改Cloth的相关代码
54
53
55
54
这样就通过扩展来实现了变化,符合开闭原则
56
55
57
- 值得注意的是:开闭原则允许修改用户模块
58
-
59
56
60
57
# 案例2
61
58
62
59
63
- 我们来看下另一个例子,我们要实现一个人员管理系统,领域模型如下:
60
+ 我们来看另一个例子
61
+ 我们要实现一个人员管理系统,领域模型如下:
64
62
TODO tu
65
63
66
64
人员固定有三个数据:姓名、卡号、部门
@@ -72,7 +70,7 @@ TODO tu
72
70
我们修改领域模型,修改后如下:
73
71
TODO tu
74
72
75
- 这里将人员和它的数据改为了组合关系
73
+ 这里将人员和它的数据改为组合关系
76
74
比如对于原来的三个数据,现在它们的关系如下:
77
75
``` ts
78
76
人员 = 人员数据项1 + 人员数据项2 + 人员数据项3
@@ -83,8 +81,9 @@ TODO tu
83
81
人员数据项3 = 名称(部门) + 值 + 类型(string )
84
82
```
85
83
86
- 可以通过增加一个人员数据项,从而实现增加一个人员的数据;
87
- 可以通过增加一个修改后的人员数据项,并使人员从组合修改前的数据项改为组合修改后的数据项,从而实现修改人员的数据;
88
- 可以通过使人员不再组合某个数据项,从而实现删除人员的数据
84
+ 现在可以通过这样来实现用户的需求:
85
+ 通过增加一个人员数据项,从而实现增加人员的一个数据;
86
+ 通过增加一个修改后的人员数据项,并使人员组合修改后的数据项,从而实现修改人员的一个数据;
87
+ 通过使人员不再组合某个数据项,从而实现删除人员的某个数据
89
88
90
- 这些都是通过扩展而非修改来实现变化 ,所以符合开闭原则
89
+ 因为这些都是通过扩展而非修改来实现变化 ,所以符合开闭原则
0 commit comments