iT邦幫忙

2021 iThome 鐵人賽

DAY 16
1

「什麼是物件導向? 對軟體架構師來說: 物件導向是透過使用多型(Polymorphism) 來獲得對於系統中每個原始碼依賴方向的絕對控制力」

取自: Clean Architecture (p.39)

CH5: 物件導向程式設計

思考: What is Object Oriented?

常見回答一: 資料和函式功能的結合

  • 不夠令人滿意。早在 1966 以前程式設計師早透過把資料結構傳遞給函式達成此種結合
  • e.g., obj.func();func(obj);

常見回答二: 一種模擬真實世界的方式

  • 這在暗示 OO 使軟體更容易理解、與現實世界有著更密切的關係
  • 仍然不夠滿意,定義過於鬆散

經典回答三: 以封裝、繼承、多型特性所合成的產物

  • 談封裝
    • 封裝不是物件導向所獨有的,事實上 C 語言反而擁有完美封裝
    • 例 (Code)
    TODO...
    
    • C++ 出現後,C 語言的完美封裝就被破壞了
    • 原因: C++ 編輯器需要知道每一個類別的 Instance 所占記憶體的大小
    TODO...
    
  • 談繼承
    • C 語言或 1960 年代大多數的語言都有能力可以將一個資料結構偽裝成另一個資料結構,以此達成繼承功能
    TODO
    
    • Object Oriented 的出現確實使資料結構的偽裝變得更方便
      • OO 加 0.5 分
  • 談多型
    • C 語言一樣可以達成多型功能
      • 透過函式指標 (Function Pointer)
      • 例: UNIX 作業系統中的 STDIN, STDOUT 介面
      • 這個技巧是所有多型的基礎
      • 多型就是函式指標的一種應用
    • C++ 的多型
    • 顯式 (Explicit) 使用函式指標的問題
      • 函式指標是危險的
      • 必須遵循一系列人工的約定來操作這些指標,DEBUG 很難
    • 使用 OO 語言使多型變得很簡單
      • OO 在間接控制移轉上加上了規範

多型的威力

  • 好處
  • 依賴反向
    • 圖... 呼叫樹
    • ...
  • OO 語言提供安全方便的多型,無論在何處,任何的原始碼依賴(Dependency)都可以被反向

CH6: 函數式程式設計

「函數式語言中的變數不會改變(Do Not Vary)」

「為什麼軟體架構師關心變數的可變性? 因為: 所有 Race Condition、Deadlock、Concurrent Update Problem 都來自於可變的變數

「沒有變數被更新,就不會有 Race Condition、Concurrent Update Problem。沒有可變的 Lock ,就不會有 Deadlock」

取自: Clean Architecture (p.43)

不可變與架構

  • 思考: 如何設計在「多執行緒」和「多處理器」情況仍舊耐用的系統?
    • 一定要問自己: 不變性是否可行?
  • 達成不變性的方式
    1. 有無限儲存空間和處理器速度
    2. 做出某些折衷...

1. 事件來源 (Event Sourcing)

  • 想像: 不是儲存帳戶餘額 (狀態)、而是儲存所有交易
  • 這並非不可能達成
    例如:
    • ...
    • ...
  • 所有程式只具備 CR (Create / Read) 的能力,不具備 UD (Update / Delete)
    • 不會產生任何平行化問題
    • 完全的函數化 (Entirely Functional)

2. 可變性分離

  • 將服務分離為可變和不可變的元件
  • 使用交易式記憶體 (或事務內存, aka Transactional Memory)
    • 補充: 可簡單想成是一類針對 Data 一致性(Consistent)特別設計過的 Memory
    • 運作邏輯可簡單圖示成:

上一篇
Day 15: 範式概述、結構化設計 (待改進中... )
下一篇
Day 17: SOLID 設計原則 — SRP (待改進中... )
系列文
成為乾淨的開發者吧! Clean Code, Clean Coder, Clean Architecture 導讀之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言