亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【重構學習】09函數調用的重構

2019-11-14 13:35:04
字體:
來源:轉載
供稿:網友

之前寫了個函數的重構,這里寫的是函數的調用的重構,不同哦,是為了寫出讓別人好調用的函數(或接口)。

1、函數改名

修改點:函數的名稱未能提示函數的用途。

做法:修改函數的名稱

如果你想給函數寫上一句什么注釋,那么你就把這個注釋想辦法作為名稱寫上好了。

Martin原話:

你可能無法第一次就取一個好名字,這個時候你就會想,就這么將就著吧,畢竟這只是一個名稱。

當心,這是惡魔的召喚,是通向混亂之路,千萬不要被它誘惑。

我就無數次被誘惑,然后取了很多渣名,因為想一個好名字真是太難了,除非我把函數名寫很長

2、添加參數

修改點:某個函數需要從調用端得到更多信息

做法:為此函數添加一個對象參數,讓該對象帶進函數所有信息。

3、移除參數(好吧,相比第二點,很多人可能會嫌麻煩不去搞這個,惡魔的誘惑哦

修改點:函數本體不再需要某個參數

做法:將該參數去除

4、將查詢函數和修改函數分離所以直接用屬性就好了啊

修改點:某個函數既返回對象狀態值,又修改對象狀態

做法:建立兩個不同的函數,其中一個負責查詢,又負責修改

存在例外哦,就是并發場景下同時查詢與修改的操作,那么你仍應該分離,但是單獨寫一個函數去同時進行這兩個事情。

5、令函數攜帶參數

修改點:若干函數做了類似工作,但在函數本體中卻包含不同的值

做法:建立單一函數,以參數表達那些不同的值

簡單來說,就是兩個函數有很多相同部分,就幾個值不同,你把這幾個值作為函數參數,那么就可以把兩個函數合二為一

6、以明確函數替代參數(與5相反哦

修改點:你有一個函數,其中完全取決于參數值而采用不同行為(看好是完全

做法:針對該參數的每一個可能值,建立一個獨立函數

意思就是說你根據參數的判斷而采取不同的行為,那么你完全可以分成幾個函數來實現。

而如果影響并不是很大,用5就好了,如果確實需要條件判斷,那么可以考慮使用多態來消除條件判斷

7、保持對象完整

修改點:你從某個對象中去除若干值,將它們作為某一次函數調用時的參數

做法:改為傳遞整個對象

動機:萬一將來函數需要新的數據項,你就必須查找并修改對此函數的所有調用。而且這樣也能提高整個代碼的可讀性。

但是也有例外:如果你穿的是數值,那么函數就僅僅依賴于數值,但是如果是對象,那么依賴的就是整個對象,這有可能會造成你的結構惡化,所以你得具體情況具體分析。

不過如果一個函數使用了另外一個對象很多的值,那么你可能需要考慮是不是需要把這個函數放在那個對象所屬的類里面了。

 8、以函數取代參數

修改點:對象調用某個函數,并將所有結果作為參數,傳遞給另外一個函數

做法:讓參數接受者去除該項參數,并直接調用前一個函數

動機:如果函數可以通過其它途徑獲取參數值,那么它就不應該通過參數取得該值。過長的參數列會增加程序員的理解難度,因此應該盡可能縮短參數列的長度。

9、引入參數對象

修改點:某些參數總是很自然地同時出現

做法:以一個對象取代這些參數

之前在何處重構里已經講過了,其它的章節貌似也涉及到了。這種類其實也有其他的好處,比如你建立了這樣一個類,說不定有些函數就可以放到這個類里,讓代碼結構更清晰。

10、移除設置函數

修改點:類中的某個字段應該在對象創建時被設值,然后就不再改變

做法:去掉該字段的所有設置函數

意思就是說如果初始化的時候就不需要改變某個字段,那么你就不要去添加設置函數,這樣會讓意圖不明確。

11、隱藏函數

修改點:有一個函數,從來沒有被其他任何類用到

做法:將這個函數修改為PRivate

還是這個意思,讓調用者看到他們應該看到的,和想看到的,不要暴露給他們過多的信息,越簡單越好,他們用起來越方便,也有利于安全性。

12、以工廠函數替代構造函數

修改點:你希望在創建對象時不僅僅是做簡單的建構工作。

做法:將構造函數替換為工廠函數

很簡單,在數據的重構里第14點我的例子就是這樣的。

    public class Room    {        public Room() {                 }        public static Room CreateRoom()        {            return new Room();        }    }

這個東西用來多態去除類型碼,去除過多的條件表達式特別有效

也就是在CreateRoom里用來判斷Room類型來創建Room的不同子類,當然在類型較少的情況下,你也可以加多個工廠函數,分別創建不同的子類

13、封裝向下轉型

修改點:某個函數返回的對象,需要由函數調用者執行向下轉型。

做法:將向下轉型動作移到函數中

簡單例子:

    public class Room    {        public Room() {                 }        public Object GetRandRoom() {            return RoomList.GetRandRoom(new Random().Next());        }    }

應該轉為

     public class Room    {        public Room() {                 }        public Room GetRandRoom() {            return (Room)RoomList.GetRandRoom(new Random().Next());        }    }

也就是說有些系統函數或者別人寫的函數經過處理后返回一個object對象,但是你知道這個object對象是Room類型,那么請把它轉化為Room類型,也就是說盡量在更底層就轉型,而不是在調用端轉型,這個增加調用者的理解難度。

這種情況可能會在返回迭代器或者集合的函數身上發生

不過貌似我們.NET幾乎不會出現這種情況,起碼我遇到的代碼就沒見過,是我見過的代碼太少呢,還是說大家都很厲害的樣子,避開了這個坑。

14、以異常取代錯誤碼

修改點:某個函數返回一個特定的代碼,用以表示某種錯誤情況

做法:改為拋異常

好吧這個應該不用我來說了吧,不過很多人(包括我)都習慣返回錯誤碼,因為簡單,大家共勉,以圖改進吧。

順便提一點,對.NET的錯誤機制,也就是try catch finally throw這幾個東西用到時候要小心點,這個東西存在很多的爭議,就是你拋出的異常應該是可控的異常,而不應該是不知道是什么鬼的異常,如果是不知道是什么鬼的異常就應該立馬解決了,而不是吞掉。

15、以條件判斷取代異常

修改點:面對一個調用者可以預先檢查的條件,你拋出一個異常

做法:修改調用者,使它在調用函數之前先做檢查。

好吧,這個東西也就是消除異常,也就是說比如這個異常你可以提前預料到,你就應該去直接用個某種手段去檢查,檢查不通過就返回你catch后執行的操作,而不是不去檢查,直接try catch。坦白說,其實try catch里的代碼越少越好,因為找到異常后定位異常也需要資源。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大秀在线观看| 欧美日韩xxx| 日韩一中文字幕| 亚洲伊人一本大道中文字幕| 亚洲的天堂在线中文字幕| 久久久久国产精品www| 日韩av在线免费播放| 91av在线免费观看| 亚洲va电影大全| 97婷婷涩涩精品一区| 欧美大胆在线视频| 日韩av手机在线观看| 亚洲成人av在线播放| 日韩精品在线免费观看| 2018日韩中文字幕| 这里只有精品久久| 91久久国产婷婷一区二区| 国产日韩中文字幕| 欧美精品电影免费在线观看| 狠狠爱在线视频一区| 国产精品91在线| 国产精品一区二区三| 日本久久久a级免费| 成人中心免费视频| 国产欧美日韩中文字幕在线| 欧美激情精品久久久久久变态| 久久精视频免费在线久久完整在线看| 海角国产乱辈乱精品视频| 日韩精品免费视频| 久久久精品国产亚洲| 日韩中文字幕国产| 国产精品久久久久高潮| 日韩在线观看网址| 国产精品夫妻激情| 在线观看免费高清视频97| 欧美大尺度激情区在线播放| 日韩中文在线视频| 91高潮精品免费porn| 亚洲一二三在线| 国产精品久久久久久久久久ktv| 国产美女被下药99| 久热精品视频在线| 亚洲变态欧美另类捆绑| 国产精品激情av电影在线观看| 正在播放欧美一区| 久久精品国产一区二区三区| 欧美精品在线看| 精品二区三区线观看| 久久久天堂国产精品女人| 亚洲一区二区三区成人在线视频精品| 色婷婷久久一区二区| 日韩欧美极品在线观看| 国产亚洲精品久久久| 庆余年2免费日韩剧观看大牛| 欧美电影免费观看高清| 欧美精品一区二区免费| 亚洲一区二区三区在线视频| 亚洲视频一区二区三区| 成人精品网站在线观看| 91爱视频在线| 一区二区三区视频免费在线观看| 色综合视频一区中文字幕| 欧美激情二区三区| 欧日韩在线观看| 亚洲国产精品va在看黑人| 精品国产一区二区三区久久狼黑人| 色妞色视频一区二区三区四区| 精品国产视频在线| 国产成人极品视频| 亚洲白拍色综合图区| 国产精品综合不卡av| 狠狠色狠狠色综合日日五| 久久免费精品日本久久中文字幕| 日本高清久久天堂| 精品久久久国产精品999| 精品调教chinesegay| 麻豆乱码国产一区二区三区| 亚洲福利影片在线| 欧美成人性色生活仑片| 亚洲第一色在线| 国产欧亚日韩视频| 最近2019中文字幕第三页视频| 亚洲欧洲一区二区三区久久| 热re91久久精品国99热蜜臀| 日韩在线激情视频| 精品偷拍一区二区三区在线看| 亚洲午夜av久久乱码| 欧美激情高清视频| 精品久久久久久电影| 日韩国产欧美精品一区二区三区| 亚州国产精品久久久| 欧美日韩国产限制| 麻豆精品精华液| 91精品国产91久久久久福利| 午夜精品久久久久久久久久久久久| 欧美劲爆第一页| 国产精品视频一区二区三区四| 97精品视频在线播放| 亚洲欧美成人网| 亚洲自拍偷拍色片视频| 日本精品久久久久影院| 国产视频999| 国产精品美女www| 亚洲精品一区二三区不卡| 中文亚洲视频在线| 岛国av一区二区| 亚洲欧美在线第一页| 欧美日韩国产一区中文午夜| 国产精品羞羞答答| 亚洲午夜精品久久久久久性色| 日韩久久免费视频| 久久九九免费视频| 韩国视频理论视频久久| 91夜夜未满十八勿入爽爽影院| 成人久久一区二区| 欧美猛男性生活免费| 欧美大片欧美激情性色a∨久久| 亚洲少妇中文在线| 亚洲色图激情小说| 亚洲激情在线观看视频免费| 亚洲视频自拍偷拍| 麻豆国产精品va在线观看不卡| 日韩精品在线观看网站| 爽爽爽爽爽爽爽成人免费观看| 亚洲国产成人精品久久| 亚洲欧美日韩中文视频| 日韩电影在线观看免费| 91久久精品久久国产性色也91| 亚洲欧洲xxxx| 欧美激情在线观看视频| 国产精品丝袜一区二区三区| 国产精品狠色婷| 国产亚洲aⅴaaaaaa毛片| 日韩视频在线免费| 一区二区三区四区在线观看视频| 中文字幕成人精品久久不卡| 国产精品老牛影院在线观看| 在线视频中文亚洲| 亚洲国产精彩中文乱码av在线播放| 亚洲精品色婷婷福利天堂| 久久精品国亚洲| 日韩成人久久久| 欧美国产精品日韩| 日韩中文字幕在线免费观看| 国产精品小说在线| 91九色在线视频| 亚洲精品suv精品一区二区| 亚洲国产精品视频在线观看| 久久人人爽亚洲精品天堂| 国产精品福利无圣光在线一区| 亚洲aⅴ日韩av电影在线观看| 中文综合在线观看| 欧美亚洲日本黄色| www.国产精品一二区| 日韩av中文在线| 国产成人综合精品在线| 欧美大尺度在线观看| 一二美女精品欧洲| 亚洲精品国产电影| 久久久精品在线| 在线成人激情黄色| 亚洲欧美日韩精品久久奇米色影视| 性色av一区二区三区免费| 国产成人av网|