在一個目前維護的專案中,看到一個相依性很高的 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 | orderConfirm: (result) |