YUUNJIEE.COM
til-open-closed-principle.md
[_][□][✕]
📄til-open-closed-principle.md×
blog/til-open-closed-principle.md

TIL: 加新東西不改舊程式

2026-06-03·2 min read·updated 2026-06-03·OOPSOLIDDesign PatternsOOAD

SOLID 五原則之一。新增功能應該透過新增程式碼完成,而不是回頭修改現有程式碼。

Open/Closed Principle(OCP,開放封閉原則),SOLID 五個原則之一。

SOLID 是五個物件導向設計原則的縮寫:Single Responsibility、Open/Closed、Liskov Substitution、Interface Segregation、Dependency Inversion。

軟體實體應該對擴充開放,對修改封閉。

新增功能時,應該透過新增程式碼來完成,而不是去修改現有程式碼。

違反 OCP 的版本

java
// CanvasModel.javafilter(o -> o.isSelected() && !(o instanceof LinkObject))

今天新增一個 NoteObject 也不能被群組,就必須回去改這行:

java
filter(o -> o.isSelected() && !(o instanceof LinkObject) && !(o instanceof NoteObject))

每次新增類別都要動舊程式碼,這樣就是對修改不封閉。

符合 OCP 的版本

java
filter(o -> o.isSelected() && o instanceof Groupable)

改用 Groupable 介面來判斷:

  • NoteObject 不能被群組 → 不實作 Groupable,這行不用動
  • NoteObject 可以被群組 → implements Groupable,這行也不用動

對擴充開放(加新類別)、對修改封閉(舊程式碼不變)→ 符合 OCP。

結論

加新東西不改舊程式,是 OCP;每次加新東西都要改舊程式,是違反 OCP。

share
ONLINE·yuun@blog·v2.7.0