という Java クラスがCar
あり、そのオブジェクトは静的ファクトリによって初期化されるとします。
public class Car {
private String name;
private Car(String name){//...}
public static Car createCar(String name){
//mechanism to validate the car attributes
return new Car(name);
}
}
もちろん、検証プロセスを という名前の専用クラスに抽出したいと考えていCarValidator
ます。
このバリデータをファクトリに提供するには、次の 2 つの方法があります。
スタブ不可/モック不可バリデーター:
public static Car createCar(String name){
new CarValidator(name); // throw exception for instance if invalid cases
return new Car(name);
}
スタバブル/モック可能なバリデーター:
public static Car createCar(CarValidator carValidator, String name){ //ideally being an interface instead
carValidator.validate();
return new Car(name);
}
ここでは冗長性のように見えます: パラメーターを独自のフィールドとして格納するため (アプリオリに最もクリーンな方法)、CarValidator
既に値が含まれているため、次のように 2 番目の引数をバイパスできます。name
Car
public static Car createCar(CarValidator carValidator){
carValidator.validate();
return new Car(carValidator.getName());
}
しかし、これは不明確に見えます...なぜa => 意味がないCar
からその値を見つけるのでしょうか。Validator
したがって、次のようにリファクタリングできます。
public static Car createCar(CarValidator carValidator, String name){
carValidator.validate(name); // throwing exception for instance if invalid cases
return new Car(carValidator.name());
}
かなり奇妙にCarValidator
聞こえますが、次のような必要なプライベート メソッドのそれぞれに引数を渡すのではなく、フィールドを作成する利点が失われます。
private checkForCarName(String name);
どの方法を選択すればよいですか?