重用和單一職責可能是對立的
單一職責是讓一段程式碼只做一件事,實現一個功能,軟體複雜性來自於讓一段程式碼做兩件事:
"So much complexity in software comes from trying to make one thing do two things." – Ryan Singer
而重用是試圖複用一段程式碼實現的功能,也就是重用單一職責,但是重用有時如果不仔細設計,就可能導致一段程式碼做多個事情,因為程式員覺得這幾個事情差不多,就是實現單一職責功能,其實忽視了職責功能所處的上下文區別,雖然主要功能差不多,但是細微上有差別,最後實現成可執行時的程式碼時,實際這一段程式碼做了幾件事,導致複雜性,比如通過設定很多if語句來判斷不同上下文和入引數據。這就很難修改拓展,變成單體架構。
如果開始編碼主要目的不是為了單一職責,而是為了重用,很容易在程式碼級別耦合呼叫那些所謂重用程式碼,最後造成緊耦合,變成單體架構,整個程式碼都如同義大利麵條一樣混雜在一起,變成鐵板一塊。
因此,編碼第一設計主因是單一職責,只有先分了以後才可能重用,重用是重構階段進行的發現,處理難度比較高,需要將這段單一職責的程式碼完全與初次使用時的上下文脫離關係,提煉成模組或庫包甚至微服務方式提供,但肯定不是直接把單一職責的那段程式碼直接拿到當前上下文中就可以重用。
如果希望做到直接拿來重用,就使用函數語言程式設計,函式處理資料是不變的,杜絕了不同上下文,杜絕了函式功能根據不同函式入引數據不同而不同的可能性,函式方法也自身上下文沒有關係,是純粹函式功能實現。
因此,重用不是面對物件正規化的主要考慮設計目標,單一職責才是,如果希望重用是第一公民,就採取函式是第一公民的函數語言程式設計正規化。