Skip to content

Commit 8066f14

Browse files
committed
feat(再看设计原则): add 合成复用原则,开闭原则 article
1 parent 34b904e commit 8066f14

File tree

13 files changed

+183
-1
lines changed

13 files changed

+183
-1
lines changed

doc/TODO.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ finish TODO
333333
每个设计原则给两个函数式编程的案例
334334

335335

336-
** TODO draft
336+
** DONE draft
337337

338338

339339
** TODO update

doc/宣传.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
一万小时的结晶:3D编程模式
2+
3+

doc/第四轮.org

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
** TODO 整理每个package代码,给出运行代码的script;并在README中说明如何运行,怎样运行
1515

1616

17+
** TODO 对用Rescript写的package,说明如何编译,以及package.json->main对应哪个src/的.res文件
18+
19+
1720

1821
** TODO 代码示例
1922

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-18T02:29:29.697Z" 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="zt2KnInbfI8vNwtDykfu" version="14.6.13" type="device"><diagram id="xkZSoPiHrs-hl7dk7HG0" name="第 1 页">zVXbjpswEP0aP2bFJZDwCEm2XWkrVd1K7T464IC3BrPGJNCv7zg2tyWJtpVW6hOeM+PxzDljg9xN3nwSuMy+8IQw5FhJg9wtchzbtWz4KKQ1iGU5GkkFTQw2AE/0N+kCDVrThFSTQMk5k7ScgjEvChLLCYaF4Kdp2IGz6aklTskMeIoxm6M/aCIzja6d1YB/JjTNupNtP9CeHHfBppMqwwk/jSB3h9yN4FzqVd5sCFPsdbzoffdXvH1hghTyPRuenxdp8dJ8O7YP5OE1+l4cs2jhmdpk2zVMEujfmFzIjKe8wGw3oJHgdZEQldUCa4h55LwE0AbwhUjZGjFxLTlAmcyZ8ULBov2p9t95nfk89m0bk1xbbW8loZIUzD3j8S8N3VPGhgBzqO2DWUks5BjQzaoOr3JooIrXIiY3iHPNLGKREnkjbtkrDXeE8JxAQ7BPEIYlPU7rwGZW0z5ukBMWRtG/UNfXeY+Y1eYk5PgMyo0OHBoe6+6/1rxzLKozZyEEuE7ZDE5YpefvzkPRBgWeWqw9FHpdXihTpzaBl6brEe/hlZhMBGY0LWAdgw5EAHAkQlK4haFx5DRJ9PARKA7vz/mU5CWnhTzz5kXI2/ZnqgSkQReeCLN5uJhj+a9fkrmGJvvCurOtwFBtnrmFOfLdMpvsX1U3oxB+OFQwXm/noC/i30fDnY8GaBluUWChnY/CNQpthQSArGYyjqRTcps75jq36J/dsquMOoE1YXPZ/QxOwwtsd+plo9fXtz7oIi0vsLVC6zWK/P+OrZ6FD2ALzOGHpUdx+O+7uz8=</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-18T02:29:43.073Z" 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="lETb0J1RcVqvLf5-8pHt" version="14.6.13" type="device"><diagram id="o7Fcu67EhLbL7Cs2VksW" name="第 1 页">xZVNb9swDIZ/jY4bbDl24mOcusuhwwZ0QHYrhIi1Nchipsj56K+fXNNf9TKsp+YS8SEpiS+phEWb6vLFikP5FSVoxgN5YdEd4zwMg8R/NeTaklXMW1BYJSloAI/qBQgGRGsl4TgJdIjaqcMU7tEY2LsJE9bieRr2jHp66kEUMAOPe6HndKekK6kKvhz4FlRRdieHSdp6KtEFUyXHUkg8j1CUs2hjEV27qi4b0I14nS5t3v0Nb38xC8b9T4J+0sWDePq5/ZYvdr+TKnvZbT/RLiehayqYLuuunQIgvSBkonUlFmiEzgeaWayNhOaYwFtDzAPiwcPQw1/g3JW6K2qHHpWu0uQ9OmEdeXniARj5xlw3vfS2QQMtuVda05Gv+V2EVKJCI3+UynSuUWhbXlPTRMYj1nYP/xCKz+UO+yb66QeswNmrD7GghVOn6f6CxrDo4/rU76j8jjygJxMvaF7owSw6u9vCF1SAo6yh334xusaAXqfgHRPB5xORJyxNWBY0i/WKrUOWxyy9Y+lyNiyjpj6j6Xoa8V75E1gHl5sjfENTSuDpG23C4HMw+tDdz8NDDZeUUY4eaRLcbspEzvdqF/1Fu5hlS5a1Im7YKv1wEeMF/yARvTn83LXzOvxpRPkf</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-18T02:28:20.259Z" 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="HchlF4iC_CWtI-5v1TF0" version="14.6.13" type="device"><diagram id="WSSB_kHYvYsUMuKL2NuB" name="第 1 页">7VhNc9owEP01PiaDMcbmGPPRHMiUKZ1pclRsYauRvR5ZfOXXd2XJGBtIaFPaHJhhGO3Tai3tvtUzWM4w3XwRJE8eIKLc6naijeWMrG7X6zv4rYCtBlzf10AsWKQhuwbm7JUasGPQJYto0XCUAFyyvAmGkGU0lA2MCAHrptsCePOpOYnpATAPCT9Ef7BIJhr1u16N31MWJ9WT7f5Az6SkcjYnKRISwXoPcsaWMxQAUo/SzZBylbsqL3rd5MTsbmOCZvKcBQ+r+9d0DXniPz1C9tVN6YTcmCgrwpfmwNa4ZwV36qN3LbdVKoo1SznJ0AoWkMm5mbHRJpzFGY5D3AsVCKyokAyzeGcmJOSIhgnj0ZRsYal2XEgSvlRWkIBgrxiWcBMTp4U0hHB7DY+5WolwB1FBC/SZVWmwW9AD2TQcp6SQBgiBc5IX7Hl3jJSImGUBSAmpcSpPqjfhYMkCky88Ht2cLIS9Ky+2BYWUSrFFl2qBZxhhWsKpuL6uCWb3DJbskavfNbw2nI53oeuy48BU/jdY4ByyoF18zsrCF1LAy64TVM4WjPMhcMCqjzIonSo2cLqQR7iQsijiZbCchCyLvytujG7sGpmWC0dOjXwzWVCQAEkk0VVTJeLkmfIZFEwyUPGF9g1yYJksU+UGljsqESGHkOEhCCtrRZENa6oYcV5hT/fQYbWrC693XnH9C9V2cFBKGuENZ0xMSAIxZISPaxQzvMwiGpn81j5TKEulKvWTSrk1jUGWElR/yrTqXbph8lEtv3WN9WSCqfFos29sKyOL7tSFXfMIkQlTpzXzmI69oMp82p+rw5ZWFVefXx367X7FHMFShPSNXLpGgPCaoG8xwjvOCEE5kWzV3MexgpulM0Xg+t5wes17o+d3miH0vsyqmjaYVbLdczN9cfI5ttt6jtMSlvf21fTHgd5BzeFdTv6c1u4R4RpYg8DyPWvsWgPbGvhXBbuQgvltIjr/WcD6VwH7gIC5n1rAqrejf6xge2rT8Rp6c+t7OwE6oTmlNaOCYQrUbdIWuGcOqv0PFK76AWT3W9dHCZyvZO8qlHMRher27JYStEJohT1QqL8lCt4RUfCsAEVhogaDjuX3r6JwIVHoep9NFfyrKnxAFU68xF5cFdCs/xTRN0P9z5Iz/gU=</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-18T02:28:30.180Z" 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="DBZiWmPP3EysNReaY4CD" version="14.6.13" type="device"><diagram id="BcbrSCJRCYaBFs7ZQtxQ" name="第 1 页">7VnbctowEP0aPaaDb2A/YiC9TNLJNJlJ0zfFVrAa2cvIIkC+vpItW74AJbeWB2aYwXu0kqU9e1ZIIGeSrj9zvEguISYM2YN4jZwpsm3LGgzll0I2JeJ7dgnMOY21kwGu6TPR4ECjSxqTvOUoAJigizYYQZaRSLQwzDms2m4PwNpvXeA56QHXEWZ99JbGItGrsEcG/0LoPKnebA2DsiXFlbNeSZ7gGFYNyJkhZ8IBRPmUrieEqeBVcSn7ne9orSfGSSYO6fD0fXy3ur3+Npqwr7+sH96t+L46sxw9ObGpVkxiGQBtAhcJzCHDbGbQkMMyi4kadiAt43MBsJCgJcHfRIiNZhMvBUgoESnTrXLGfPNT9y+MO2V88ipzum42Tje1FY8Vp9LMICMlck4Z0+25wFzot9rDsrlpFu3VCDHFKWTxTUKzqqkxVBkWFYud4dZQDksekX0x1mmL+ZyIPX5BnRRSTQRSIpcu+3HCsKBP7Xlgndbz2s8wLx80+S9JhHLcJ8yW+k1o5qJwrD7dDMlXNGW4iP8DZKJKFsUsZnQuwzmNZJQIl8AT4YJKOY11g1ApEkYJZfEF3sBSBUTGPnqsrDABTp/lsLjKliarntvyuFY9NWOc5NLnqiLI6kCXeN1yvMC50EAEjOFFTu/rZaSSK5qFIASk2qlYaTkJx64TRC2PrPenSJ/SqsNIlwZdG52q6K1MpbFcjSWNKjO0PygL7H4WdMlntCA+Fxwe65KoYvYgxTMBBtyos8oGRh7EllxIaRwXBSVf4Ihm85uifJxZBrkoOk4dg/zQUXCKOiSwwCVriiKG7wm7gpwKCmp8XvqGC6CZKELlhcibFggXE8jkIjAtuCIyG1ZEZcRhxO7WUJ9tza5M3YPI9T9K4VaPy39a6k11v2sV9x2lfk1Fo5u07hotppMyDt0e3rGmuwfW9NEba3rRVS4KbxoOOp/NyFcKMHXF8b1WXXHdzi+Djr832usvH8oZmNyrl/L6dHS3bDgBCkLkj9DMQ4GFAv+083zQzuNYHcb9/73zeKed5w07j3vUO89oi9RHKJRSP1cPwQD5w5PUP0jq3uDYpO6fpP4Gqe/4RXEkUg+2SN1HYyny4sEPUNhn+yT195G6ax3bebKawEnrr9L6jhuhI9G6dcBtQeNIds9AaeuQw2HdtvsesHGsM5d81rAj7wJABx/7XntF12DA20JAhb3s1Nc7ptU7d+eYVg9Rnlp1r33nPbszkNMZqIxDb6C/H/2kaS60S3fzt4Az+wM=</diagram></mxfile>
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# 定义
2+
3+
尽量使用组合而不是继承
4+
5+
# 补充说明
6+
7+
“继承”属于面向对象编程,函数式编程中没有“继承”的概念
8+
但是,函数式编程其实也可以实现“继承”,只是把“类”换成“模块”,如Rescript支持在一个模块B中引入另一个模块A,使得B获得了A的所有成员,这相当于B继承了A
9+
10+
相关代码如下:
11+
```res
12+
module A = {
13+
let value1 = "A1"
14+
15+
let func1 = () => {
16+
1
17+
}
18+
}
19+
20+
module B = {
21+
//引入A
22+
include A
23+
24+
//覆盖了A.value1
25+
let value1 = "B1"
26+
27+
let func2 = () => {
28+
//调用A.func1
29+
func1()
30+
}
31+
}
32+
```
33+
34+
所以说合成复用原则也适用于函数式编程
35+
36+
继承的领域模型如下:
37+
TODO tu
38+
39+
我们来看下继承的优缺点:
40+
继承的优点:
41+
- 实现新的子模块比较容易,因为子模块可以直接通过继承获得父模块的成员
42+
- 可以在父模块的基础上扩展子模块
43+
44+
继承的缺点:
45+
46+
- 继承破坏了封装,父模块的细节完全暴露给子模块,父模块的任何细节发生了改变都会影响到子模块
47+
- 继承是静态的,在运行时不能改变继承关系
48+
49+
50+
组合的领域模型如下:
51+
TODO tu
52+
53+
我们来看下组合的优缺点:
54+
组合的优点:
55+
- 组合保持了封装,因为新模块看不到已有模块的细节,新模块只能通过已有模块的接口来访问它
56+
<!-- - 能够通过装饰器模式等方法来包装组合 -->
57+
- 组合是动态的,在运行时能改变组合关系
58+
59+
组合的缺点:
60+
- 模块的数量会比较多
61+
62+
63+
64+
继承关系属于“Is-A”的关系,而组合关系却属于“Has-A”的关系
65+
66+
# 案例1
67+
68+
TODO tu
69+
如上图所示,因为雇员、学生都是人,它们与人是“Is-A”的关系,所以它们的关系是继承关系
70+
71+
实际上,雇员、经理是两种角色,而人可以同时有几种不同的角色
72+
如一个人可以既是雇员又是经理,然而这里使用继承的话,每个人就只能有一种角色,这不是很合理
73+
74+
因此,我们将它们由继承关系改为组合关系,修改后的领域模型如下:
75+
TODO tu
76+
77+
现在,一个人可以通过组合不同的角色,来拥有多个角色
78+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<mxfile host="Electron" modified="2023-04-18T02:28:35.753Z" 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="w4z7V1eVmkrfjJgIRWqx" version="14.6.13" type="device"><diagram id="MIss146aAQmY1lY--RN7" name="第 1 页">7VhtT9swEP41lbYPoLw0fflICmyTYEJ00sa+mcRNDE6ucq604dfPjp23pi1lXSeE+JTe47Nj3/PcOdeeO0lWXwSZx9cQUt5zrHDVc897jmO7li0fCskNYlmORiLBQoPVwJQ909LRoAsW0qzliAAc2bwNBpCmNMAWRoSAZdttBrz91jmJaAeYBoR30Z8sxFijI2dY418pi+LyzfZgrEcSUjqbk2QxCWHZgNyLnjsRAKh/JasJ5Sp6ZVz0vMsto9XGBE1xnwnffz/E+eJ2Nud5PhZo3bFvyYltlskwL09MQxkAY4LAGCJICb+oUV/AIg2pWtaSVu1zBTCXoC3BB4qYGzbJAkFCMSbcjNI0PFPcSDPgJMtYoMFLxkuXDIlAs4A90MNtE0X+S23hVEnKAHcFIFkogfOV2aW28qZ1QwVLKFJhQB0JdfytES6jBQsR0F1hNUolIqK4w8+tdCAziILcjcjlPEE5QfbU3gcxSo4qv2rqDTC5Q8cyaedZRnJl0o3WltD7MrNqycgfjW3UUCGk14hKv+2J8IU5woQDxlMEQTtyy5Ys4SRVuppBiqXyFIOEsyhVGpHxVyz5T1Qgk7l5ZgZQ6c0PYsbDK5LDQoVaCid4LC0/BsGe5bJkk668fstjqmYaLQiaSZ+bknp7Dbomq5bjFcnQAAFwTuYZu6+Okchos9QHREiMU3FSvQnXqaSnjkdXu8XXFUs5ob9GumfsZV22qqoaN0rWwNmur5YyXisDpyODDvmcFcRnKOCxqq8qZjNZCSbAQeVmCoVTqQZOZ7hBCwkLw6I6ZXMSsDT6UdSiE7tGroqJ526N3JoouEVRQ4JEs6Yo4uSe8hvIGDJQ6wvt689V1hSh8vyed14gAieQykMQVnBFpRqWVCliP2K3J1GXbcOulO5e5I6OxK27gdsB1yfWT6ZydkZkmXQGkRkonz3HtVWMi7LwlirC2HpHFcGzvJcrgrdBNHZ/cCTZeB8l4YCSsOVrwdA73pPdY5WEwQZuffWZIVhAP33uEC2PjxXRa8S+nmud+G1a+11aFQRy7owXX5+xVAhNN1DdptSXYZxYp54i15lI267tF/luZLaM/RH5H+3Hf/9YAijvn//dS1SNgNdsA/6qBWg0JvccVO1vtCVWtwvpdCn/sIcY7tlDDA7sIQ7ifNhJ+h/TmAl8S5d6f/SeLvW1z3x36HTS3h5tSHvvWHf66ONOP6CmD3fW9H63pm8k9/UlXZr1X0+68a//wXMv/gA=</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-18T02:28:53.772Z" 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="Yvlcl8k0M1LE68lpgr7f" version="14.6.13" type="device"><diagram id="lOc39g2zFMwpDDG7bCKI" name="第 1 页">7Vnbjts2EP0aA+1DAt0tP0b2pi2yabdxgKaPXImS2FAagxqv7Xx9SZG6WfLGW9ebIFjAgM2jIc2Zc+ZItGfustj/Isgmfw8J5TPHSvYzdzVznIXjzNTLSg4amNuWBjLBEg3ZHbBmX6gBm7AtS2g1CEQAjmwzBGMoSxrjACNCwG4YlgIffuuGZHQErGPCx+hfLMFco6Ez7/BfKcvy5pvtYKGvFKQJNplUOUlg14Pcm5m7FACoPxX7JeWqdk1d9Ly3J662GxO0xHMm5KsbyBd/xp+cdP7OEvjb7+8Or8wqFR6ahGki8zdDEJhDBiXhNx0aCdiWCVWrWnLUxdwCbCRoS/AfingwZJItgoRyLLi5SsvkjaJGDmNOqorFGnzLeBNSIRFoFrADfXk4RHH4pLbw2rKcBvi7BiQJDbDam13q0aE/uqOCFRSpMKCuhEr/ZIGbasFWxPSRqhrNyxwyio/Eea0MZPtQkLsRBzlPUE6QPQz3QYyQszaunXoHTO7QsUzP+ZZRnGk5OzxaQu/LzOoUIz/0ttFBtY6eoCmT/QPhW5PCkgPmawRBR3KrdqzgpFS6SqHERnmKQcJZViqNyPorlqIHKpDJ1nxjLqDSWxTnjCe35ABbVWopnPhzM4pyEOyLXJZM6cr3BhFrNdNoQdBKxtw11NtH0HuyHwTekgoNEAPnZFOx+zaNQlablREgQmGC6kz1JlynlZ5Kj+4fF99YLM0E74h034x3nWu1ppr3HCtwTutroIynysAdyWBEPmc18RUK+Nzaq6pZKp1gCRxUb5ZQBzVq4DTFCS0ULElqd6o2JGZl9rH2old2h9zWE1duh3wwVXBrU0OCRLOmKOLknvI7qBgyUOsLHRttVNfUpfKjmb+qEYFLKGUShNVcUamGHVWKOI/Y0000Ztuw63vnkRteiVtvgtuA64z1O1M9mxJpk06QmQvN+8xxbVXj2ha+J0dYWD+QI/iW/3VH8CdEY3vBlWTjv1jCBZZw4mnB0Ls4k91rWUIwwW2kHjMEi+lPP4+IluljS/QRsU/nWjf+kFZvTKuCQM5Nef30mUuF0HKC6iGlkSzj0nrtK3KdpRzb3firfPc6W9b+ivyH5/HvXUsA829zlGjPAX7/FPCfTgC9c8k9B2X9vVOJNT6EjA4p/+MRIjzzCBFceIS4iPJw1PMf1zkT+D3d073wR7qnHz3lu3Nn1PV2ONH1/rVu6YuXW/oFlh4+aune2NInyb2Wo9tjLp/316Fv7sK2NU3Qhb/QBO6wjb1m/Ey/0DRHxV7X/pGmL979rN7theMn9uf1btt+Me8LzPuUOVzdveWw+9tAe0L334t78y8=</diagram></mxfile>

0 commit comments

Comments
 (0)