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.

有两种方法可以将此验证器提供给工厂:

不可存根/可模拟验证器

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已经包含name值,因为它将Car参数存储为自己的字段(先验最干净的方式),因此我们可以绕过第二个参数,如下所示:

public static Car createCar(CarValidator carValidator){ 
     carValidator.validate();  
     return new Car(carValidator.getName());
}

但是,这看起来还不清楚……为什么 a 会从 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

1

我的提议如下:我不会将域对象的验证与对象本身混为一谈。

如果域对象假设传递给它的数据是有效的,并且验证应该在其他地方执行(例如在工厂中,但不是必需的),那将会更加清晰。

在那个“工厂”中,您将执行数据准备状态(验证、漏洞删除等),然后您将创建一个新对象。

您将能够测试工厂(如果它正确验证)而不是域对象本身。

于 2013-05-05T20:37:51.877 回答