【重構學習】07 數據的重構

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

這裡的數據指的大概就是欄位(貌似這章有些東西也是過時了,因為現在的.NET已經發展了很久了,包括Java也是)1、自封裝欄位(其實就是屬性啦,過時了)修改點:直接訪問欄位,但是與欄位間的耦合關係逐漸變得笨拙做法:為這個欄位建立一個取值/設值函數,並且只以這些函數來訪問數據好吧,現在明白屬性是怎麼來的...


這裡的數據指的大概就是欄位(貌似這章有些東西也是過時了,因為現在的.NET已經發展了很久了,包括Java也是)

1、自封裝欄位(其實就是屬性啦,過時了)

修改點:直接訪問欄位,但是與欄位間的耦合關係逐漸變得笨拙

做法:為這個欄位建立一個取值/設值函數,並且只以這些函數來訪問數據

好吧,現在明白屬性是怎麼來的了嗎,就是因為這個原因,所以有的人會幹脆和你說,你不要寫公共欄位,直接寫公共屬性。

因為公共欄位能做的公共屬性都能做,不能做的公共屬性也能做。

public string 我叫公共屬性 { get; set; }

多寫個這東西好用多了,以後萬一有個什麼反射的需要,也簡單多了,舉手之勞,所以忘記還有公共欄位這回事吧。

2、以對象取代欄位

修改點:你有一個欄位,需要與其它數據和行為一起使用才有意義

做法:用對象取代欄位

簡單地說,你玩過DateTime這個類嗎,就是系統的類,其實就是對數據的一個封裝啊。

如果沒有這個東西,那麼你是不是要用年,月,日(就算沒有時分秒吧),三個欄位來表示。搞的多了自然就像自己封裝一個Date類,哪天又多了個按格式輸出的要求,是不是要再寫個格式化函數

所以那麼就把這些好基友都放在一起好了,於是DateTime就成了基友之家。(然而我們需要更多的DateTime樣的基友之家)

3、將值對象改為引用對象

修改點:你從一個類衍生出許多彼此相等的實例,希望將它們替換為同一個對象

做法:將這個值對象變為引用對象

簡單地說,這裡所謂的值對象是指DateTime這種對象,即可以建立很多次,純數據的傳遞,而所謂的引用對象是指緩存的東西,比如淘寶界面的分類數據,因為所有人看到的分類都是一樣的,那麼我們不需要每次都從資料庫取值

緩存一下就好,不需要每次New一個分類對象,然後調用查詢函數,而是去找緩存去看是否有了緩存,有了緩存,那麼就調用,沒有緩存那麼就再從資料庫裡面取值。只要緩存一更改,大家看到的分類就都更改了。

好了,就是這麼個意思

其中為了適應也許引用對象會根據不同的類型創建一個不同的對象,(就像有個牆類,上節課Troy教小朋友們如何搬磚砌牆,所以新建正常的牆的對象,這節課話題換了,Troy教小朋友們碼長城,於是就新建一個長城對象)

當涉及到切換子類的時候,可以用這種方法使得客戶端調用的時候不需要知道還有長城這個類,只需要用牆類里的工廠函數就好了,當然也許你下次還得搞個扛水泥去搞個水泥牆的類,那麼在 工廠函數里再加就好了。

所以提到的一個重構方法:

將構造函數改為調用工廠函數,即

 public class Wall{
        public Wall(string length){
            //啦啦啦
        }
   }

改為

public class Wall{
        public static Wall Create(string type){
            if (type=="Great"){
                return new GreatWall("一萬里");
            }
            else{
                return new Wall("一米");
            }
        }
        protected Wall(string length)
        {
            //啦啦啦
        }
    }
    public class GreatWall:Wall
    {
        public GreatWall(string length):base(length)
        {
            //啦啦啦
        }
    }

這種方法的用處在於客戶調用不需要去知道子類,只需要知道type就行了,當然具體情況具體對待,你也可以不用這麼寫

