Skip to content

Commit eede0bc

Browse files
committed
feat(再看设计原则): add 接口隔离职责原则,最少知识原则 article
1 parent bf05ff2 commit eede0bc

File tree

9 files changed

+169
-1
lines changed

9 files changed

+169
-1
lines changed

doc/第三轮.org

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ xxx
7979
保存到state...
8080

8181

82-
如拼接模式->_sendAttributeData中调用WebGL代码可用伪代码表示
82+
把WebGL代码尽量用伪代码替代,如:
83+
拼接模式->_sendAttributeData中调用WebGL代码可用伪代码表示
8384

8485

8586

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-17T07:10:10.859Z" agent="5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="y388pc3FlIAt88Wzd9Ww" version="14.6.13" type="device"><diagram id="YK_AM_XD7WLYVs3H7Qbr" name="第 1 页">tZVNc5swEIZ/DTPJIR0D8UeOAaftwelk6nSS9KbAApoIlpHkr/z6roQAYztT55CLjd5dLey+j8AL43L7Q7K6uMcUhBeM0q0Xzr0guLme0K8Rdo0wmQaNkEueNpLfC0v+Dk4cOXXFU1CDRI0oNK+HYoJVBYkeaExK3AzTMhTDu9YshyNhmTBxrD7xVBeNOgumvf4TeF60d/YnN02kZG2y60QVLMXNnhTeeWEsEXVzVW5jEGZ27Vyafd8/iHYPJqHS52yAv7fh+O3lib+oZ14Wj+soe7hyVdZMrFzDXjARVC9q/3mlQWYsARJyF2j/vSAkn8LojwLpmtS7dnJqw0vBKlpFGVZ66SI+rZngeUXXCZjiJKxBak5Dv3UBjTWpScFFumA7XJkGlWbJW7uKCpT8ncoy4WpSWGrHz2w0yFianSQbVYKinId2av6BdM+2g8QFU9oJCQrBasVfuzZKJnNeRag1li7Jdto8RBjYIdnxUnuw/dA3v6OBThFgCVruKKXdMHUAuRPUAbXpeQxnTiv2WWw3MncG8q52jwldOFI+QU14gpoD9wW3zist8a07OWZoGRciRoFk+7xCm9TiICDTJ2AoeZoKW6xmCa/yRwPH/MrvlYXdOA975bcbg5EkaqZZY5vxSLBXEA+ouOZo6ssmN6qRWLejGkfeeG4VqWOsqAnGrVlAOGxA6XOd/fjMHdvt7J2d6e7si7y9PuFtpIDJpIh25qD/YiVcXO6dfoonWNYCtkubdkHv4tQO9/IICxqW7rA4wODzZDSviSEE18cQGAlpbybs+7cgnqA6AcYQgIiGHo++jQ0KQUxrv1//l4699wA59YW0zM6kJfg0LrTsP042tveFD+/+AQ==</diagram></mxfile>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-17T07:10:19.884Z" agent="5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="5_X01zZGOluw0cHaZbgZ" version="14.6.13" type="device"><diagram id="qDEeZYNnjzAwfOHLwOHe" name="第 1 页">7VfBbqMwEP0apPbQVYAkTY8Fut2VmlW12WqPKxcMWDUeZLtN0q/fsTEQklRN1UbqoZeA34wHZt4bT/DCuFpdS1KXc8go94JRtvLCxAuCi/EUfw2wboDpedAAhWRZA/k9sGDP1IEjhz6yjKqBowbgmtVDMAUhaKoHGJESlkO3HPjwqTUp6A6wSAnfRf+yTJcNOgvOe/wHZUXZPtmfXjSWirTOLhNVkgyWG1B45YWxBNDNXbWKKTe1a+vS7Pv+grV7MUmFPmSDvp7/pMmtyC/nybiWEQH178xFeSL80SXsBVOO8aL2yoSmMicpRaBwhvbqBSHyFEYLVtWc3ikqXap63dZPLVnFicBVlIPQC2fxcU04KwTep9Q8AoEnKjXD0l86g4Ya0bRkPLsha3g0aSpN0od2FZUg2TOGJdzFRLPUTkWz0cBjYXYibFBJFfrctrXzt6A5WQ0cb4jSDkiBc1Irdt+lURFZMBGB1lA5J5tp8xJhYEtli4zp0dWL7PmdJrCXKFRUyzW6uA0TpyLXRp2qlr0ow5nDyk1BhjPXDK4Rii50rxW8cXJ5g3SCPdLZIp8zS7zSEh669jE1yxnnMXBA1hMB1qlVA6e53qOFimUZt8FqkjJR/DHaSM78HrmxG5OwR367MhhIgiaaNKwZiji5p/wWFNMMTHzZ+EY1oOBtqSaRN0ksInUMApMgzHJFUQ1LqvShxL7ceLtsO3pnB7J7LG7DPdxGihKZltHa9PkvUtGT040jYId7rIjuuN/i+u30N0fBkOnxLtMGAtybc3vSligaKvawP2Q5wsrGo28Tw3cQ49rv169KYKPXkY4jSmJ2mCTag+LDNTH+kFERgxkVq69ZccxZEXy6YTH5GhbvOBnGn3pYTPcNi7Tp84WdGSf47zyzxTv9mhPvnhOvqOF4cwKX/eeKtW1884VX/wE=</diagram></mxfile>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 定义
2+
3+
用户不应该依赖它不需要的接口
4+
模块间的依赖关系应该建立在最小的接口上
5+
6+
7+
# 补充说明
8+
9+
接口尽量细化,同时接口中的方法尽量少
10+
11+
“接口”属于面向对象编程,它在函数式编程中的对应是“类型”
12+
13+
两者的代码如下:
14+
接口
15+
```ts
16+
export interface Interface1 {
17+
value1: number
18+
func1: () => string
19+
}
20+
```
21+
类型
22+
```ts
23+
export type type1 = {
24+
value1: number
25+
func1: () => string
26+
}
27+
```
28+
29+
两者是等价的
30+
31+
值得注意的是:
32+
类型名首写字母是小写,而接口名首写字母是大写
33+
34+
接口隔离原则同样适合函数式编程,也就是指类型应该保持最小
35+
36+
37+
38+
39+
# 案例1
40+
41+
我们开发了一个用户管理系统,其中有一个查询接口,方便管理员查询拥有,领域模型如下:
42+
TODO tu
43+
44+
系统上线后,发现系统速度非常慢,这是由于查询接口中的complexSerach函数性能太差造成的
45+
46+
我们可以修改接口,将complexSearch函数拿出来拆分为新的接口,从而符合接口隔离原则
47+
修改后的领域模型如下:
48+
TODO tu
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-17T08:04:11.324Z" agent="5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="ecNlLN8mtBRHXmFTSh-A" version="14.6.13" type="device"><diagram id="Ok-7ik8cqZIkTmvKWYxw" name="第 1 页">7VhNb+IwEP01SN1DVyThoz0W6MeBStVSaXdPKzcxxFvHg5yhQH/9jhM7IQRYqpalK3EB5nnGiec9z4xoBP1kcavZNL6HiMuG34wWjWDQ8H3P8wL6MsgyR7qXXg5MtIisUwmMxCu3YNOiMxHxtOKIABLFtAqGoBQPsYIxrWFedRuDrD51yia8BoxCJuvodxFhnKMXfrfE77iYxO7JXucyX0mYc7YnSWMWwXwFCq4bQV8DYP4rWfS5NMlzecnjbrasFi+mucJ9AoYz0fr1HW/xsRt1In43Ph/Jc89uk+LSnZhHlABrgsYYJqCYvC7RnoaZirjZtklW6TMEmBLoEfibIy4tm2yGQFCMibSr9MZ6+cPEf20786fdLjMGi4q1tFaKTOOVYZWASLAEVPQYC+WWboSURaATk99xy6sArbuNFCieIyvxeVpMLram26UOZjrku3JsZcv0hOMOv4tCFHSbOCScjk5xmkuG4qX6HszKelL4lczTD0v+W4TgH0cIjiVvnaUMOAIL7aOykO/7wuTMPqkHaVpjJp2LRLJMtWNQ6EgyGWVSTOg+DEJKENcEvHCNgurZlV1AQ00vjIWMhmwJM5MLynv47KxeDFq80rbMsbRKS7tV8RiZSMu/5in5PDhuvDXoni0qjkOWogVCkJJNU/FUHCMhmoTqASIk1ik7af4SgV9owxyPL3aro86mC7Cl2fYm79La87LSB4HF4tUq32wdSABBTQA18qXIiE9Rw3PRk0zOxlS9+iBBlzXNqUHyMW7QQiKiKLvI6ZSFQk0es2t77pXIMAscBCXyzaYhyO4/MmQ5a4YiyZ64fIBUoACzv859e1MQCrNUtXuN9iBDNPZB0SGYyLjipIY5N4rYj9jt16fOtqW33dqP3YsDcdvawC1JP0mYis7og0YJ/aVB3ckPvLIFrTBP+cCC+TWm305+XgiqPLfqPBsIKHYss2YZk2S42sB9leMe5bVvujux7ffJ9kr7rwJYuelExuEE0fH3E0TLP1S5Dz7T9FWs7TN9WY1tGLucRyhZmoqwMlmtdxOvUx8CPrDnt/+HyatdKwv3eS04tf1/0/aD47f9zqntv6PKbxnZP0nb725u+zOFZwlPnrhOT03/Q5v+bjkcvelf1Ot9JoNTuT9QuW+5McvVe79e7/3mBgl0DiWBy1O5f8f93jKtbS/3G8l9e7kns/y3Nltb+c87uP4D</diagram></mxfile>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-17T08:04:35.028Z" agent="5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="R9aPn2LCbbhKoLUISYqK" version="14.6.13" type="device"><diagram id="rksXnvwOW-vQa-j9NkS4" name="第 1 页">7Vhdb9owFP01SN1Dp3xAaB/LR1dpsFVrpa17qdzEEK+OL3IuBfbrd504JGmAUbV0e+AF5R5fJ773HPtYtPx+svyk2SweQ8Rly3OiZcsftDzvvB3QrwFWORB0vRyYahHlkFsCN+I3t6Bj0bmIeFpLRACJYlYHQ1CKh1jDmNawqKdNQNa/OmNT3gBuQiab6HcRYZyjZ163xK+4mMbFl93gPB9JWJFsK0ljFsGiAvnDlt/XAJg/Jcs+l6Z3RV/yeZdbRtcL01zhPhPCn6dfrqB7P7hPdDL8Gvufxd2pJSPFVVEwj6h+G4LGGKagmByWaE/DXEXcvNWhqMwZAcwIdAn8xRFXlkw2RyAoxkTaUa4Kot2AwhSZxiqQr8ksZGupFkphrkO+oz7fSobpKccded01ISRkDglHvaJ5mkuG4qm+DmYlNV3nlV2nB9v4F5BgF/nE5Nx+qQdp2mAmXYhEMmUomIDCgiTTUSbFVNFzSA3imoAnrlGQii/sABpqemEsZDRiK5ibXlDfw8ci6sWgxW96LStYqtLSadcybsxMy7/mKeVcF9y4z6AxW9YSRyxFC4QgJZul4mFdRkI0CdUDREhsUlZpvgjfW2vDlMeXu9XRZLOYYDekPZHccxsvyv3t+xaLq3vbaR9IAO2GABrkS5ERn6KGx/VJZHo2EVL2QQKxPlCQJRVqkHyCG7SQiCjKNnI6Y6FQ09ts2566JTLKJg78Evlm2+Bn+x8Zspw1Q5FkD1xeQypQgHm/znN7MxAKs1Z1eq3OIEM09kFREUxkXHFSw4IbRexH7Pbt02Tb0ttp78fu2YG47WzglqSfJExFJ/RDBqI/tDyySd911n2oME/9wDXzz5h+Ofn5QVDnud3k2UBAcycys6yYJMPVBu7rHPeor33nY8ew7fUpdsv4rwKo7HQi43CCCLz9BNH2DqSI4N94Li39h5lPdNjwrjo2KM7pPFrZKHOBC3ORIiASLAEV3cZCFUOXwhRvJ0ZFotUiIZXxqqF4Qe0e4L2x7Xf3tH3X2SyV9/H9buNoGOfnwdH638f6/b2t3w8OpIGzo/W/4qTfcm3/T6z/fKP1a86QX0g55skD1+lJ3fxpa8wVnhxvBG96I9itk31vBN1D3f+LY6nqBJk6jkZwICNou37dCbymE3jOBg0UWnl7DbhHJ3jFDt92k9tuBRvpfbkVUFj+h5eNVf4I9Yd/AA==</diagram></mxfile>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-17T08:04:22.346Z" agent="5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="PitDtZNrKLEj7MA9Zb24" version="14.6.13" type="device"><diagram id="JJTtlrWrgKvx3ywR-Ljh" name="第 1 页">7VfbUtswEP2azNAHmPgSA491ApQZYJjSC+1LR7EVW0X2euQNSfj6rmz5hp00TJs3XjLeo11Zu+do1xk502R9pVgW30LI5cgeh+uRMxvZ9rnr0a8GNiXgndolECkRlpDVAA/ihRtwbNClCHnecUQAiSLrggGkKQ+wgzGlYNV1W4DsvjVjEe8BDwGTffS7CDEu0TP7tME/cRHF1Zst77xcSVjlbDLJYxbCqgU5FyNnqgCwfErWUy517aq6lHGXW1brgyme4j4Bd+H1L4huV1dz9m3u3T3+dKV/bNLIcVMlzEPK35igMIYIUiYvGtRXsExDrncdk9X43ABkBFoE/uaIG0MmWyIQFGMizSodWG0eTXxh/NDGiX3uVMBs3V6ebdrWPVci4chVDVa6sTwyc2QK20CZos5ra+UMlMNSBXxHuSoFMhVx3OHn1vzSveBAp1UbilNcMhTP3XMwo9Co9mtIpAfD4xs4Nfs+M7k0b7pUkCKVqUd2vhKJZKlmdUEuFe+aJCZFlNJzQEXSpfafuUJBF+OjWUDNth/EQoY3bANLXQ+qffBUWX4MSrzQtqwivk3NxO14POhIQ6jiOfncV/xYr6Bbtu443rAcDRCAlCzLxbxOIyGqROoDIiTGqci0PIRj1/rQ6fH1boX0Ga0CzB03Tc46N/aqaRmOZ7C43S7G7oFEYPdE0CNfioL4HBU81c1N12whpJyCBH3BUiicKjVIvsABLSQiDIvekGcsEGn0pegEx1aD3BSBM6dBPpsyOEVLQYasZE1TJNmcy3vIBQrQ+6vS189ApFiUauKPJrMCUTiFlJJgouCKkxpWXCtiP2K3X6E+24beibsfu2cH4tYZ4NZfZiFD/jXn6jpdwNHSPHwY2TSBHWtc16OlAKoL1gp4xfjbRVA2hC7fbp9vDQHFLmQxDWOSDk8HNNDl2qf6TscnE826PSXbauy/CqF144mUwwnDs/cThmsfSBluTxk+tVU9ILl6FjTa3gfAYQbAZJ8J4AxNgNNDdYnJ+wT4h4u+5QtuxwQYYvdQ3HpDEyBHnllbGn+xaB8NgM7R+4j4ryNit3KGRsRgX7C8N2tnpD/0q7+TxVrrP7lz8Qc=</diagram></mxfile>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-17T08:04:27.656Z" agent="5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="Pb2a_MUg3eDgHAQXSGLq" version="14.6.13" type="device"><diagram id="v2mlQRtyGtayR05u8gAs" name="第 1 页">7VfbUtswEP2azNAHmNjOBR5xAr2FIQN0WvombMVWkb0eeU0Svr4rW75hk4aheeMloz1aXXbP0a4zcGbR5rNiSXgFPpcDe+hvBs58YNtnown9amBbAJOpXQCBEn4BWTVwK565AYcGzYTP05YjAkgUSRv0II65hy2MKQXrttsKZPvUhAW8A9x6THbRn8LHsEBP7WmNf+EiCMuTrclZMROx0tlEkobMh3UDci4GzkwBYDGKNjMude7KvBTrLl+ZrS6meIz7LLCPs/P05jpgd99/Xy+X96fT4Nux2SXFbRkw9yl+Y4LCEAKImbyoUVdBFvtc7zokq/ZZACQEWgT+4YhbQybLEAgKMZJmli6str/M+ty418aJfeaUwHzTnJ5vm9aSKxFx5KoCS91YEzJTZAqbQBGijuvVzJVpgEx5fEe6jHbphIDjDr9xxS+9Cw50W7WldYpLhuKpfQ9mFBpUfjWJNDA8voFTc8knJjNz0qWCGClNHbLTtYgkizWrK3IpedckMSmCmMYeJUmn2n3iCgU9jHMzgZpt1wuF9BdsC5nOB+XeeywtNwQlnmlbVhLfpGY8annc6pWGUMVT8lmW/FgvoCu2aTkuWIoG8EBKlqTioQojIqpE7AIiRMYpj7S4hGNX+tDh8c1uhXQZLReYN26KnHVm7HVdMpyJwcJmuRiODiQCpyOCDvlS5MSnqOCxKm46Zysh5Qwk6AcWQ+5UqkHyFfZoIRK+n9eGNGGeiIO7vBIcWzWyyBfOnRq5MWlw8pKCDFnBmqZIsgcul5AKFKD3V4Wvm4CIMU/V2B2M5zmicAYxBcFEzhUnNay5VsR+xL7+hLpsG3rHo/3YPT0Qt6Mebt0s8RnyHylXX+MVHGVm8GlgUwd2rGGVj4YCKC9YKeAF428XQVEQ2nyPunxrCGjtSubdMCTp8LhHA22uXcrvbHgy1qzbM7Kt2v6nEBovnkg5nDAm9n7CGNkHUsa4owyXyqpukFw9CWptHw3gMA1g/LIDnPZ0AKdHClXr+O9amHx0gHc89Fe+4HZ0gD52D9UBph1uj1PkidVb9vMp+6gDOUft5mBaSHOPj37xzn6xW0Z9/aJPRtbo7UIa6K/+8r9lPtf4g+5c/AU=</diagram></mxfile>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# 定义
2+
3+
一个对象应该对其他对象有最少的了解
4+
5+
6+
7+
8+
# 补充说明
9+
10+
11+
最少知识原则也称为迪米特法则,虽然名字不同,但描述的是同一个规则
12+
13+
该原则可理解为一个模块应该对自己需要耦合或调用的模块知道得最少,你(被耦合或调用的模块)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的接口
14+
15+
该原则包括两个方面:
16+
1.只知道直接的朋友
17+
2.只知道朋友提供的与我相关的接口
18+
19+
20+
21+
# 第一个方面的案例
22+
23+
老板要经理汇报部门的成员数,领域模型如下:
24+
TODO tu
25+
26+
伪代码如下:
27+
Boss
28+
```ts
29+
export let Boss = {
30+
command: (manager) => {
31+
let members = []
32+
33+
for (let i = 0; i < 20; i++) {
34+
members.push(createMember())
35+
}
36+
37+
manager.count(members)
38+
}
39+
}
40+
```
41+
Manager
42+
```ts
43+
export let Manager = {
44+
count: (members) => {
45+
console.log("成员数为:", members.length)
46+
}
47+
}
48+
```
49+
Client
50+
```ts
51+
Boss.command(Manager)
52+
```
53+
54+
55+
这里的问题在于Boss应该只知道Manager,不应该知道Member
56+
57+
58+
修改后的领域模型如下:
59+
TODO tu
60+
61+
把创建Member的逻辑从Boss的command函数移到Manager新增加的createAllMembers函数,从而解除了Boss与Member的依赖,降低了系统间的耦合,提高了系统的健壮性
62+
63+
64+
修改后的伪代码如下:
65+
Boss
66+
```ts
67+
export let Boss = {
68+
command: (manager) => {
69+
manager.count()
70+
}
71+
}
72+
```
73+
Manager
74+
```ts
75+
export let Manager = {
76+
createAllMembers: () => {
77+
let members = []
78+
79+
for (let i = 0; i < 20; i++) {
80+
members.push(createMember())
81+
}
82+
83+
return members
84+
},
85+
count: () => {
86+
console.log("成员数为:", Manager.createAllMembers().length)
87+
}
88+
}
89+
```
90+
Client代码不变
91+
92+
93+
94+
# 第二个方面的案例
95+
96+
前端使用一个后端服务时,该服务暴露了过多的细节
97+
98+
领域模型如下:
99+
TODO tu
100+
101+
102+
前端只想调用后端服务来更新用户信息,却需要调用后端服务的三个属于实现细节的函数来实现
103+
104+
这样做的问题是这三个函数中的任何一个修改了,都会影响前端相关代码
105+
106+
107+
后端服务应该只提供update函数,把原有的三个函数修改为私有函数
108+
109+
110+
修改后的领域模型如下:
111+
TODO tu
112+
113+

0 commit comments

Comments
 (0)