作者:Natasha The Robot袋励,原文鏈接乙嘀,原文日期:2016-05-27
譯者:Crystal Sun显蝌;校對(duì):Cee预伺;定稿:Channe
正如上個(gè)月在幾個(gè)會(huì)議上我所講的那樣,《重構(gòu)與模式》 這本書(shū)被多次提及曼尊,特別是在我喜歡的研討會(huì)上酬诀。最終我還是讀了一小部分(至少是在 WWDC 大會(huì)發(fā)布后的瘋狂情緒高漲之前),并且我希望能夠通過(guò)將書(shū)中的模式(pattern)記錄下來(lái)骆撇,以供將來(lái)參考瞒御。我還發(fā)現(xiàn),通過(guò)把書(shū)中的 Java 代碼翻譯成 Swift神郊,我能更好地記住這些知識(shí)點(diǎn)肴裙。
第一個(gè)模式就是創(chuàng)建方法趾唱。
重構(gòu)之前
先假設(shè)你有一個(gè) model,比如是借款蜻懦,并且里面有一些不同的初始化構(gòu)造器(initializer)甜癞。在這個(gè)例子中,每個(gè)初始化構(gòu)造器都有存在的理由——每個(gè)初始化構(gòu)造器代表了對(duì)應(yīng)了不同的借款類(lèi)型:
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)
}
}
看看這代碼宛乃,你會(huì)完全沒(méi)有思路(除非你知道所有的借貸類(lèi)型)悠咱,不知道該用哪個(gè)初始化構(gòu)造器。當(dāng)然了征炼,一些剛剛接觸這代碼的新人可能還對(duì)項(xiàng)目的業(yè)務(wù)不是很清楚析既,所以他們可能會(huì)用錯(cuò)初始化構(gòu)造器,甚至?xí)?duì)這些初始化構(gòu)造器的作用意圖感到疑惑谆奥。
是時(shí)候來(lái)重構(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?
// 原來(lái)的初始化構(gòu)造器(initializer)現(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)后的代碼多么漂亮了嗎!當(dāng)你初始化一個(gè)借貸的 model 時(shí)雄右,你知道它的作用了空骚。
雖然我一般不會(huì)在類(lèi)里使用這么多的初始化構(gòu)造器,而且有時(shí)在 Swift 中可以根據(jù)不同的實(shí)際情況使用更好的方法來(lái)解決問(wèn)題(比如使用枚舉)擂仍。不過(guò)如果我想讓我的代碼更具可讀性囤屹、變得更加簡(jiǎn)潔,我一定會(huì)考慮重構(gòu)成這種模式逢渔。
本文由 SwiftGG 翻譯組翻譯肋坚,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問(wèn) http://swift.gg肃廓。