靜態分析:找 Pattern 誤用

SonarQube / SonarLint:有規則可以偵測常見的 Pattern 誤用:

  • Singleton 的 double-checked locking 沒有 volatile
  • Cloneable 實作不正確(Prototype Pattern 陷阱)
  • 空的 catch block(吞掉了 exception,破壞了 Chain of Responsibility 的錯誤傳遞)

SonarLint 是 IDE plugin 版本,在你寫 code 時即時提示,不需要等 CI。

PMD / Checkstyle(Java):更細粒度的 code quality 規則,可以自定義規則偵測特定的 anti-pattern。

ESLint custom rules(JavaScript):可以寫自定義規則,例如偵測直接 new 某些類別(應該透過 Factory)、或者偵測 event listener 沒有清理。


IDE Refactoring:安全地引入 Pattern

Pattern 很多時候是從「直接的 code」重構出來的。IDE 的 refactoring 功能讓這個過程安全:

Extract Interface(JetBrains / VS Code):把一個 concrete class 的 method 提取成 interface。這是引入 Strategy、Observer、Command 的第一步——讓依賴指向 interface 而非 concrete class。

Extract Method:把一個大 method 的邏輯抽出來,為 Template Method Pattern 做準備。

Introduce Parameter Object:把相關的參數包成一個物件,為 Builder Pattern 鋪路。

Change Signature:安全地修改 method 簽名,IDE 會幫你找到所有呼叫點。

這些 refactoring 有 IDE 保護,不容易漏改——比手動搜尋取代安全。


UML 工具:讓設計討論有共同語言

PlantUML:文字描述生成 UML 圖,可以在 *.puml 文件裡寫,版本控制友善。

@startuml
interface Observer {
  + update(event: Event): void
}
 
class EventBus {
  - subscribers: List<Observer>
  + subscribe(observer: Observer): void
  + publish(event: Event): void
}
 
EventBus --> Observer
@enduml

Mermaid:在 Markdown 裡直接畫圖,GitHub 和許多 wiki 原生支援:

classDiagram
    class Strategy {
        <<interface>>
        +execute(data)
    }
    class ConcreteStrategyA {
        +execute(data)
    }
    Strategy <|-- ConcreteStrategyA
    Context --> Strategy

draw.io / Lucidchart:拖拉介面,適合快速的 whiteboard 討論,可以 export 成 XML 版控。


哪個工具最重要

對日常開發:IDE 的 refactoring 功能 > 其他所有工具。

安全地做 Extract Interface 和 Extract Method,比學會 100 個 Pattern 更實用。Pattern 是目標,Refactoring 是達成目標的路徑。