過度設計

Overdesign

在一個目前維護的專案中,看到一個相依性很高的 code,似乎是一個很棒的例子說明過度設計這件事。

撰寫者的美意

是讓 controller 內,只有一行就可以發出不同狀態的通知信,但這樣的設計卻帶來更多的災難。一個好的設計是什麼?基本原則不外乎是,一次變動只需影響到一個地方,每個最小單元只做一件事,並可充分表態自己的意圖。

那這樣的設計問題在哪裡?

  • 當 Order 的 Type 有更名的時候,如果不是原設計者,接手人並不會知道同步去更變 CustomMailerService 內的 function 名稱,基本上他也不應該需要去做這件事。
  • CustomMailerService[status](order) 隱含著,有可能會 CustomMailerService.paymentConfirm 只傳一個參數的意圖,另一個參數或許會是 null Code 這本書上有提到,不應該傳入 null 為參數。
  • 如果有一天 CustomMailerService 的 function 名稱需要修改,接手人也不容易察覺與 Order.type 有相關聯。

簡略架構

OrderController

1
let messageConfig = await CustomMailerService[status](order);

Order

1
type: DataTypes.ENUM('new', 'paymentConfirm', 'deliveryConfirm', 'orderCancel'),

CustomMailerService

1
2
3
orderConfirm: (result)
paymentConfirm: (order, email)
deliveryConfirm: (order)