1. Basic
    1. context
      1. abstraction
      2. encapsulation
      3. inheritance
        1. 抽象類別定義外曝行為,具象型別定義實作方法
      4. Polymorphism
        1. 依賴於抽象介面,而非依賴於實作
        2. 每個物件對同一個訊息會有自己的行為
    2. class
      1. internal
        1. constructor
        2. properties
          1. member
          2. method
          3. parent
          4. field
          5. variable
          6. const
          7. scope
          8. public
          9. child class
          10. v
          11. object
          12. v
          13. self class
          14. v
          15. protected
          16. child class
          17. v
          18. object
          19. x
          20. self class
          21. v
          22. private
          23. child class
          24. x
          25. object
          26. x
          27. self class
          28. v
          29. state
          30. static
          31. http://www.oreilly.com.tw/column_sleepless.php?id=j021
          32. dynamic
      2. preferences
        1. abstract
        2. implement
        3. namespace
        4. extend
      3. keywords
        1. final
    3. interface
    4. object
      1. new
  2. Dependency
    1. 耦合度、相依性
    2. Coding
      1. SubClass, Implement
      2. property
      3. Argument, Return
      4. Invoke
      5. Couple
    3. 改變的作用力根據相依性傳遞
      1. 相依於介面為弱相依
      2. 抽象為相依的防火牆
  3. Code Smell
    1. Rigidity
      1. 簡單的需求必須導致一連串模組的連動
    2. Viscosity
      1. 需要變更時,維持原設計比打掉重做還要難
    3. Immobility
      1. 難以抽離,難以被 reuse
    4. Opacity
      1. 程式碼難以理解,沒有清晰的表達力
    5. Fragility
      1. 簡單的變更導致多處無關部分發生錯誤
    6. Needless Complexity
      1. 無好處的相依,增加理解與維護的負擔
  4. Principle
    1. KISS
      1. keep it simple, stupid
      2. ex: Class 做很少的事情
    2. YAGNI
      1. You aren't gonna need it
      2. 不要過度設計
    3. Occam's Razor
      1. Natural Selection
      2. 用較少的東西,做到同樣的事情
    4. 管理改變時帶來的衝擊
  5. SOLID
    1. SRP
      1. 類別變更的原因只有一種
      2. 壞榜樣
        1. 瑞士刀
      3. 軟體設計的精神就是把責任分離
        1. 關注點分離
      4. 責任
        1. 承諾的事務
        2. 改變的理由
      5. 分而治
        1. 僵化性
        2. 固定性
        3. 脆弱性
      6. example
        1. Modem 從單工變多工
      7. 降低單一類別被「改變」所影響的機會。
    2. Open Closed Principle
      1. 挖土機
      2. 對擴充開放、對修改封閉
      3. Interface
      4. 將不變抽象責任 C 與會變細節 D 隔離
      5. 將變化委託給其他類別處理
      6. Template Pattern
      7. 反轉相依與注入
        1. Strategy Pattern
        2. Dependency Injection
          1. 只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于 依赖注入(DI) 。
          1. Cache
          2. 實作不同儲存空間的 Cache 方法
          3. Collection::Sort 不同型態的內容
      8. 讓主要類別不會因為新增需求而改變。
    3. Dependency Inversion Principle
      1. 相依性反向原則
        1. 可換頭的螺絲起子
      2. 抽象概念不該相依於細節,而細節應該相依於抽象概念
      3. 高階模組不應該相依於低模組,兩者都該相依於抽象概念
      4. 細節相依於外面抽象
      5. 定好規格
      6. 以簡馭繁
        1. 抽象化是為了使複雜度降低
      7. 由左到右,變成由右到左
      8. 互動的部份交給抽象類別或介面
      9. 會改變的實作,就放到子類別裡面
      10. 抽象層次不要太高,以免無法對焦於真正關注的類別特徵。
      11. 避免高階程式因為低階程式改變而被迫改變
      12. IoC
        1. Dependency Injection
          1. Service Provider
        2. 類別外部负责其依赖需求的行为,我们可以称其为 “控制反转(IoC)”。
        3. 實現方法
          1. 工廠模式
          2. IoC 容器
          3. 工廠模式的昇華
    4. Liskov Substitution Principle
      1. 所有參照基礎類別的地方,必須可以透明地 使用衍生類別的物件代替,而不需要任何改變
      2. Interface Oriented
      3. 實作 interface 需與定義保持一致
        1. parameters
        2. return type
        3. exception
      4. 覆寫方法時需遵守原有的 parameters, return, exception
      5. 避免繼承時子類別所造成的「行為改變」
    5. Least Knowledge Principle
      1. Law of Demeter
      2. 一個物件應該對其他物件有最少的瞭解
      3. 減少 public
      4. 避免曝露過多資訊造成用戶端因流程調整而改變。
    6. Interface Segregation Principle
      1. 減少每個 interface 能做的事
      2. 如有空實作,則 interface 可以在細化
      3. 單一職責 Interface
      4. 降低用戶端因為不相關介面而被改變。
  6. Design Pattern
    1. Creation Pattern
      1. Abstract Factory
      2. Builder
      3. Factory Method
        1. 把生成同一體系物件的判斷封裝在某個方法中, 透過參數來決定要生成哪一個物件
        2. 用 Factory::create 取代 new
      4. Prototype
      5. Singleton
    2. Structural Pattern
      1. Adapter Pattern
        1. 已經有寫好的第三方程式碼,但它的 API 使用方式跟主要程式無法搭配
        2. 先將依賴實作的程式碼改成抽象介面
        3. 實作 Adapter 類別來滿足介面
      2. Bridge
      3. Composite
      4. Decorator Pattern
        1. 臨時想要外加一些資訊在物件的公開 API 上,但又希望不修改用戶端的程式碼
        2. 以介面取代繼承
        3. 不是外加方法,而是在現在方法加入額外行為
        4. 拉成介面後,可將相同的實作在 construct 注入組合起來
      5. Facade
      6. Flyweight
      7. Proxy
    3. Behavioral Pattern
      1. Chain of Responsibility Pattern
        1. 資料需要經過一連串的關卡,如果能夠處理,就直接回傳結果,否則就交給下一棒繼續
        2. setNext()
        3. next()
      2. Command
      3. Interpreter
      4. Iterator
      5. Mediator
      6. Memento
      7. Observer
      8. State
      9. Strategy Pattern
        1. 重構 switch case
      10. Template method
      11. Visitor
  7. Architectural Pattern
    1. Front Control
    2. Interceptor
    3. MVC
      1. Model
      2. View
      3. Controller
    4. n-tier
    5. Specification
    6. Publish-Subscribe
    7. Naked Objects
    8. Service locator
    9. Active Record
    10. Identify map
    11. Data Access Object
    12. Data Transfer Object
    13. ADR
    14. Inversion of Control
  8. AOP
    1. middleware
  9. Reference
    1. Simple Design
      1. https://www.youtube.com/watch?v=mzaTpKZm54A