以下はメソッドの 1 つのコードです。また、同様の検証が多くのメソッドに散らばっています。
if (!isAgreeTermsAndConditions()) {
addException(Messages.AGREE_TERMS_AND_CONDITIONS);
} else {
if (!validationManager.isValidSsn(getSsn())) {
addException(Messages.INVALID_SSN);
}
if (!validationManager.isValidDate(getBirthYear()) {
addPropertyFormException(Messages.INVALID_DATE_OF_BIRTH);
}
}
}
これをリファクタリングする一環として、以下のアプローチを思い付きました。基本的に、検証ロジックを列挙型に移動します
class MyFormHandler{
public void submitOrder(){
MyFormHandlerWorker.SUBMIT_ORDER.validate(this);
}
public void addItemToCart(){
MyFormHandlerWorker.ADD_TO_CART.validate(this);
}
public void removeItemFromCart(){
MyFormHandlerWorker.REMOVE_FROM_CART.validate(this);
}
}
enum MyFormHandlerWorker{
SUBMIT_ORDER{
validate(MyFormHandler fh){
//perform validations
if (!fh.isAgreeTermsAndConditions()) {
fh.addException(Messages.AGREE_TERMS_AND_CONDITIONS);
} else {
if (!fh.getValidationManager().isValidSsn(fh.getSsn())) {
fh.addException(Messages.INVALID_SSN);
}
if (!fh.getValidationManager().isValidDate(fh.getBirthYear()) {
fh.addPropertyFormException(Messages.INVALID_DATE_OF_BIRTH);
}
}
}
}
};
public abstract void validate(MyFormHandler fh);
}
検証を移動した後、MyFormHandler
見た目はすっきりしていますが、列挙型がフォーム ハンドラーと逆の依存関係を持っていることに満足していません。ご覧のとおり、enum での呼び出しが多すぎます。これfh.method()
は、代わりにフォーム ハンドラーでコードを使用する方がよいことを示唆しています。
列挙型を微調整するか、これをリファクタリングするより良い方法はありますか?