【重構學習】08 條件表達式的重構

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

所謂條件表達式,就是分支語句,去掉分支語句咯1、分解條件表達式修改點:你有一個複雜的條件語句(就是if else語句)做法:將條件表達式的三個部分分別提煉出獨立函數即 if (A部分) { B部分; } ...


所謂條件表達式,就是分支語句,去掉分支語句咯

1、分解條件表達式

修改點:你有一個複雜的條件語句(就是if else語句)

做法:將條件表達式的三個部分分別提煉出獨立函數

            if (A部分)
            {
                B部分;
            }
            else {
                C部分;
            }    

這三個部分都提煉成函數就好了。

2、合併條件表達式

修改點:你有一系列測試,都得到相同結果

做法:將這些測試合併成一個條件表達式,並將這個表達式提煉成一個獨立函數

3、合併重覆的條件片段

修改點:在條件表達式的每個分支上有著相同一段代碼

做法:將這段重覆代碼搬移到條件表達式之外

4、移除控制標記

修改點:在一系列布爾表達式中,某個變數帶有“控制標記”(control flag)的作用。

做法:以break語句或return語句取代控制標記

            bool isILoveYou=true;
            int[] loveNum=new int[100];
            for (int i=0; i < 100; i++) {
                if (isILoveYou) {
                    if (某種原因) {
                        isILoveYou = false;
                    }
                    Console.WriteLine(loveNum[i]);
                }
            }        

而isILoveYou就是控制標記,所以可以用continue,break,return這類跳出語句去移除控制標記

5、以衛語句取代嵌套條件表達式

修改點:函數中的條件邏輯使人難以看清正常的執行路徑

做法:使用衛語句表現所有情況。

如果某個條件極其罕見,就應該單獨檢查該條件,併在該條件為真時立刻從函數中返回,這樣的語句被稱為“衛語句”。

6、以多態取代條件表達式

修改點:你手上有個條件表達式,它根據對象類型的不同而選擇不同的行為

做法:將這個條件表達式的每個分支放進一個子類內的覆蓋函數中,然後將原始函數聲明為抽象函數。

如果你搞不清楚的話,你可以看一看我在 7、數據的重構 裡面的第14點的代碼,也許你會更清楚一點。

7、引入NULL對象

修改點:你需要再三檢查某對象是否為NULL

做法:將NULL值替換為null對象

用了NULL值的代碼:

class Program
    {
        static void Main(string[] args)
        {
            var roomList = new List<Room>();
            roomList.Add(new Room("低級房",new People("A先生")));
            roomList.Add(new Room("高級房"));

            foreach (var room in roomList) {
                if (room.Master != null) {
                    Console.WriteLine(room.Master.Name);
                }
            }
            Console.ReadKey();
        }
    }

    public class Room {
        public Room(string roomName,People people=null)
        {
            this.RoomName = roomName;
            this.Master = people;
        }
        public string RoomName { get; set; }
        public People Master { get; set; }
    }
    public class People
    {
        public People(string name) {
            this.Name = name;
        }
        public string Name { get; set; }
    }

改為

class Program
    {
        static void Main(string[] args)
        {
            var roomList = new List<Room>();
            roomList.Add(new Room("低級房",new People("A先生")));
            roomList.Add(new Room("高級房"));

            foreach (var room in roomList) {
                Console.WriteLine(room.RoomName + ":" + room.Master.Name);
            }
            Console.ReadKey();
        }
    }

    public class Room {
        public Room(string roomName,People people=null)
        {
            this.RoomName = roomName;
            this.Master = people;
        }
        public string RoomName { get; set; }
        public People Master { 
            get{
                return  _master==null?new NullPeople():_master;
            }
            set {
                _master = value;
            }
        }

        People _master;
    }
    public class People
    {
        public People()
        {
        }
        public People(string name) {
            this.Name = name;
        }
        public virtual string Name { get; set; }
        public virtual bool IsNULL()
        {
            return false;
        }
        public static People CreateNullPeople()
        {
            return new NullPeople();
        }
    }
    public class NullPeople:People{
        public NullPeople():base() { 
        
        }
        public override bool IsNULL(){
            return true;
        }
        public override string Name
        {
            get
            {
                return "無人";
            }
        }
    }

在這裡不繼承people可能更好一點,都繼承一個自定義的介面IsNULLPeople,代碼更好看一點。


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

-Advertisement-
Play Games
更多相關文章
  • 一,c#中的值類型和引用類型 眾所周知在c#中有兩種基本類型,它們分別是值類型和引用類型;而每種類型都可以細分為如下類型: 什麼是值類型和引用類型什麼是值類型:進一步研究文檔,你會發現所有的結構都是抽象類型System.ValueType的直接派生類,而System.ValueType本身又是直接....
  • 一、前言 AgileEAS.NET SOA 中間件平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(組件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。 AgileEAS....
  • 1. ExcelUtility功能:  1.將數據導出到EXCEL(支持XLS,XLSX,支持多種類型模板,支持列寬自適應)  類名:ExcelUtility. Export  2.將EXCEL數據導入到數據對象中(DataTable、Dataset,支持XLS,XLSX) ...
  • 【實例說明】 本例關鍵點是練習使用^的使用,沒有什麼技術含量,大牛勿噴。呵呵。。 在介紹實例之前先來剪短瞭解一下加密的概念。 加密是指通過某種特殊的方法,更改已有信息的內容,使得未授權的用戶即使得到了加密的信息,如果沒有正確解密的方法,那麼也無法得到信息的內容。 談到加密的話題,一些讀者朋友一定非常...
  • Cron Expressions——Cron 表達式按順序依次為秒(0~59)分鐘(0~59)小時(0~23)天(月)(0~31,但是你需要考慮你月的天數)月(0~11)天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)7.年份(1970-2099)其中每個...
  • 來源:http://zxlovenet.cnblogs.com聲明:本文原創發表於博客園,作者為初行本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。從安裝到配置首先到官網http://www.nunit.org/下載如下圖的資料,安裝NUnit-2.6....
  • 主要介紹一下C#的delegate的用法以及如何實現類似javascript的each方法,並簡要說明delegate,Func, Action和 Predicate的區別
  • 前言最近在幫一家知名外企開發Universal Windows Platform的相關應用,開發過程中不由感慨:項目分為兩種,一種叫做前人栽樹後人乘涼,一種叫做前人挖坑後人遭殃。不多說了,多說又要變成月經貼了。講講MEF。MEF全稱Managed Extensibility Framework。我們...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...