Part 4. Component Principles
如果 SOLID 教我們如和鋪排磁磚做成牆壁跟房間,那元件原則教我們如何安排房間組成建築物, 大型軟體系統就像大型建築物,由小的元件組成
Part 4 包含三個章節:
- 元件 (Components)
- 什麼是 Component
- 元件內聚性 (Component Cohesion)
- 哪些東西該歸類為同一個 Component
- 元件耦合性 (Component Coupling)
- Component 該如何組成一個系統
Ch12: 元件 (Components)
什麼是元件?
- 能被部署的最小實體,e.g., jar files in JAVA, gem files in Ruby, source files, DLLs in .Net
- 元件可以被連結在一起組成一個可執行檔 (binary executable),或者可以被單獨部署動態載入的外掛,例如 .jar, .dll, .exe
- 一群 classes
- 書上用一個長方型加兩根槓表示
接下來這章全部在說關於 Linker 跟 Loader 的講古
很久很久以前,工程師可以控制程式在 Memory 的位址,這些 code 無法 relocate *200 指的是 memory 位址
*200
TLS
START, CLA
TAD BUFR
JMS GETSTR
CLA
TAD BUFR
JMS PUTSTR
JMP START
BUFR, 3000
GETSTR, 0
DCA PTR
NXTCH, KSF
JMP -1
KRB
DCA I PTR
TAD I PTR
AND K177
ISZ PTR
TAD MCR
SZA
JMP NXTCH
K177, 177
MCR, -15
Q: 那麼工程師如何使用其他 library 呢?
A: 全部塞在一起變成同一隻程式!
結果 function library 越大,花越多時間編譯,大型系統要花幾個小時編譯
為了縮短編譯時間,可以先編譯 Function Library 並將程式載入 Memory,
之後再創立 Symbol table 跟 Application code 一起編譯
Address | Program |
---|---|
0000 - 0777 | Application |
1000 - 1777 | Application |
2000 - 2777 | Function Library |
3000 - 3777 | Function Library |
4000 - 4777 | |
5000 - 5777 | |
6000 - 6777 | |
6000 - 6777 |
但如果 Memory 裝不下 Application code ,只能跳過再裝
Address | Program |
---|---|
0000 - 0777 | Application |
1000 - 1777 | Application |
2000 - 2777 | Function Library |
3000 - 3777 | Function Library |
4000 - 4777 | Application |
5000 - 5777 | Application |
6000 - 6777 | |
6000 - 6777 |
很明顯我們需要做點什麼
可重定位性 (Relocatability)
Relocation is the process of assigning load addresses for position-dependent code and data of a program and adjusting the code and data to reflect the assigned addresses. Relocation (computing) Wikipedia
最後就改成 Linker 跟 Loader
https://www.youtube.com/watch?v=cJDRShqtTbk&ab_channel=Log2Base2
結論:經過 50 年的努力,動態連結檔案終於不像以前那麼痛苦了