重建模與重構的區別
Refactoring is tactical, remodelling is strategic.
重構是戰術性的! 重新建模是戰略性的。
重構好像已經變成了提高軟體質量的專有名詞,這個詞語是由Martin Fowler提出,並專門出版了兩版的《重構》書籍,被譽為“聖書寶典”。
但是DDD社群提出了:重構只是一種戰術手段,重新建模才是戰略方向,如果一個系統的業務模型或業務邏輯或核心演算法都發生了問題,在錯誤的戰略方向上做得無論多完美,也是徒勞,也是南轅北轍。
重構與重新建模是兩個層面,重構的範圍侷限在技術架構層面,目標是為了提高可組合性,但不是為了可複用性,組合性雖然表面上也呈現複用,其實更多是一種管道pipleline或流stream的作用。可組合性是軟體的摩爾定律,會對整個複雜系統例如社會系統產生蝴蝶效應。重構是與業務上下文無關的。
重新建模是與業務上下文相關,這也是可複用性很美好但是很難實現,因為業務上下文是不同的,如何實現複用呢?就是同一個行業比如全國社保,各地社保政策還是不同,所以無法納入一個可複用的全國社保系統,各個省社保只能重新建模。
重構與重新建模在規模上也是不同的,重構是一種漸進式發展,類似修修補補又三年,然後通過扼殺者模式將舊系統卸除刪除,這種方式看上去很好,但是致命問題是忽視複雜系統的整體性,人為介入複雜系統本身也會給系統帶來致命打擊,系統中雖有bug,但是總體還正常,如果你修復了bug,系統反而不能執行了,你傻眼不?說明系統內部是耦合的,錯綜複雜的,從哪裡開始修,開始補,不是像補衣服那樣一目瞭然。這也是物理還原論或傳統分析分解思維的缺陷,今年諾貝爾物理獎和經濟學獎頒給複雜系統研究也是說明這點。
重新建模是傷筋動骨的大手術,可能意味著重寫,當然你也可以追隨潮流認為這是重構,Evans在他的DDD書籍中也認為對股份share pie重新建模是一種重構。其實是不嚴謹的,或者說他可能自己也沒有意識到,這是重新建模,不是重構啦。
參考:
DDD中如何藉助行業術語突破性發現領域模型? - Mathias
相關文章
- 重構、重新架構、再設計與重寫的區別架構
- Java—重寫與過載的區別Java
- java中過載與重寫的區別Java
- .NET重構(型別碼的設計、重構方法)型別
- 重構與模式模式
- RAC重構型別型別
- ERP與SCM間的側重點區別(轉)
- C++中過載、重寫、重定義的區別C++
- 方法重置和重寫的區別
- 過載和重寫的區別
- merge into_目標表匹配列重複與源表匹配表重複的區別
- 程式碼重構與單元測試——“提取方法”重構(三)
- 系統重構的道與術
- 【小白學PyTorch】4 構建模型三要素與權重初始化PyTorch模型
- 10.int和Integer的區別(重點)
- 程式碼重構--大話重構
- 程式碼重構與單元測試——重構1的單元測試(四)
- 重構
- 程式碼重構之法——方法重構分析
- 程式碼重構:類重構的 8 個小技巧
- .NET重構—單元測試的程式碼重構
- 物件導向重寫(override)與過載(overload)區別物件IDE
- 程式碼重構與單元測試——對方法的引數進行重構(五)
- c++中的隱藏及過載、重寫與隱藏的區別C++
- Repractise架構篇一: CMS的重構與演進架構
- Repractise架構篇一:CMS的重構與演進架構
- 重構:你可能不知道的重構場景
- 程式碼重構:函式重構的 7 個小技巧函式
- 網路重構的進展與挑戰
- 重構的原則
- 原型重構原型
- CSS重構CSS
- 髒讀、不可重複讀、幻讀區別
- c#之重寫與過載的區別與聯絡_摘自.NEt專家部落格!C#
- JS 程式碼的簡單重構與優化JS優化
- 【PHP】PHP基礎知識與C++、Java等C家族的重點區別PHPC++Java
- CSS程式碼重構與優化之路CSS優化
- DDD和OO的重要區別:上下文重於抽象抽象