[英]Design Question : How can I refactor a validation check into another method
我有一個很大的驗證方法可以重構。 這是一個例子。 我提供了初始驗證和我自己的建議。 您認為這是重構的好方法還是有更好的重構方法?
謝謝,
public void validate() {
MyException myException= new MyException();
try {
if (!isRule1()) {
throw MyException.invalidRule(Rule1);
}
}
catch (MyException e) {
myException.addWrappedException(e);
}
try{
f (!isRule2()) {
throw MyException.invalidRule(Rule2);
}
}
catch (MyException e) {
myException.addWrappedException(e);
}
////continue checking...
}
這就是我要重構它們的方式:
public void validate() {
MyException myException= new MyException();
validateRule1(myException);
validateRule2(myException);
//continue validating....
}
private void validateRule1(myException){
try {
if (!isRule1()) {
throw MyException.invalidRule(Rule1);
}
}
catch (MyException e) {
myException.addWrappedException(e);
}
}
private void validateRule2(myException){
try {
if (!isRule2()) {
throw MyException.invalidRule(Rule2);
}
}
catch (MyException e) {
myException.addWrappedException(e);
}
}
您可以在此處使用Decorator模式。 創建具有單個方法validate()的接口,然后創建實現包含驗證代碼的該接口的不同類。 然后,您可以對生成的對象調用validate,這將在所有其他驗證中展開。
這具有改進代碼模塊化的附加好處,使您能夠獨立地對驗證進行單元測試。 您還可以根據需要輕松地從鏈中添加或刪除驗證。
下面是一個簡單的示例。
public interface Validator {
void validate(Object input) throws ValidationException
}
public class ValidationOne implements Validator {
protected Validator validator;
public ValidationOne(Validator validator) {
this.validator = validator;
}
public void validate(Object input) throws ValidationException {
if (validator != null)
validator.validate(input);
// do specific ValidationOne checks
if (!isValid(input)) throw new ValidationException()
}
}
public class ValidationTwo implements Validator {
protected Validator validator;
public ValidationTwo(Validator validator) {
this.validator = validator;
}
public void validate(Object input) throws ValidationException {
if (validator != null)
validator.validate(input);
// do specific ValidationTwo checks
if (!isValid(input)) throw new ValidationException()
}
}
public class Tester {
public void runValidations(Object obj) {
Validator validator = new ValidationOne(null);
validator = new ValidationTwo(validator);
// continue adding validations as needed
try {
validator.validate(obj);
} catch (ValidationException e) {
System.err.println("Validation error occurred");
}
}
}
嘗試一下
MyException myException= new MyException();
if (!isRule1())
myException.addWrappedException(MyException.invalidRule(Rule1));
要么
MyException myException= new MyException();
myException.addWrappedException(checkRule1());
其中checkRule1()返回異常或null,而addWrappedException忽略null。
要么
MyException myException= new MyException();
checkRule1(myException);
絕對從使用Replace Method with Method Object
開始。 它沒有風險,並且您不應該以如此巨大的方法擔心它。 那么您的方法似乎很好...只需確保重命名諸如validateRule1
;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.