【重構學習】10 繼承關係的重構

来源:http://www.cnblogs.com/vvjiang/archive/2016/01/10/5118872.html
-Advertisement-
Play Games

1、欄位上移修改點:兩個子類擁有相同的欄位做法:將該欄位移至父類2、函數上移修改點:有些函數,在各個子類中產生完全相同的效果做法:將該函數移至父類有一種特殊情況也需要這麼做:子類函數覆蓋了父類的,但是仍然做著相同的工作在此重構中你可能會遇到一種情況,就是你提煉的函數調用了子類有而父類沒有的函數,那麼...


1、欄位上移

修改點:兩個子類擁有相同的欄位

做法:將該欄位移至父類

2、函數上移

修改點:有些函數,在各個子類中產生完全相同的效果

做法:將該函數移至父類

有一種特殊情況也需要這麼做:子類函數覆蓋了父類的,但是仍然做著相同的工作

在此重構中你可能會遇到一種情況,就是你提煉的函數調用了子類有而父類沒有的函數,那麼在父類中給此父類沒有的函數,建立一個虛函數即可。

3、構造函數本體上移

修改點:你在各個子類中擁有一些構造函數,它們的本體幾乎完全一致

做法:在父類中新建一個構造函數,併在子類構造函數中調用它。

4、函數下移

修改點:父類中的某個函數只與部分(而非全部)子類有關

做法:將這個函數移到相關的那些子類去。

5、欄位下移

修改點:父類中某個欄位只被部分(而非全部)子類用到

做法:講這個欄位下移到相關的子類去。

6、提煉子類

修改點:類中的某些特性只被某些(而非全部)實例用到

做法:新建一個類,將上面所說的那一部分特性移至子類

7、提煉父類

修改點:兩個類有相似特性

做法:為這兩個類建立一個父類,將相同特性移至超類

8、提煉介面

修改點:若幹客戶使用類介面中的同一子集,或者兩個類的介面有部分相同

做法:將相同子集提煉到一個獨立介面

意思很簡單,就是將一個類里的一些業務相關的函數,或者是兩個類中部分相同的函數,提取為Interface(這裡不用介面用個英文的原因是在前面的文章中介面一詞可能更多的可以理解為一個類的公共函數)

9、摺疊繼承體系

修改點:父類和子類無太大區別

做法:將它們合為一體

10、塑造模版函數

修改點:你有一些子類,其中相應的某些函數以相同順序執行類似的操作,但各個操作的細節上有所不同

做法:將這些操作分別放進獨立函數中,並保持它們具有相同的簽名,於是原函數也就變得相同了,然後將原函數上移至父類

意思很簡單,就是說你看見有些函數的具體操作不同,但是幾個函數的組合操作順序是一樣的,那麼就把它們的操作順序提煉成函數放進父類。

11、以委托取代繼承

修改點:某個子類只使用父類介面的一部分,或是根本不需要繼承來的數據

做法:在子類中新建一個欄位用以保存父類;調整子類函數,令它改而委托超類;然後去掉兩者之間的繼承關係

動機:隨著需求的變化,一開始的繼承關係可能在慢慢變化後,你就發現父類中的許多操作並不適用於子類

Troy:這個時候你當然可以去把這些不適用子類的方法去搞到另一個子類里,但是如果做不到,那麼就將父類對象作為子類的一個對象吧,去掉繼承關係,這在設計模式裡面貌似可以叫組合模式

12、以繼承取代委托(看吧看吧,總是有相反的兩個重構操作出現

修改點:你在兩個類之間使用委托關係,並經常為整個介面編寫許多極簡單的委托函數

做法:讓委托類繼承受托類

兩條告誡:

1.如果你並沒有使用受托類的所有函數。那麼你可能不需要使用此方法,你可以去去除中間人,用客戶端直接調用受托類,也可以把委托類和受托類之間提煉出一個超類,當然也可以提取介面

2.受托對象被不止一個其他對象共用,而且受托對象是可變的。那麼這種情況下你也不應該用此重構,因為這樣就無法共用數據了,數據共用是委托關係承擔的一種責任,你無法把它轉化為繼承關係。如果受托對象不可變你才能這麼做。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵! 《桃花庵--程式員版》寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;別人笑我太瘋癲,我笑自己命...
  • 有時候忘掉了mysql的root密碼,這種情況下,如何重置root的密碼呢?找到並編輯mysql的my.ini配置文件,在mysqld節點中添加上skip-grant-table. 如下:[mysqld]# These let you safely reset the lost root passw...
  • 集合運算符是針對兩個集合操作的,兩個集合必須有相同的列數;列具有相同的數據類型(至少能夠隱式轉換的);最終輸出的集合的列名是,由第一個集合的列名來確定的(可以用來連接多個結果)。註意:聯合【Union】與連接不一樣【Join】。 聯合:將多個結果集,合併為一個結果集。Union(去除重覆,相當...
  • 在前陣子寫的一篇博文“SQL SERVER 2014 下IF EXITS 居然引起執行計劃變更的案例分享”里介紹了資料庫從SQL SERVER 2005升級到 SQL SERVER 2014後,發現一個SQL出現性能問題,當時分析後發現執行計劃變了,導致SQL出現了性能問題。但是沒有徹底搞清楚為什麼...
  • 1.在代碼里實現this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題欄,this指當前的Activity這句代碼一定要加在setContentView()前面。this.requestWindowFeature(Window.FEATUR...
  • 圖像的亮度, 指的是圖像像素的強度, 黑色為最暗, 白色為最亮, 在ios中黑色用0來表示, 白色用1來表示.一個像素, 基本上是用RGB三個顏色分量來表示的. R(0-1), G(0-1),B(0-1). 亮度調整有多種計算方法,效果並不完全相同,在顏色的表示方法中, HSL(L)表示法就是...
  • 本文章轉接於:http://kofi1122.blog.51cto.com/2815761/521605Android中常常使用shape來定義控制項的一些顯示屬性,今天看了一些shape的使用,對shape有了大體的瞭解,稍作總結:先看下麵的代碼: solid:實心,就是填充的意思...
  • Charles —— 青花瓷 網路抓包工具 可以攔截 iPhone/Android 手機中 App 的 網路請求數據 使用 手機&電腦在同一個區域網 確保電腦能夠通過路由器訪問互聯網 電腦安裝 啟動 ,禁用 & 設置手機的網路代理 : 電腦的 ip : 8888 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...