et84121 / 91

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

91 DI and Decorator Class

善用重構工具

肥大的 Class 怎麼拆

  • 針對主要的 method 往下拆成 private method
  • 將相似的 method 分類拆成獨立 class
  • 將獨立 class 分別移動至獨立檔案
  • [DI] 將新獨立出來的 class 建立 Interface
  • [DI] 將新獨立出來的 class 統一由 Constructor 注入
  • [Decorator] 從分拆的主要 function 前後開始觀察是否有可以拆成以裝飾器實作的動作
    • 那些不需要與主要任務有需要直接耦合的任務
      • auth.isVaild() 裡的 notify
      • auth.isVaild() 驗證動作裡的帳號是否鎖定的前置檢查

Decorator

Cons

  • Decorator Order is Matter; 順序很重要
  • 可能 Unit-Test 都過,但整合起來就是有問題
  • 靠 Code Review 避免
  • 或只拆成一個 Decorator 就沒順序問題了
  • 依賴整合測試

寫法一

class XXXDecorator implements IClass{
    constructor(service:IService,instance:IClass){
        this._service = service;
        this._instance = instance;
        // ....   
    }

    operation(..args:any[]){
        // 在參數動手腳 (Before)
        const result = this._instance.operation(...args)
        // 在回傳動手腳 (After)
    }

    // 還要繼續實作其它 method
    ...otherMethod(..args)
}

寫法二

function XXXDecorator(service:IService,instance:IClass):IClass{
    const decoratorFn =  (...args)=>{
        // 在參數動手腳 (Before)
        const result = instance.operation(...args)
        // 在回傳動手腳 (After)
    }
    
    return {
        ...instance,
        operation: decoratorFn
    }
}

寫法三

其它補充

  • 舉例:

    • CacheDecorator -> 裝飾 Service 層 (API 層)
      • 裝飾器就可以決定要從 Cache 拿還是真打 API
  • In Functional Programing, maybe it could be replaced by function compsition.

JS DI Framework

Tech Stack

  • yarn - package manager
  • Parcel - Bundler
  • TypeScript
  • Jest with Ts-Jest - Test Framework
  • Prettier - Formatter

指令

  • yarn install - install package
  • yarn dev - bundle and run
  • yarn test - running test

About


Languages

Language:TypeScript 99.3%Language:JavaScript 0.7%