• <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
            <2007年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            My Tech blog

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

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

                        
            double dbBase=_unit*_rate;
                        
            double tax=dbBase*Site.TAX_RATE;
                        
            return dbBase+tax;
                    }
                }
            現(xiàn)在使用template method進(jìn)行重構(gòu):
            首先重構(gòu)類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();
                    }
                }
            然后重構(gòu)ResidentialSite:
            public class ResidentialSite:Site
                {
                    
            private double _unit;
                    
            private double _rate;
                    
            public ResidentialSite(double unit,double rate) 
                    {
                        
            //
                        
            // TODO: 在此處添加構(gòu)造函數(shù)邏輯
                        
            //
                        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;
                    }
            最后重構(gòu)LifelineSite:
            public class LifelineSite:Site
                {
                    
            private double _unit;
                    
            private double _rate;
                    
            public LifelineSite(double unit,double rate)
                    {
                        
            //
                        
            // TODO: 在此處添加構(gòu)造函數(shù)邏輯
                        
            //
                        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;
                    }

                    


                }
            可以看到,通過(guò)重構(gòu)首先分離了計(jì)算BaseAmount和計(jì)算TaxAmount的兩個(gè)方法,然后把加和運(yùn)算移動(dòng)到超類Site中。GetTaxAmount由于代碼中存在近似的地方,將更加通用一些的步驟移動(dòng)到超類中,在子類中的重復(fù)部分調(diào)用超類中的方法,然后子類各自對(duì)超類方法進(jìn)行一些修飾來(lái)達(dá)到自己的運(yùn)算目的。

            2、Long Method(過(guò)長(zhǎng)函數(shù))
            “間接層”所能帶來(lái)的全部利益--解釋能力、共享能力、選擇能力--都是由小型函數(shù)支持的。
            讓small method容易理解的真正關(guān)鍵在于一個(gè)好名字。如果你能給函數(shù)起個(gè)好名字,讀者就可以通過(guò)名字了解函數(shù)的作用,根本不必去看其中寫了些什么。
            最終的效果是:你應(yīng)該更積極進(jìn)取的分解函數(shù),我們遵循這樣一條原則:每當(dāng)感覺(jué)需要以注釋來(lái)說(shuō)明點(diǎn)什么的時(shí)候,我們就把需要說(shuō)明的東西寫進(jìn)一個(gè)獨(dú)立的函數(shù)中,并以其用途(而非實(shí)現(xiàn)手法)命名。我們可以對(duì)一組或者甚至短短一行代碼做這件事。哪怕替換后的函數(shù)調(diào)用動(dòng)作比函數(shù)本身還長(zhǎng),只要函數(shù)名稱能夠解釋其用途,我們也該毫不猶豫地那么做。關(guān)鍵不在于函數(shù)的長(zhǎng)度,而在于函數(shù)“做什么”和“如何做”之間的語(yǔ)義距離。
            百分之九十的場(chǎng)合里,要把函數(shù)變小,只需要Extract Method。找到函數(shù)中適合集中在一起的部分,將它們提煉出來(lái)形成一個(gè)新函數(shù)。
            如果函數(shù)內(nèi)有大量的參數(shù)和臨時(shí)變量,他們會(huì)對(duì)你的函數(shù)提煉形成阻礙。如果你嘗試用Extract Method,最終就會(huì)把許多這些參數(shù)和臨時(shí)變量當(dāng)作參數(shù),傳遞給被提煉出來(lái)的新函數(shù),導(dǎo)致可讀性幾乎沒(méi)有任何提升。可以消除臨時(shí)元素的方法有:
            Replace Temp with Query;
            Introduce Parameter Object;
            Preserve Whole Objet;
            確定該提煉哪一段代碼的很好的技巧就是:尋找注釋。他們通常是指出“代碼用途和實(shí)現(xiàn)手法間的語(yǔ)義距離”的信號(hào)。如果代碼前方有一行注釋,就是在提醒你:可以將這段代碼替換成一個(gè)函數(shù)。而且可以在注釋基礎(chǔ)上給這個(gè)函數(shù)命名。條件式循環(huán)也常常是提煉的信號(hào)。你可以使用Decompose Conditional處理?xiàng)l件式。至于循環(huán),你應(yīng)該將循環(huán)和其內(nèi)的代碼提煉到一個(gè)獨(dú)立函數(shù)中。
            posted on 2007-06-26 23:32 littlegai 閱讀(162) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 精品久久久中文字幕人妻| 精品国产一区二区三区久久| 99久久无码一区人妻a黑| 久久精品国产亚洲综合色| 91亚洲国产成人久久精品网址| 91精品国产91久久| 色欲久久久天天天综合网精品| 精品国产乱码久久久久久浪潮| 午夜久久久久久禁播电影| 久久精品无码一区二区三区免费| 亚洲乱码中文字幕久久孕妇黑人| 精品久久久久久无码中文字幕| 国产V亚洲V天堂无码久久久| 老男人久久青草av高清| 久久久久一级精品亚洲国产成人综合AV区 | 久久强奷乱码老熟女网站| 新狼窝色AV性久久久久久| 性做久久久久久久久老女人| 四虎国产永久免费久久| 久久亚洲AV成人出白浆无码国产| 欧美精品九九99久久在观看| 国产激情久久久久影院老熟女| 精品一区二区久久| 国产亚洲精久久久久久无码| 97久久国产露脸精品国产| 久久影视国产亚洲| 亚洲国产成人久久综合碰碰动漫3d| 久久久久99精品成人片欧美| 国产成人精品久久| 伊人久久久AV老熟妇色| 久久精品国产亚洲AV久| 狠狠色丁香婷婷久久综合| 日韩精品无码久久一区二区三| 久久久精品久久久久特色影视| 国产精品九九久久免费视频 | 人妻少妇久久中文字幕| 亚洲综合精品香蕉久久网| 色综合久久久久久久久五月| 日韩久久久久久中文人妻| 久久精品a亚洲国产v高清不卡|