如何避免重复的if else代码味道

4

我正在使用C# 4.5进行开发。我的代码中有太多的if else语句,使得代码看起来有一些异味。我希望找到一种避免这种异味的方法。任何形式的帮助都将被接受。谢谢。

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;
}

在检查管理器中实现一个“ValidateCompanyCustomer”。将每个“IsValidCompanyInfo”实现为验证器“策略”。每个验证器策略可以实现一个“Check”方法。然后,检查管理器将具有可枚举的验证器策略,它会运行这些策略。您还可以单独测试每个验证器策略。 - bgura
4
那不是if/else语句,只是if语句。 - mason
3
由于这是一段可工作的代码,StackOverflow 不是发布这个问题的正确地方。应该发布在 CodeReview 上:http://codereview.stackexchange.com/help/on-topic。 - Claies
你可能想要查看Fluent Validation库。 - jmoerdyk
3个回答

3
你可以使用验证规则模式。避免很多if块进行验证检查 创建一组验证规则。逐个执行所有规则。如果任何一个验证规则失败,则整个验证失败(根据业务规则)。
你还可以参考WPF数据绑定验证(数据验证- > 验证过程部分)以获得设计自己的验证规则引擎的想法。

2

我的个人建议:

  1. 创建一个基类Customer,和两个子类PersonalCustomer/CompanyCustomer。验证应该在这些类内部完成-它们知道自己的实现细节。
  2. Customer基类有一个成员,它是一个验证操作链,链中的每个操作项都返回一个枚举作为验证结果(成功或特定错误)
  3. Customer基类有一个Validate方法,它调用链中的每个验证操作,并在验证失败时返回
  4. 每个子类实现详细的验证操作,并将其注册到验证链中。不再需要checkmanager。调用者只需调用_customer.Validate(),而不必担心客户的类型。
  5. 一个表示层将枚举(错误代码基本上)映射到一些UI特定的字符串,这可以通过一个数组/hashset来完成-不再需要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;
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接