Skip to main content

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 一起編譯

AddressProgram
0000 - 0777Application
1000 - 1777Application
2000 - 2777Function Library
3000 - 3777Function Library
4000 - 4777
5000 - 5777
6000 - 6777
6000 - 6777

但如果 Memory 裝不下 Application code ,只能跳過再裝

AddressProgram
0000 - 0777Application
1000 - 1777Application
2000 - 2777Function Library
3000 - 3777Function Library
4000 - 4777Application
5000 - 5777Application
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 年的努力,動態連結檔案終於不像以前那麼痛苦了