2016-08-01 86 views
3

我處於項目的設計階段,需要對給定對象執行某些驗證。 驗證可以分爲5個不同的組。驗證器的每個類別都可以有多個版本,在其實現中略有不同。基於輸入的不同驗證器

public interface Validator { 
boolean validate(Object o); 
} 

public abstract CostValidator implements Validator { 
//common logic related to cost validator 
} 

public class CostValidator1 extends CostValidator { 
boolean validate(Object o) { 
    //implementation 1 
} 

public class CostValidator2 extends CostValidator { 
boolean validator(Object o) { 
    //implementation 2 
} 

根據對象的業務組,需要執行CostValidator1或CostValidator2。

對於每個業務組,我打算在配置系統即維持這種驗證的列表:

BusinessGroupA { 
validators = [CostValidator1, SomeOtherValidator2...] 
} 

BusinessGroupB { 
validators = [CostValidator2, AnotherValidator99...] 
} 

enter image description here

的處理流程將獲取的驗證的列表從配置基於業務組並在每個驗證器中執行驗證。

這種方法有什麼缺陷嗎? 或者有沒有更好的方法來解決我描述的用例?

+0

我想知道在給定要求的情況下是否有更好的設計方法。 由於我的項目正處於設計階段,我想盡可能地探索更多的選擇。 – Rahul

+0

爲什麼驗證邏輯被放入單獨的類中有什麼特別的原因?爲什麼對象無法驗證自己? 'if(!object1.isValid()){...}' –

+0

基於對象所屬的業務組,CostValidator1或CostValidator2或不應用成本驗證。 同樣,屬於組A的對象在管道中可能有3個驗證程序,其中屬於B的對象有5個。 此外,根據將來需要的更改,可以將對象從一個業務組移動到另一個業務組。 該對象將由各種組件執行,實現它們自己的業務邏輯方面。 這裏列出的驗證器屬於一個這樣的邏輯分組。 此外,對象類的代碼基礎遵循更多功能的方法與OO – Rahul

回答

1

我提議兩方面的改進添加到上述溶液:

1.保證所需的驗證規則

假設每個業務組相關的驗證,應執行的存在,應該有一些機制來保證配置指定了足夠的驗證規則,即驗證類。如果您擁有數十個屬性並可能包含數百個業務組,則在配置中發生錯誤會非常容易,即不會爲Cost指定任何驗證器。我的建議是在業務對象的級別上指定哪些屬性需要驗證器。然後創建一些對象工廠,根據業務組和驗證要求將驗證器綁定到對象。

我會按照這種方法:

  1. 對於每個類型的驗證,例如創建接口ICostValidator和IWeightValidator。
  2. 在您的配置保持所需要的業務對象驗證接口,例如:a名單

    requiredValidators = [ICostValidator,IWeightValidator]。

  3. 在BusinessGroupA或BusinessGroupB上執行驗證時,請始終檢查配置的驗證器是否實現了所有requiredInterfaces。

2.解耦具體的業務對象

如果你看看成本和重量驗證驗證現在他們都綁定到業務對象。我不知道類圖的其餘部分,但我可以想象,成本和權重的屬性會出現在多個業務對象中,例如Item,QuotationLine,SalesOrderLine,ShippingLine等。然後,最好有驗證器不直接依賴於業務對象,並且可以輕鬆應用到多個業務對象。在對象工廠中,您還可以處理驗證器和基礎對象之間的適當綁定。

讓我知道你是否想要一些代碼示例。

+0

感謝您的迴應! 1.這是一個非常有用的觀點,我也在考慮設置一些機制來確保某些驗證器不會意外丟失。我會將其納入我的設計。 2.你說得對。雖然,我沒有看到這些驗證器今天在多個業務對象上運行的用例,但是我們無法確定將來可能需要哪些更改。 是否可以提供一些關於實現答案中提到的第一點的更多細節? – Rahul

+0

@Rahul我剛剛更新了我的回覆... –