あなたの質問に答える前に、ビルダーパターンについて説明したいと思います。
ビルダー パターンは通常、オーバーロードされたコンストラクターが多数ある場合に使用されます (コンストラクター アンチパターンのテレスコーピング)。例えば
public class Employee {
public Employee(String firstName, String lastName){
...
}
public Employee(String firstName, String lastName, Sex sex){
...
}
public Employee(String firstName, String lastName, String salutation) {
...
}
}
この場合、クライアント コードは、そのデータに応じて呼び出すコンストラクタを決定する必要があります。firstName
があり、をlastName
呼び出す必要がある場合new Employee(firstName, lastName)
。しかない場合は、firstName
を呼び出す必要がありEmployee(String firstName)
ます。そのため、クライアント コードには多数の if/then/else が含まれている可能性があります。例えば
Employee employee = null;
if(firstName != null && lastName != null && sex != null){
employee = new Employee(firstName, lastName, sex);
} else if(firstName != null && lastName != null && salutation != null){
employee = new Employee(firstName, lastName, salutation );
} else {
.....
}
Employee
この例のクラスの設計には、firstName
およびlastName
の必須属性が含まれていEmployee
ます。これは、すべてのコンストラクターがそれらを必要とするためです。属性sex
と属性saluation
はオプションです。クライアント コードがどのコンストラクターを呼び出すかを決定する場合、これは決定プロセスがクライアント コード全体で繰り返されることも意味します。たとえば、クライアントがfirstName
、lastName
、sex
およびsalutation
どのコンストラクタを呼び出す必要があるかを知っている場合は? または?new Employee(firstName, lastName, sex)
_new Employee(firstName, lastName, saluation)
コンストラクターの解決をカプセル化するには、ビルダー パターンを使用することをお勧めします。
public class EmployeeBuilder {
public EmployeeBuilder(String firstName, String lastName){
}
public void setSex(Sex sex){ ... }
public void setSalutation(Salutation salutation){ ... }
public Employee build(){
if(salutation != null){
return new Emplyoee(firstName, lastName, salutation);
} else if(sex != null){
return new Emplyoee(firstName, lastName, sex);
} else {
return new Emplyoee(firstName, lastName);
}
}
}
これにより、クライアント コードが読みやすくなり、コンストラクター呼び出しの決定がカプセル化されます。例えば
EmployeeBuidler employeeBuilder = new EmployeeBuilder(firstName, lastName);
Sex sex = ...;
String salutation = ...;
employeeBuilder.setSex(sex);
employeeBuilder.setSalutation(salutation);
Employee employee = employeeBuilder.build();
質問に戻る
では、この場合、努力する価値は本当にあるのでしょうか?
単体テストEmployee
では、いくつかの属性を持つオブジェクトを作成し、他の属性をデフォルト値に設定する必要がある場合があります。この場合、ビルダーパターンを使用することをお勧めします。たとえば、明確にするためにビルダーに名前を付けEmployeeDefaultValuesBuilder
ます。
Employee
他の従業員オブジェクト (テンプレート) に基づいてを作成することもできます。この場合、別のコンストラクターを に追加しEmployeeBuilder
ます。例えば
public EmployeeBuilder(Employee template){
// initialize this builder with the values of the template
}
したがって、構築ロジックをカプセル化するか、読みやすさを向上させる場合は、努力する価値があります。