我有一个需要创建许多参数的类。它是一种音频处理器,需要采样率,采样分辨率,通道数等。大多数参数都有合理的默认值。并且它们中的大多数应该只能在初始化器(构造函数)中设置,因为之后更改它们是没有意义的。我不想用所有参数创建一个庞大的初始化器,因为(1)它将是巨大的,实质上它只会复制传递的值,不做任何实际的工作,(2)用户必须为所有参数指定值参数。什么是解决这个问题的好方法?
我试过为params编写getter和setter。这意味着我无法在构造函数中创建“真实”音频处理单元,因为参数值不知道。我不得不介绍一种新方法(比如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
方法。你是如何解决这个问题的,有更好的方法吗?
答案 0 :(得分:4)
了解NSURLConnection
的实施方式和used。它使用NSURLRequest
对象对其进行参数化,类似于SoundConfig
对象参数化AudioProcessor
对象的方式。
答案 1 :(得分:2)
通常的方法是创建一个庞大的初始化程序以及几个非默认值或值集的初始化程序。
-initWithSampleRate:numberOfChannels:sampleResolution:
-initWithSampleRate:sampleResolution:
-initWithSampleRate:numberOfChannels:
-initWithNumberOfChannels:sampleResolution:
-initWithNumberOfChannels:
-initWithSampleResolution:
-initWithSampleRate:
-init
但SoundConfig
方法看起来更简单。
答案 2 :(得分:1)
通常,当您拥有许多构造函数参数的类时,尤其是当某些或大多数是可选的时,您需要使用Builder Pattern。有趣的是,我找不到objective-c的例子,所以我不确定它是否可以在这里轻松应用......