2010-10-18 74 views
3

我有一個需要很多參數來創建的類。它是一種需要採樣率,採樣分辨率,通道數量等的音頻處理器。大多數參數都有相同的默認值。它們中的大多數只能在初始化器(構造器)中設置,因爲之後改變它們是沒有意義的。我不想創建一個包含所有參數的龐大的初始化程序,因爲(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的方法。你如何解決這個問題,有沒有更好的方法?

回答

4

查看如何執行NSURLConnectionused。它使用NSURLRequest對象來對其進行參數化,與您的SoundConfig對象參數化AudioProcessor對象的方式類似。

+0

如果您可以使用一個使用示例,本來會很好。提供的鏈接不再可用。 – 2017-03-22 16:15:41

1

通常,當你有許多構造函數參數的類時,特別是當它們中的一些或大多數是可選的時,你想使用Builder Pattern。有趣的是,我找不到Objective-C的例子,所以我不確定它是否可以很容易地應用在這裏...

2

通常的方法確實是創建一個龐大的初始化器和幾個初始化器,用於非默認值或值的集合。

-initWithSampleRate:numberOfChannels:sampleResolution: 
-initWithSampleRate:sampleResolution: 
-initWithSampleRate:numberOfChannels: 
-initWithNumberOfChannels:sampleResolution: 
-initWithNumberOfChannels: 
-initWithSampleResolution: 
-initWithSampleRate: 
-init 

但是SoundConfig方法看起來更簡單。

+1

如果用於SoundConfig選項,我認爲它更好,請考慮使用NSDictionary。 NSDictionary似乎是Apple用大量任意參數初始化對象的方式。 – JeremyP 2010-10-18 12:40:28

+0

詞典很好,因爲它不會添加其他額外的類,但我想不出一個非常簡單的方法來添加默認設置,而且拳擊很糟糕。 – zoul 2010-10-19 08:28:03