我有一個需要很多參數來創建的類。它是一種需要採樣率,採樣分辨率,通道數量等的音頻處理器。大多數參數都有相同的默認值。它們中的大多數只能在初始化器(構造器)中設置,因爲之後改變它們是沒有意義的。我不想創建一個包含所有參數的龐大的初始化程序,因爲(1)它會很大,本質上它只會複製傳遞的值,不會做任何實際的工作,(2)用戶必須指定所有參數的值參數。什麼是解決這個問題的好方法?如何用許多構造函數參數初始化一個類?
我已經嘗試爲params編寫getters和setters。這意味着我無法在構造函數中創建「真實」音頻處理單元,因爲參數值尚未知。我已經向大家介紹一種新的方法(比如prepareForWork
),使得用戶可以這樣做:
AudioProcessor *box = [[AudioProcessor alloc] init];
[box setSampleRate:…];
[box setNumberOfChannels:…];
[box prepareForWork];
[box doSomeProcessing];
這是很好的,因爲它不需要笨重的構造。此外,默認值在初始化程序中設置,這意味着我可以採用新的AudioProcessor
實例,並且仍可以執行一些工作。另一方面是(1)在實例可以做任何實際工作之前還有一個額外的方法需要調用;(2)在調用prepareForWork
之後,類應該拒絕改變任何參數。保護這兩個不變量將需要一些我不喜歡的樣板代碼。
我以爲我可以創建一個特殊的「預設」類,它是這樣的:
@interface SoundConfig : NSObject {
NSUInteger numberOfChannels;
NSUInteger sampleResolution;
float sampleRate;
}
,然後要求這個類的一個實例,在AudioProcessor
初始化:
@interface AudioProcessor : NSObject {…}
- (id) initWithConfig: (SoundConfig*) config;
默認值將被設置在SoundConfig
初始值設定項中,AudioProcessor
構造函數會很簡單,並且不會有不變量需要手動觀察。
我想到的另一種方法是一種AudioProcessorBuilder
類。您將創建一個實例,通過訪問器設置音頻參數,然後最終爲您創建一個AudioProcessor
實例,通過非公共設置器設置所有屬性,以便以後不能更改它們(並打破不變量) 。
現在我寫這個,我贊成SoundConfig
的方法。你如何解決這個問題,有沒有更好的方法?
如果您可以使用一個使用示例,本來會很好。提供的鏈接不再可用。 – 2017-03-22 16:15:41