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