Clean Architecture - Starting with the Bricks: Programming Paradigms

前導

  1. 這章像在介紹軟體界的「誓約與制約」,提到了三種典範語言為程式碼增加了一些規則,而這些限制可以讓軟體品質更高
    1. Structuring Programming
    2. Object-Oriented Programming
    3. Functional Programming
  2. 可以由上述的限制延伸到整個系統的三個專注點
    1. function
    2. separation of components
    3. data management

Structuring Programming

  1. 增加限制在 Program counter 的控制
    1. imposing discipline on direct transfer of control
  2. 使用 if, else, while 取代 goto
    1. 為何要廢除 goto這篇
  3. 雖然現今的主流語言已經沒有 goto 但還是有像 exception 和 break 等等破壞流程的語法
  4. Edsger Wybe Dijkstra 想要用數學學科中的**歐幾里得定理**找到一個公式可以代表軟體的品質
  5. 所有的程式都是由 sequence, selection, and iteration 組成
    1. sequence, selection 透過枚舉法證明
    2. iteration 透過歸納法證明
  6. 第 5 點的發現看似有機會找到公式解,但最終失敗了,於是開始採取科學的方式證明軟體品質
    1. 數學可以證明對的
    2. 科學是普遍性的假說,如黑天鵝,所以存在可否證性(falsifiability)
  7. 測試無法代表程式正確,僅能透過程式發現錯誤
  8. Structuring Programming 的價值來自於可以由多個可否證性的 unit(function) 所組成
  9. 鼓勵用 module 或是 function 切分系統 (functional decomposition)

補充資料

Object-Oriented Programming

  1. 增加限制在 function call(from pointer)
    1. imposing discipline on indirect transfer of control
  2. 有兩位大神發現可以把 function call stack frame 放在 heap memory 中
    1. stack memory vs heap memory
      1. stack memory is a fixed of size memory

        int val = 0; // compiler can know the size of the programming
      2. 在 heap memory 中的空間不隨著 function return 而釋放,所以需要在用完後需要呼叫 free() 或是由 GC 處理,heap memory 是整個系統共用的

        int* ary = new int[n] // cannot know the size during compilation
  3. 什麼是 OO?
    1. combine data and function
      1. f(o)o.f()
    2. 模擬現實世界
    3. encapsulation, inheritance, and polymorphism
    4. 上述都對於作者來說都不是好的答案
  4. Encapsulation
    1. 並非是 OO 的專有概念

      struct Point {int x;int y;} // C 語言也可以封裝
    2. OO 的封裝並不完美

      1. C++
        1. the header file includes variables (the user doesn’t need to know)
      2. Java/ C#
        1. definition and implementation are in the same file
  5. Inheritance
    1. The goal of Inheritance is the re-usability of already implemented code by grouping common functionality of different classes in so-called base classes —- from How To Implement Inheritance and Polymorphism in C?
    2. 在 C 裡也可以手動完成類似的概念(透過轉型)
  6. Polymorphism
    1. In Polymorphism, we declare an Interface and implement the details in entities of different types —- from How To Implement Inheritance and Polymorphism in C?
    2. STDIN and STDOUT 早已包含 Polymorphism 的概念
      1. 每個 Unix 上的裝置都要實作 5 個 functions,這些 functions 都包含在 FILE Structure

        1. open
        2. close
        3. read
        4. write
        5. seek
        // device definition #include "file.h" void open(char* name, int mode) { /*...*/ } void close() { /*...*/ } int read() { /*...*/ } void write(char c) { /*...*/ } void seek(long index, int mode) { /*...*/ } struct FILE console = { open, close, read, write, seek } // somewhere extern struct FILE* STDIN; STDIN = exist_device int getchar() { return STDIN->read(); }
      2. 透過上述方法可以將每個 device 當成是一個 plugin,這種作法稱為 Plugin architecture

    3. C++ 透過 Virtual method table 找對應的 method 位置
    4. 在 OO 之前,polymorphism 的達成是需要去 init pointer 的,假如忘記 init 而直接用 pointer call function 是很危險的
    5. OO 導入 interface 讓 polymorphism 更安全
      1. initialization
    6. 依賴反轉延伸出依賴方向是可以自由選擇的
      1. business rule, UI, Database
      2. 互相獨立 → 可以讓不同 team 開發
  7. 上述的三個概念,沒有一個是由 OO 發明出來的
  8. OO 帶來的好處
    1. 以系統架構而言,通過使用 polymorphism 脫離程式碼的依賴取回控制權(程式碼的擺放位置變得自由)
      1. OO 讓 polymorphism 的使用變得更安全(可能是透過 .new)
    2. Plugin architecuture 減少依賴,讓各部件可以獨立開發和部屬

Functional Programming

  1. 增加限制在 assignment statement
    1. imposing discipline on assignment statement
  2. immutability architecture
    1. 任何的同步問題都是由可修改的變數而產生的,如 race condition, deadlock
  3. 隔離可變性
    1. 區分 immutable 和 mutable components
    2. immutable component 可以跟多個 mutable component 溝通
    3. mutable component 要用 transactional memory 保護變數
      1. RDMS database
    4. 盡可能地讓所有處理是 immutable 的
      1. pure function
  4. Event Sourcing
    1. 類似區塊鏈的概念
    2. 只有新增讀取,沒有刪除更新
    3. 前提是要有無窮的空間和處理效能