gpt4 book ai didi

java - TDD 最佳实践 - Java 对象验证和干净代码

转载 作者:行者123 更新时间:2023-12-01 14:37:05 26 4
gpt4 key购买 nike

假设有一个名为 Car 的 Java 类,其对象通过静态工厂初始化:

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

当然,我想将Validation过程提取到一个名为CarValidator的专用类中。

有两种方法可以向工厂提供此 validator :

不可 stub /可模拟 validator :

public static Car createCar(String name){
new CarValidator(name); // throw exception for instance if invalid cases
return new Car(name);
}

可 stub /可模拟 validator :

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

但是,这看起来不清楚......为什么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)方法的好处,例如:

private checkForCarName(String name); 

我应该选择哪种方法?

最佳答案

我的建议如下:我不会将域对象的验证与对象本身混合在一起。

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

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

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

关于java - TDD 最佳实践 - Java 对象验证和干净代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com