《重構與模式》Swift 版之引數物件

2021-09-19 04:46:43 字數 2562 閱讀 4035

我最近在讀《重構與模式》 。昨天(譯註:原文日期的昨天),在我寫描述了乙個擁有多個引數的物件的《建立方法》時,想到了@modocache關於ios api 設計中的 swift 模式超棒的演講,尤其是關於引數物件部分。我第一次看的時候獲益匪淺,因此我希望記錄下來。

假設你在寫乙個 bananauikit 庫,包含了乙個簡單的 bananaalertview:

最開始的**可能想這樣:

public class bananaalertview 

}

這個實現很好,直到一位使用這個框架的使用者請求能夠將 bananaalertview 的顏色由棕色換為黃色...

為了確保更改這個框架不影響其他使用者,我們使用 swift 的預設引數:

public class bananaalertview 

}

public class bananaalertview 

}// 用法

bananaalertview.show(

withtitle: "this is bananas",

message: "someone has been monkeying around ?",

dismissbuttontext: "banana",

dismissbuttoncallback: )

但是假如我們需要改變閉包的引數呢?假如客戶端同樣需要按鈕的文字呢?

解決方式就是為 buttoncallback 新增乙個按鈕文字的引數:

public typealias buttoncallback = (buttonindex: int, buttontitle: string) -> void
但是這破壞了一切...當呼叫 show 方法時,buttoncallback 方法此時需要兩個引數,而不是原來的乙個了。

// 用法

bananaalertview.show(

withtitle: "this is bananas",

message: "someone has been monkeying around ?",

dismissbuttontext: "banana",

// 破壞了原來的呼叫

// 閉包需要帶有兩個引數:buttonindex 和 buttontext

dismissbuttoncallback: )

於是我們該怎麼辦?此時引數物件就該上場了!

解決方案是為閉包建立乙個引數物件:

public class bananaalertview 

// 現在只需要乙個引數

public typealias buttoncallback = (parameters: buttoncallbackparameters) -> void

public static func show(

withtitle title: string,

message: string,

dismissbuttontext: string,

dismissbuttoncallback: buttoncallback)

}bananaalertview.show(

withtitle: "this is bananas",

message: "someone has been monkeying around ?",

dismissbuttontext: "banana",

// 引數物件包含所有呼叫者需要的引數

dismissbuttoncallback:

})

現在需要新增額外的引數時,**依舊能工作得非常好。buttoncallback完全不需要變動。

public struct buttoncallbackparameters
當然,你也可以輕鬆刪除或移除引數:

public struct buttoncallbackparameters
當然,可以重構方法時用更通用的方式來獲得越來越多的引數:

public class bananaalertview 

public static func show(

withtitle title: string,

message: string,

options: alertviewoptions)

}

和其他設計模式一樣,學會和用好完全是兩件事,知道它們是好事,但是在使用前需要權衡一下。找到最佳的平衡點是我們碼農的工作,需要不斷努力才能找到最佳實踐?。

對於引數物件來說,好處是能夠為未來預留 api,但是這樣的預留是有負擔的。你不能為此給每個方法和閉包都新建乙個新結構體。

所以,請明智的使用!

重構與模式

設計模式 和 重構 之後又一里程碑式著作,凝聚眾多業界專家經驗與領悟,幫你打通重構與模式任督二脈。1994年,設計模式 為我們帶來了常見設計問題的經典解決方案,從而改變了整個物件導向開發的面貌。1999年,重構 為我們帶來了一種改進 的高效過程,從而徹底改變了物件導向設計的方式。現在,在眾所期盼之中...

重構與模式

b 重構的第一步 b 如果你發現自己需要為程式新增乙個特性,而 結構使你無法很方便地那麼做,那就先重構那個程式,使特性的新增比較容易進行,然後再新增特性。首先得在 中找出函式內的區域性變數和引數,任何不會被修改的變數都可以被我當成引數傳入新的函式,至於會被修改的變數就需格外小心。如果只有乙個變數會被...

重構與模式(一)

重構就是一種 保持行為的轉換 是一種對軟體內部結構的改善,目的是在不改變軟體的可見行為的情況下,使其更容易理解,修改的成本更低 重構過程包括去處重複,簡化複雜邏輯和澄清模糊的 重構是,需要對 的無情針砭,以改進其設計。這種改進可能很小,比如只是乙個變數名,也可能很大比如合併類。重構的動機,比較具有普...