假设我们有一个foo(String bar)
仅对满足特定条件的字符串进行操作的方法;例如,它必须为小写字母,不能为空或只有空格,并且必须与pattern匹配[a-z0-9-_./@]+
。该方法的文档说明了这些条件。
该方法应该拒绝任何和所有与该标准的偏差,还是该方法对某些标准更为宽容?例如,如果初始方法是
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
this.bar = bar;
}
第二种宽容方法是
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
bar = bar.toLowerCase().trim().replaceAll(" ", "_");
if (!bar.matches(BAR_PATTERN_STRING) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
}
this.bar = bar;
}
是应该将文档更改为声明将进行转换并将其设置为转换后的值(如果可能的话),还是应将方法保持尽可能简单并拒绝任何和所有偏差?在这种情况下,bar
可以由应用程序的用户设置。
主要用例是用户通过特定的字符串标识符从存储库访问对象。存储库中的每个对象都应具有唯一的字符串来标识它。这些存储库可以通过各种方式(SQL Server,JSON,XML,二进制文件等)存储对象,因此我尝试确定与大多数命名约定匹配的最低公分母。
foo
函数,该函数严格接受所接受的参数,并具有第二个辅助函数,可以尝试“清除”要与一起使用的参数foo
。这样,每种方法只需要做很少的工作,就可以更干净地管理和集成它们。如果沿着这条路线走,摆脱异常繁重的设计可能也会有所帮助。您可以改用类似的方法Optional
,然后foo
在必要时具有使用抛出异常的功能。