删除执行多个验证的代码片段中的重复项
Removing duplication in a code fragment that performs multiple validations
我想将这个方法重构为没有重复的东西:
public class ContextValidator
{
public static boolean validate(LoggingContext loggingContext) throws ValidationException
{
if (!isValidValue(loggingContext.getApplicationlevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Applicationlevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getAuditlevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Auditlevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getBillinglevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Billinglevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getMetricslevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Metricslevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getSecuritylevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Securitylevel","must be between 0 and 5" });
}
return true;
}
private static boolean isValidValue(int applicationlevel)
{
return (applicationlevel >= 0) && (applicationlevel <= 5);
}
}
其中 getXXXLevel()
是返回 int
的方法。我尝试创建对字符串的方法引用的映射:Map<Supplier<Integer>, String>
(ex: loggingContext::getBillinglevel, "BillingLevel")
并在 forEach()
中测试它们 - 不幸的是 ValidationException
被选中,因此不能使用我的映射类型从 forEach 中抛出它.
将整个 if
包装到辅助方法中:
public static void checkAndThrow(int val, String name)
throws ValidationException
{
if (!isValidValue(val) {
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { name, "must be between 0 and 5" });
}
}
现在您可以将每个 if
替换为对 checkAndThrow
的调用:
public static boolean validate(LoggingContext loggingContext)
throws ValidationException
{
checkAndThrow(loggingContext.getApplicationlevel(), "Applicationlevel");
checkAndThrow(loggingContext.getAuditlevel(), "Auditlevel");
checkAndThrow(loggingContext.getBillinglevel(), "Billinglevel");
...
return true;
}
我想将这个方法重构为没有重复的东西:
public class ContextValidator
{
public static boolean validate(LoggingContext loggingContext) throws ValidationException
{
if (!isValidValue(loggingContext.getApplicationlevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Applicationlevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getAuditlevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Auditlevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getBillinglevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Billinglevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getMetricslevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Metricslevel", "must be between 0 and 5" });
}
if (!isValidValue(loggingContext.getSecuritylevel()))
{
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { "Securitylevel","must be between 0 and 5" });
}
return true;
}
private static boolean isValidValue(int applicationlevel)
{
return (applicationlevel >= 0) && (applicationlevel <= 5);
}
}
其中 getXXXLevel()
是返回 int
的方法。我尝试创建对字符串的方法引用的映射:Map<Supplier<Integer>, String>
(ex: loggingContext::getBillinglevel, "BillingLevel")
并在 forEach()
中测试它们 - 不幸的是 ValidationException
被选中,因此不能使用我的映射类型从 forEach 中抛出它.
将整个 if
包装到辅助方法中:
public static void checkAndThrow(int val, String name)
throws ValidationException
{
if (!isValidValue(val) {
throw new ValidationException(UserErrors.UE_BAD_PARAMS,
new Object[] { name, "must be between 0 and 5" });
}
}
现在您可以将每个 if
替换为对 checkAndThrow
的调用:
public static boolean validate(LoggingContext loggingContext)
throws ValidationException
{
checkAndThrow(loggingContext.getApplicationlevel(), "Applicationlevel");
checkAndThrow(loggingContext.getAuditlevel(), "Auditlevel");
checkAndThrow(loggingContext.getBillinglevel(), "Billinglevel");
...
return true;
}