• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 181  文章 - 15  trackbacks - 0
            <2009年2月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            1234567

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            My Tech blog

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            代碼的壞味道
            1、重復的代碼(duplicated code)
             最單純的重復代碼就是,同一個class內的兩個函數含有相同的表達式。此時需要使用Extract Method,提煉出重復的代碼,然后讓這兩個地方都調用被提煉出來的那一段代碼。
            另一種情況就是,兩個兄弟子類中含有相同的表達式。在這種情況下,只要對兩個子類都使用Extract Method,然后再對提煉出來的代碼使用pull up method將它推入超類中。如果代碼之間只是類似,并非完全相同,那么就使用Extract Method把相似部分和差異部分分割開,構成單獨一個函數,然后就能夠使用form template method獲得一個template method設計模式.

            下面跳到后面去看一下template method:
            將各個措施放到獨立的函數中,并保持它們具有相同的簽名式,原函數也就變得相同了。然后將原函數上移到superclass。
            下面是仿照書中寫的例子。首先是Site類
            public abstract class Site
                {
                    
            public const float TAX_RATE=(float)0.5;
                    
            public abstract double GetBillAbleAmount();
                }
            現在有兩個類LifelineSite和ResidentialSite分別繼承自Site類并實現了方法GetBillAbleAmount
            LifelineSite:
            public class LifelineSite:Site
                {
                    
            private float _unit;
                    
            private float _rate;
                    
            public LifelineSite(float unit,float rate)
                    {
                        
            //
                        
            // TODO: 在此處添加構造函數邏輯
                        
            //
                        this._unit=unit;
                        
            this._rate=rate;
                    }
                    
            public override double GetBillAbleAmount()
                    {

                        
            double dbBase=_unit*_rate*0.5;
                        
            double tax=dbBase*Site.TAX_RATE*0.2;
                        
            return dbBase+tax;
                    }
                }
            ResidentialSite:
            public class ResidentialSite:Site
                {
                    
            private float _unit;
                    
            private float _rate;
                    
            public ResidentialSite(float unit,float rate) 
                    {
                        
            //
                        
            // TODO: 在此處添加構造函數邏輯
                        
            //
                        this._unit=unit;
                        
            this._rate=rate;
                    }
                    
            public override double GetBillAbleAmount()
                    {

                        
            double dbBase=_unit*_rate;
                        
            double tax=dbBase*Site.TAX_RATE;
                        
            return dbBase+tax;
                    }
                }
            現在使用template method進行重構:
            首先重構類Site:
                public abstract class Site
                {
                    
            public const double TAX_RATE=0.5;
                    
            public abstract double GetBaseAmount();
                    
            public virtual double GetTaxAmount()
                    {
                        
            return GetBaseAmount()*TAX_RATE;
                    }
                    
            public virtual double GetBillAbleAmount()
                    {
                        
            return GetBaseAmount()+GetTaxAmount();
                    }
                }
            然后重構ResidentialSite:
            public class ResidentialSite:Site
                {
                    
            private double _unit;
                    
            private double _rate;
                    
            public ResidentialSite(double unit,double rate) 
                    {
                        
            //
                        
            // TODO: 在此處添加構造函數邏輯
                        
            //
                        this._unit=unit;
                        
            this._rate=rate;
                    }
            //        public override double GetBillAbleAmount()
            //        {
            //
            //            double dbBase=_unit*_rate;
            //            double tax=dbBase*Site.TAX_RATE;
            //            return dbBase+tax;
            //        }
                    public override double GetBaseAmount()
                    {
                        
            return _unit*_rate;
                    }
            最后重構LifelineSite:
            public class LifelineSite:Site
                {
                    
            private double _unit;
                    
            private double _rate;
                    
            public LifelineSite(double unit,double rate)
                    {
                        
            //
                        
            // TODO: 在此處添加構造函數邏輯
                        
            //
                        this._unit=unit;
                        
            this._rate=rate;
                    }
            //        public override double GetBillAbleAmount()
            //        {
            //
            //            double dbBase=_unit*_rate*0.5;
            //            double tax=dbBase*Site.TAX_RATE*0.2;
            //            return dbBase+tax;
            //        }
                    public override double GetBaseAmount()
                    {
                        
            return _unit*_rate*0.5;
                    }
                    
            public override double GetTaxAmount()
                    {
                        
            return base.GetTaxAmount()*0.2;
                    }

                    


                }
            可以看到,通過重構首先分離了計算BaseAmount和計算TaxAmount的兩個方法,然后把加和運算移動到超類Site中。GetTaxAmount由于代碼中存在近似的地方,將更加通用一些的步驟移動到超類中,在子類中的重復部分調用超類中的方法,然后子類各自對超類方法進行一些修飾來達到自己的運算目的。

            2、Long Method(過長函數)
            “間接層”所能帶來的全部利益--解釋能力、共享能力、選擇能力--都是由小型函數支持的。
            讓small method容易理解的真正關鍵在于一個好名字。如果你能給函數起個好名字,讀者就可以通過名字了解函數的作用,根本不必去看其中寫了些什么。
            最終的效果是:你應該更積極進取的分解函數,我們遵循這樣一條原則:每當感覺需要以注釋來說明點什么的時候,我們就把需要說明的東西寫進一個獨立的函數中,并以其用途(而非實現手法)命名。我們可以對一組或者甚至短短一行代碼做這件事。哪怕替換后的函數調用動作比函數本身還長,只要函數名稱能夠解釋其用途,我們也該毫不猶豫地那么做。關鍵不在于函數的長度,而在于函數“做什么”和“如何做”之間的語義距離。
            百分之九十的場合里,要把函數變小,只需要Extract Method。找到函數中適合集中在一起的部分,將它們提煉出來形成一個新函數。
            如果函數內有大量的參數和臨時變量,他們會對你的函數提煉形成阻礙。如果你嘗試用Extract Method,最終就會把許多這些參數和臨時變量當作參數,傳遞給被提煉出來的新函數,導致可讀性幾乎沒有任何提升。可以消除臨時元素的方法有:
            Replace Temp with Query;
            Introduce Parameter Object;
            Preserve Whole Objet;
            確定該提煉哪一段代碼的很好的技巧就是:尋找注釋。他們通常是指出“代碼用途和實現手法間的語義距離”的信號。如果代碼前方有一行注釋,就是在提醒你:可以將這段代碼替換成一個函數。而且可以在注釋基礎上給這個函數命名。條件式循環也常常是提煉的信號。你可以使用Decompose Conditional處理條件式。至于循環,你應該將循環和其內的代碼提煉到一個獨立函數中。
            posted on 2007-06-26 23:32 littlegai 閱讀(161) 評論(0)  編輯 收藏 引用
            亚洲欧洲日产国码无码久久99 | 狠狠色丁香婷婷久久综合不卡| 亚洲AV无码一区东京热久久| 久久精品成人免费看| 久久亚洲欧洲国产综合| 久久久久女人精品毛片| 久久成人18免费网站| 国产精品99久久免费观看| 久久综合色之久久综合| av午夜福利一片免费看久久| 亚洲国产成人久久综合区| 伊人久久综合热线大杳蕉下载| 久久只有这里有精品4| 亚洲国产成人久久综合碰碰动漫3d | 日韩人妻无码一区二区三区久久99| 国产精品久久久久久一区二区三区| 久久久久香蕉视频| 99热热久久这里只有精品68| 久久天天躁狠狠躁夜夜不卡| 久久久精品久久久久特色影视| 2021久久国自产拍精品| 久久亚洲AV成人无码电影| 亚洲精品无码久久千人斩| 久久天天日天天操综合伊人av| 日本久久久久久中文字幕| 国产亚洲综合久久系列| 嫩草伊人久久精品少妇AV| 亚洲色欲久久久综合网东京热| 日韩亚洲国产综合久久久| 欧美午夜A∨大片久久| 久久影视综合亚洲| 久久综合成人网| 亚洲国产精品嫩草影院久久| 香港aa三级久久三级老师2021国产三级精品三级在| 好久久免费视频高清| 亚洲一区中文字幕久久| 91精品日韩人妻无码久久不卡 | 久久精品国产91久久综合麻豆自制 | 久久婷婷五月综合国产尤物app| 久久久这里有精品| 亚洲va久久久噜噜噜久久狠狠|