Вы можете ввести объект параметра:
class ParameterObject {
public final SomeClass!(TemplateParam) foo;
public final string[][string] someAA;
public final uint[] dataToProcess;
public final SomeEnumType flag;
private ParameterObject(
SomeClass!(TemplateParam) foo,
string[][string] someAA,
uint[] dataToProcess,
SomeEnumType flag) {
this.foo = foo;
this.someAA = someAA;
this.dataToProcess = dataToProcess;
this.flag = flag;
}
private static class Builder {
public SomeClass!(TemplateParam) foo;
public string[][string] someAA;
public uint[] dataToProcess;
public SomeEnumType flag;
public Builder foo(SomeClass!(TemplateParam) foo) {
this.foo = foo;
return this;
}
public Builder someAA(string[][string] someAA) {
this.someAA = someAA;
return this;
}
public Builder dataToProcess(uint[] dataToProcess) {
this.dataToProcess = dataToProcess;
return this;
}
public Builder flag(SomeEnumType flag) {
this.flag = flag;
return this;
}
public ParameterObject build() {
if (null == foo) throw Exception("init foo!");
if (null == someAA) throw Exception("init someAA!");
if (null == dataToProcess) throw Exception("init dataToProcess!");
if (null == flag) throw Exception("init flag!");
return new ParameterObject(foo, someAA, dataToProcess, flag);
}
}
}
Теперь, ваш звонок будет выглядеть, например:
SomeClass[string] myValue =
someFunction(
new ParameterObject.Build().
foo(myFoo).
someAA(myAA).
dataToProcess(myData).
flag(false).
build()
);
Это гораздо легче иметь дело с подобными случаями на языках, которые позволяют создавать инлайн карты:
someFunction(
Map.new(
foo => myFoo,
someAA => myAA,
dataToProcess => myData,
flag => false
)
Отборочный код final
означает, что поле может быть установлено только из конструктора класса. Квалификатор static
перед классом означает, что класс не привязан к его внешнему классу, то есть не может получить доступ к нему или изменить его поля.
Согласен. Для * очень * длинных списков параметров один параметр для каждой строки также имеет свои собственные проблемы ... но я никогда не видел другого решения, которое работает лучше, если вам нужен длинный список параметров. Я также склонен сопоставлять типы и имена параметров, когда я это делаю ... может сделать его немного читабельнее. – SuperMagic
Кроме того, если ваш список параметров намного длиннее этого, это хороший признак того, что некоторые рефакторинг в порядке. – Aaron