然後這個所謂的引用變數的穩妥一點的做法還是要判斷一下這個對象存不存在,不存在就去取值,存在就直接調用。

4、將引用對象改為值對象

  是的,你沒有看錯,當你千辛萬苦改成了值對象之後,有個需求第二天可能又會讓你改回來。。

  動機:因為你的引用對象很小且不可變,而且不易管理。

  不可變是什麼鬼?我看了《重構》這個看了半天,最後才弄明白。

  還是用分類緩存來說,淘寶的緩存就是可變的,因為淘寶的緩存假如作為商家的你可以自己去去增加分類,然後刷新它,那麼所有的客戶得到的分類都變了。

  那麼不可變是就是:

  

  我在本地把百度首頁改成這樣,但是你們這些人並不知道我已經在用谷歌了╮(╯▽╰)╭

 

  換句話說,有天,馬老闆說咱淘寶分類就這麼搞了,無論怎樣就這麼多分類了,不許商家去增加分類,那麼,這個緩存就是不可變的了,某天他說不要那麼多分類了,就假貨和真貨兩個類的時候,那麼引用對象足夠小了

  那麼這個引用對象也就不需要了,改成值對象就好了,比如像百度一下直接作為文本,寫死在頁面上了。

  好吧,我就是這麼理解的。

  正經話:引用對象就是客戶公用的,當我去改動後,其他客戶看到的也就變了,而值對象不是,當我改動後只有我自己這邊變了。(懂了嗎,我覺得自己已經講得很清楚了)

5、以對象取代數組

  修改點:你有一個數組,其中的元素代表不同的東西

  做法:以對象替換數組,對於數組中的每個東西,以一個欄位來表示。

  換句話說,有個混蛋把DateTime的年月日寫在一個int date[3];這樣的東西裡面,其中date[0]代表年,date[1]代表月,你是否想要打死他?

  --未完待續

 


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

-Advertisement-
Play Games
更多相關文章
  • 為什麼要對資料庫進行設計? 當我們要存儲的數據比較少的是後當然不需要對資料庫進行設計,但是當我們對數據的需求量越來越大時對資料庫的設計就很有必要性了!如果資料庫的設計不當會造成數據冗餘、修改複雜、操作數據異常等問題而好的資料庫設計則可以減少不必要的數據冗餘,通過合理的數據規劃提高系統的性能! 什麼是...
  • 在實際的項目開發中我們可能經常要修改已有的代碼,可能我們經常說開閉原則對已有的代碼不准修改,但是實際上很難,那麼下麵的3種方法也許能幫助我們改善對代碼的修改。1:新生方法有時候在我們開發的時候需要像系統加入新的功能時候這個時候我們就可能改變我們原有方法的結構。那麼下麵有一個簡單例子以前添加用戶的.....
  • 1、創建webapi項目,提供介面方法如下:/// /// 獲取租戶、位置下的所有感測器 /// /// [AcceptVerbs("POST")] [Route("api/Sensors/GetSensors")] ...
  • publicstaticvoidDebugFunctionTree(stringmessage){try{System.Diagnostics.StackTracest=newSystem.Diagnostics.StackTrace();System.Diagnostics.StackFrame....
  • 目 錄第十三章 中英文版本切換設計... 213.1 不用自帶的資源文件的理由... 213.2 配置文件... 213.3 語言管理類... 313.4 應用管理類... 1213.5 小結... 12第十三章 中英文版本切換設計13.1 不用自帶的資源文件的理由 可以利用resx資源文件進行多語...
  • json序列化和反序列化幫助類:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;using System.Runt...
  • // /// 遞歸獲取文件夾目錄下文件 /// /// 需要遞歸遍歷的文件夾 /// 遍歷規則『委托』 public static void LoopFolder(string pathName, Action fileRul...
  • 前臺: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...