0

という 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 番目の引数をバイパスできます。nameCar

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); 

どの方法を選択すればよいですか?

4

1 に答える 1