重構的一些經驗

2021-10-22 23:35:54 字數 2786 閱讀 9347

當我們已經對設計模式倒背如流時,卻往往發現在實際**編寫中有生搬硬套的感覺。設計模式是前人經驗的總結,直接拿來用合不合適呢?這讓我想起了大學一位老師告訴我們的一條學習的道路「知識,理論,智慧型」。設計模式是很一種優雅的「智慧型」,但對於我們初學者來說還僅僅是留存於文字的「知識」。把「知識」融合到自己的開發中,在不斷探索和總結中形成自己「理論」,再應用到實際中,那麼這才是是真正屬於我們自己的「智慧型」。重構恰恰是由「知識」到「理論」的必經之路,而書中的各種重構方法無疑是這條路上清晰的路標。

**的壞味道 一般重構方法 使用模式重構

重複** 提煉方法

提取類方法上移

替換演算法

鏈構造方法

構造template method

以composite取代一/多之分

引入null object

用adapter統一介面

用fatory method引入多型建立

過長方法 提取方法

組合方法

以查詢取代臨時變數

引入引數物件

保持物件完整 轉移聚集操作到vistor

以strategy取代條件邏輯

以command取代條件排程程式

轉移聚集操作到collecting parameter

過長引數列 以方法取代引數

引入引數物件

保持物件完整

條件邏輯過度複雜 分解條件式

合併條件式

合併重複的條件片段

移除控制標記

以衛語句取代巢狀條件式

以多型取代條件式

引入斷言 以strategy取代條件邏輯

轉移裝飾功能到decorator

以state取代狀態改變條件語句

引入null object

分支語句 提取方法

轉移方法

以子類取代型別**

以多型取代條件式

已明確方法取代引數 以state/strategy取代型別**

引入null object

以command替換條件排程程式

轉移聚集操作到visitor

基本型別迷戀

程式**過於依賴基本型別(int,string,double,array等低層次語言要素) 以物件取代資料值

以型別取代型別**

以子類取代型別**

提取類引入引數物件

以物件取代陣列 以state取代狀態改變條件語句

以strategy取代條件邏輯

以composite取代隱含樹

以interpreter取代隱式語言

轉移裝飾功能到decorator

用builder封裝composite

資料泥團

在類的字段和引數列中,總是一起出現的資料 提取類

引入引數物件

保持物件完整

令人迷惑的臨時字段 提取類 引入null object

組合**

許多段**使用不同種類或數量的資料或物件做同樣的事情(例如使用特定條件和資料庫查詢) 以interpreter取代隱式語言

過大類 提取類

提取子類

提取介面

複製被監視資料 以command取代條件排程程式

以state取代狀態改變條件語句

以interpreter取代隱式語言

冗贅類不再做很多任務作或沒有用的類 摺疊繼承關係

內聯singleton

不恰當的暴露

在客戶**中不應看到類的字段和方法,卻是公開可見的 封裝字段

封裝群集

移除設定方法

隱藏方法 用factory封裝類

發散式變化

類經常因為不同的原因在不同方向上發生變化,顯然是違反了單一職責原則 提取類

霰彈式修改

如果遇到變化,必須在不同的類中作出相應的修改 轉移方法

轉移字段

內聯類 將建立知識搬移到factory

依戀情結

方法對於某個類的興趣高過對自己所處的宿主類 轉移方法

提取方法 引入strategy

引入visitor

平行繼承體系

當為乙個類增加乙個子類時,也必須在另乙個類中增加乙個相應的子類 轉移方法

轉移字段

夸夸其談未來性 摺疊繼承關係

內聯類移除引數

移除方法

過度耦合的訊息連

不斷的向乙個物件索求另乙個物件 隱藏委託

提取方法

轉移方法 使用抽象引入chain of responsibility

中間轉手人

類介面中有很多方法都委託給其他類 移除中間轉手人

內聯方法

以繼承取代委託

狎暱關係

類之間彼此依賴於其private成員 轉移方法

將雙向關聯改為單向

提取類隱藏委託

以繼承取代委託

異曲同工的類 重新命名方法

轉移方法

提取超類 用adapter統一介面

不完善的程式庫類 引入外加方法

引入本地擴充套件 用adapter統一介面

用facade封裝類

純稚的資料類

只擁有欄位的資料類 封裝字段

封裝集合

移除設定方法

轉移方法

隱藏方法

被拒絕的遺贈

繼承父類時,子類想要選擇繼承的成員 以委託取代繼承

過多的注釋

為糟糕的**寫大量的注釋 使用一起重構方法,使方法本身達到自說明的效果,讓注釋顯得多餘

怪異解決方案

在同一系統中使用不同的方式解決同一問題 替換演算法

AND一些經驗

目錄 一 參考 1 程式設計師2020工作規範范文 總結 good 適合多看,程式設計師每天 每月做的事情總結了 一 目的 1 在公司來了很久了,有時候一些經驗想把記錄下來,專案 做人 等等 一 專案 1 板卡 pci2012a分為支援和不支援音效卡的 一 做人 1 不要過度依賴別人 1 有問題立馬...

debug的一些經驗

1.儘量減少debug,少用debug,優秀的程式設計師總是花80 的時間來思考如何解決問題,20 的時間來動手完成 而糟糕的程式設計師總是用20 的時間去寫 80 的時間去除錯 動手之前盡量想好如何去做,並且已經為你自己的思路做了充分的實驗。2.盡可能的提高debug的效率,設定合適的斷點,使用快...

t sql的一些經驗

1 儲存過程的3種傳回值 1.以return傳回整數 2.以output格式傳回引數 3.recordset 2 字串型別的變數需要初始化後再使用,不然永遠是空 declare fieldssql varchar max set fieldssql set fieldssql fieldssql a...