重構(gòu):創(chuàng)建方法

原文鏈接: https://www.natashatherobot.com/refactoring-to-creation-method/
作者: Natasha The Robot
原文日期: 2016-05-27
譯者: Crystal Sun

我上個月參加了幾次會議并發(fā)表演講鹿霸,Refactoring to Patterns 這本書被多次提及几苍,特別是在我喜歡的研討會上,出現(xiàn)多次缀程。我最終還是沒太有時間讀(至少是在 WWDC 大會發(fā)布后的瘋狂情緒高漲之前)搜吧,我想先存檔我喜歡的模式以供將來參考。我還發(fā)現(xiàn)杨凑,通過把書中的 Java 代碼翻譯成 Swift滤奈,我能更好地記住這些知識點。

第一個模式就是創(chuàng)建方法撩满。

重構(gòu)之前

先假設你有一個 model蜒程,比如是借款,model 里有一堆不同的初始化構(gòu)造器(initializer)伺帘。在這個例子中昭躺,每個初始化構(gòu)造器(initializer)都有自己存在的原因,并且對應這不同的借款類型:

struct Loan {
    let commitment: NSDecimalNumber
    let riskRating: Float
    let maturity: Int
    let expiry: NSDate?
    let capitalStrategy: String?
    let outstanding: NSDecimalNumber?
    
    init(commitment: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate?, capitalStrategy: String?, outstanding: NSDecimalNumber?) {
        self.commitment = commitment
        self.riskRating = riskRating
        self.maturity = maturity
        self.expiry = expiry
        self.capitalStrategy = capitalStrategy
        self.outstanding = outstanding
    }
    
    init(commitment: NSDecimalNumber, riskRating: Float, maturity: Int) {
        self.init(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: nil, capitalStrategy: nil, outstanding: nil)
    }
    
    init(commitment: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) {
        self.init(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: nil, outstanding: nil)
    }
    
    init(commitment: NSDecimalNumber, outstanding: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) {
        self.init(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: nil, outstanding: outstanding)
    }
    
    init(capitalStrategy: String, commitment: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) {
        self.init(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: capitalStrategy, outstanding: nil)
    }
    
    init(capitalStrategy: String, commitment: NSDecimalNumber, outstanding: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) {
        self.init(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: capitalStrategy, outstanding: outstanding)
    }
}

看看這代碼伪嫁,你會完全沒有思路(除非你知道所有的借貸類型)领炫,不知道該用哪個初始化構(gòu)造器(initializer)。當然了张咳,一些新人剛剛接觸這代碼的時候可能還對項目的業(yè)務不是很清楚帝洪,所以他們可能會用錯初始化構(gòu)造器(initializer),甚至會困惑這些初始化構(gòu)造器(initializer)的作用意圖脚猾。

是時候來重構(gòu)了葱峡!

重構(gòu)之后

用創(chuàng)建方法(Creator Method)重構(gòu)后的代碼如下:

struct Loan {
    let commitment: NSDecimalNumber
    let riskRating: Float
    let maturity: Int
    let expiry: NSDate?
    let capitalStrategy: String?
    let outstanding: NSDecimalNumber?
    
     // 原來的初始化構(gòu)造器(initializer)現(xiàn)在現(xiàn)在可以是私有的
    private init(commitment: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate?, capitalStrategy: String?, outstanding: NSDecimalNumber?) {
        self.commitment = commitment
        self.riskRating = riskRating
        self.maturity = maturity
        self.expiry = expiry
        self.capitalStrategy = capitalStrategy
        self.outstanding = outstanding
    }
    
    static func createTermLoan(commitment: NSDecimalNumber, riskRating: Float, maturity: Int) -> Loan {
        return Loan(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: nil, capitalStrategy: nil, outstanding: nil)
    }
    
    static func createTermLoan(capitalStrategy: String, commitment: NSDecimalNumber, outstanding: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) -> Loan {
        return Loan(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: capitalStrategy, outstanding: outstanding)
    }
    
    static func createRevolverLoan(commitment: NSDecimalNumber, outstanding: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) -> Loan {
        return Loan(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: nil, outstanding: outstanding)
    }
    
    static func createRevolverLoan(capitalStrategy: String, commitment: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) -> Loan {
        return Loan(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: capitalStrategy, outstanding: nil)
    }
    
    static func createRCTL(commitment: NSDecimalNumber, riskRating: Float, maturity: Int, expiry: NSDate) -> Loan {
        return Loan(commitment: commitment, riskRating: riskRating, maturity: maturity, expiry: expiry, capitalStrategy: nil, outstanding: nil)
    }
}

注意到重構(gòu)后的代碼多么漂亮了嗎!當你初始化一個借貸時龙助,你知道它的作用了砰奕。

雖然我一般不會在類里使用這么多的初始化構(gòu)造器(initializer),根據(jù)不同的實際情況泌参,設置可能還有更好的方法(比如:枚舉)脆淹,但我一定會考慮重構(gòu)成這種模式,讓我的代碼更具可讀性沽一,更加簡潔盖溺。

本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)铣缠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烘嘱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝗蛙,更是在濱河造成了極大的恐慌蝇庭,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捡硅,死亡現(xiàn)場離奇詭異哮内,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門北发,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纹因,“玉大人,你說我怎么就攤上這事琳拨〔t恰!?“怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵狱庇,是天一觀的道長惊畏。 經(jīng)常有香客問我,道長密任,這世上最難降的妖魔是什么颜启? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮批什,結(jié)果婚禮上农曲,老公的妹妹穿的比我還像新娘。我一直安慰自己驻债,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布形葬。 她就那樣靜靜地躺著合呐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笙以。 梳的紋絲不亂的頭發(fā)上淌实,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音猖腕,去河邊找鬼拆祈。 笑死,一個胖子當著我的面吹牛倘感,可吹牛的內(nèi)容都是我干的放坏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼老玛,長吁一口氣:“原來是場噩夢啊……” “哼淤年!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜡豹,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤麸粮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镜廉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄诲,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年娇唯,在試婚紗的時候發(fā)現(xiàn)自己被綠了齐遵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寂玲。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖洛搀,靈堂內(nèi)的尸體忽然破棺而出敢茁,到底是詐尸還是另有隱情,我是刑警寧澤留美,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布彰檬,位于F島的核電站,受9級特大地震影響谎砾,放射性物質(zhì)發(fā)生泄漏逢倍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一景图、第九天 我趴在偏房一處隱蔽的房頂上張望较雕。 院中可真熱鬧,春花似錦挚币、人聲如沸亮蒋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慎玖。三九已至,卻和暖如春笛粘,著一層夾襖步出監(jiān)牢的瞬間趁怔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工薪前, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留润努,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓示括,卻偏偏與公主長得像铺浇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子例诀,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容