104104上图是操作书的接口,它不符合单一职责原则。这是因为它的getBookID、setBookID函数是对书的数据的操作,而它的addBook函数则是对书的行为的操作,所以该接口做了两件事情
105105
106106应该将其拆分为两个接口,使每个接口只做一件事情。拆分后的接口如下图所示:
107+
107108![ 重构后的书的接口图] ( ./单一职责原则/2.png )
108109
109110BookData接口负责操作书的数据。BookAction接口负责操作书的行为。原来的BookInfo接口改为实现BookData接口和BookAction接口
@@ -196,9 +197,8 @@ Reader.read(TechnicalBook)
196197```
197198
198199现在增加小说书,读者只能阅读技术书或者小说书,这由Client决定。
199- 修改后的领域模型如下:
200+ 修改后的领域模型如下:
200201
201- <!-- 既可以选择阅读技术书或者选择阅读小说书,这具体是由Client决定读者阅读哪类书 -->
202202![ 修改后的领域模型图] ( ./依赖倒置原则/2.png )
203203
204204修改后的伪代码如下:
@@ -244,6 +244,7 @@ Reader.read(TechnicalBook, NovelBook, "novel")
244244这里的问题是因为Reader依赖了每类书,所以如果一类书发生了变化,或者增加了一类书,那么Reader都需要对应修改代码。
245245
246246我们需要解除Reader与每类书的依赖,从而使其符合依赖倒置原则。修改后的领域模型如下:
247+
247248![ 重构后领域模型图] ( ./依赖倒置原则/3.png )
248249
249250现在提出了书的接口:Book,让Reader改为依赖书的接口,而不依赖书的实现模块。这样做的好处是只要Book接口不变,它的实现模块的变化不会影响到Reader。修改后的伪代码如下:
@@ -325,6 +326,7 @@ export type type1 = {
325326
326327
327328系统上线后,发现系统速度非常慢,这是由于User中的complexSerach函数性能太差造成的。我们可以修改User接口,将complexSearch函数拿出来放到新的接口中,从而把原有的接口拆分为两个更小的接口。修改后的领域模型如下:
329+
328330
329331
330332现在,管理员可以根据自己的需要使用SimpleUser接口或者ComplexUser接口,只依赖最小的接口,从而符合接口隔离原则
@@ -470,6 +472,7 @@ module B = {
470472```
471473
472474继承在函数式编程中的领域模型如下:
475+
473476![ 继承的领域模型图] ( ./合成复用原则/1.png )
474477
475478我们来看下继承的优点:
@@ -484,6 +487,7 @@ module B = {
484487
485488
486489组合在函数式编程中的领域模型如下:
490+
487491![ 组合的领域模型图] ( ./合成复用原则/2.png )
488492
489493我们来看下组合的优点:
0 commit comments