2017-02-07 4 views
4

C#4.5で作業してください。私の鳴き声の構文が非常に多くの他のシリーズの場合は、コードのにおいがあるようですが、この臭いを避ける方法が欲しい。何らかの助けが受け入れられるだろう。ありがとう他のシリーズコードのにおいが繰り返されるのを避ける方法

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"をバリデータ "戦略"として実装します。各バリデータストラテジは、「チェック」メソッドを実装することができます。それから、チェックマネージャは、それが実行するバリデータストラテジのIEnumerableを持ちます。それぞれのバリデーターストラテジを個別にテストすることもできます。 – bgura

+4

これらはif/elseステートメントではありません。それらは単に文である。 – mason

+3

これは** working **コードの部分なので、StackOverflowはこの質問を投稿するのに適切な場所ではありません。これは[CodeReview](http://codereview.stackexchange.com)に属しています:http://codereview.stackexchange.com/help/on-topic – Claies

答えて

3

妥当性検査のルールパターンを使用できます。 Avoiding many if blocks for validation checking

一連の検証ルールを作成します。それらのすべてを1つずつ実行します。いずれか1つの検証ルールが失敗すると、検証が完了しません(ビジネスルールによって異なります)。

WPF Data Binding Validation(データ検証 - >検証プロセスのセクション)を参照して、独自の検証ルールエンジンを設計するためのアイデアを得ることもできます。

2

私の個人的な提案:

  1. 基底クラスの顧客を作成し、2つのサブクラスPersonalCustomer/CompanyCustomer。検証はこれらのクラス内で行う必要があります。実装の詳細を知っています。
  2. カスタマー基本クラスには、検証アクションの連鎖であるメンバーがあり、チェーン内の各アクションアイテムは検証結果としてEnumを返します(成功すると、エラーは成功します)
  3. カスタマーベースクラスには、検証が失敗した場合にチェーン内の検証アクションを返します。
  4. 各サブクラスは詳細な検証アクションを実装し、検証チェーンに登録します。これ以上のチェックマネジャーはありません。呼び出し側は_customer.Validate()を呼び出すだけで、どのタイプの顧客であるか心配する必要はありません。
  5. enum(基本的にエラーコード)をUI固有の文字列にマップするための表示レイヤーです。これは、配列/ハッシュセットで行うことができます。
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; 
} 

}

関連する問題