2012-08-24 59 views
3

作畫的場景,考慮以下邏輯省略-服務伐木應該有多深?

public class Service { 
    private Validator validator; 

    public void submit(Foo foo) { 
     if (!validator.isValid(foo)) { 
     log.warn("invalid foo"); 
     } ... 
    } 
} 
public interface Validator { 
    boolean isValid(Foo foo); 
} 

的問題是,只有Validor本身知道原因爲什麼驗證會失敗。我看到只有兩個可行的方法來調整原因。無論是Validator

  • 記錄失敗的條件本身
  • 返回包含的String 原因和布爾的IsValid一個複雜的對象。

前者是好的,但將離開Service無能是否實際執行記錄,而後者引入了惱人的redudancy和更復雜的應用。

哪個更喜歡,還是有更好的方法?

回答

2

你必須問自己一個問題:你的客戶關心驗證失敗原因嗎?答案是:它取決於。在很多情況下,您想要通知最終用戶,確切地說,驗證失敗的原因是什麼。在這種情況下,返回「複雜的」驗證結果對象(不要在這裏使用異常!),本質上是包裝一系列字符串或代碼(以允許)。 ValidationResult對象將是一個業務對象,而不是一些二等幫助器。

在其他情況下,您只是想根據對象是否有效做出決定。調用代碼(客戶端)不關心驗證的內部邏輯。無論是否有效。然後直接去boolean方法。爲了調試目的,在驗證方法內部添加日誌根據你的願望打開/關閉它們。

你知道最好的部分是什麼?您可以有兩種方法,並使用更適合客戶端代碼的方法。顯然不太複雜boolean方法只委託給更compilcated之一,並提供簡單的視圖

boolean isValid(Foo foo) { 
    validate(foo).isValid(); 
} 

ValidationResult validate(Foo foo) { 
    //logging and "real" validation 
} 
+0

的見解的答覆。特別是,服務*是否需要*傳遞一個原因。 –