2017-02-07 14 views
4

工作在C#4.5。我的bellow語法很多,如果其他系列它似乎代碼氣味,想要一種方法來避免這種氣味。任何幫助都可以接受。謝謝如何避免重複,如果其他系列代碼的氣味

public bool CheckValidCustomer() 
{ 
    return _checkManager.IsCustomerPersonal(_customer) ? IsValidPersonalCustomer() : IsValidCompanyCustomer(); 
} 

private bool IsValidCompanyCustomer() 
{ 
    if (_checkManager.IsValidFinancialInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Financial Info."; 
     return false; 
    } 

    if (_checkManager.IsValidCompanyInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Company Info."; 
     return false; 
    } 

    if (_checkManager.IsValidStakeHolderInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Stake Holder Info."; 
     return false; 
    } 

    if (_checkManager.IsValidResponsiblePersonInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Responsible person Info."; 
     return false; 
    } 


    if (_checkManager.IsValidScreeningInfo(_customer) == false) 
    { 
     ProcessMessage = "Please Check Screening Info ."; 
     return false; 
    } 

    if (_checkManager.IsValidMyNumberUpload(_customer) == false) 
    { 
     ProcessMessage = "Please Check My Number Upload Info."; 
     return false; 
    } 

    if (_checkManager.IsValidIdUpload(_customer) == false) 
    { 
     ProcessMessage = "Please Check Id Upload Status."; 
     return false; 
    } 

    if (_checkManager.IsValidCustomerStatus(_customer) == false) 
    { 
     ProcessMessage = "Please Check Customer Status."; 
     return false; 
    } 

    return true; 
} 

private bool IsValidPersonalCustomer() 
{ 
    if (_checkManager.IsValidPersonalInfo(_customer)==false) 
    { 
     ProcessMessage = "Please Check Personal Info."; 
     return false; 
    } 

    if (_checkManager.IsValidFinancialInfo(_customer)==false) 
    { 
     ProcessMessage = "Please Check Financial Info."; 
     return false; 
    } 

    if (_checkManager.IsValidCompanyInfo(_customer)==false) 
    { 
     ProcessMessage = "Please Check Company Info."; 
     return false; 
    } 

    return true; 
} 
+0

實現一個某種形式的檢查經理的 「ValidateCompanyCustomer」。實施每個「IsValidCompanyInfo」作爲驗證者「策略」。每個驗證器策略都可以實現「檢查」方法。然後,Check Manager將擁有一個IEnumerable驗證器策略。然後,您還可以分別測試每個驗證器策略 – bgura

+4

這些不是if/else語句。他們只是如果陳述。 – mason

+3

由於這是一個**工作**代碼,StackOverflow不是發佈此問題的正確地方。這屬於[CodeReview](http://codereview.stackexchange.com):http://codereview.stackexchange.com/help/on-topic – Claies

回答

2

我個人的建議:

  1. 創建一個基類客戶,和兩個子類PersonalCustomer/CompanyCustomer。驗證應該在這些類中完成 - 他們知道他們的實現細節。
  2. 客戶基類有一個驗證動作鏈,鏈中的每個動作項返回一個Enum作爲驗證結果(成功o4特定錯誤)
  3. 客戶基類有一個Validate方法,它調用每個方法鏈中的驗證操作,如果驗證失敗,則返回
  4. 每個子類都實現詳細的驗證操作,並將其註冊到驗證鏈中。沒有更多的checkmanager。調用者只需調用_customer.Validate(),不必擔心是什麼類型的客戶。
  5. 表示層將枚舉(基本錯誤代碼)映射到一些特定於UI的字符串,這可以通過數組/哈希集來完成 - 不再是if/else或switch。
0

你可以做這樣的事情......

private bool IsValidCompanyCustomer() 
{ 
    var companyValidationRules = new Dictionary<string, Func<Customer, bool>> 
    { 
     { "Please Check Financial Info.", _checkManager.IsValidFinancialInfo}, 
     { "Please Check Company Info.", _checkManager.IsValidCompanyInfo}, 
     { "Please Check Stake Holder Info.", _checkManager.IsValidStakeHolderInfo}, 
     { "Please Check Responsible person Info.", _checkManager.IsValidResponsiblePersonInfo}, 
     { "Please Check Screening Info.", _checkManager.IsValidScreeningInfo}, 
     { "Please Check My Number Upload Info.", _checkManager.IsValidMyNumberUpload}, 
     { "Please Check Id Upload Status.", _checkManager.IsValidIdUpload}, 
     { "Please Check Customer Status.", _checkManager.IsValidCustomerStatus}, 
    }; 

    var failedRule = companyValidationRules.Where(d => !d.Value(_customer)) 
              .Select(d => d.Key) 
              .FirstOrDefault(); 
    if (!string.IsNullOrWhiteSpace(failedRule)) 
    { 
     this.ProcessMessage = failedRule; 
     return false; 
    } 

    return true; 
} 

private bool IsValidPersonalCustomer() 
{ 
    var companyValidationRules = new Dictionary<string, Func<Customer, bool>> 
    { 
     { "Please Check Personal Info.", _checkManager.IsValidPersonalInfo}, 
     { "Please Check Financial Info.", _checkManager.IsValidFinancialInfo}, 
     { "Please Check Company Info.", _checkManager.IsValidCompanyInfo}, 
    }; 

    var failedRule = companyValidationRules.Where(d => !d.Value(_customer)) 
              .Select(d => d.Key) 
              .FirstOrDefault(); 
    if (!string.IsNullOrWhiteSpace(failedRule)) 
    { 
     this.ProcessMessage = failedRule; 
     return false; 
    } 

    return true; 
} 

}