C# 如何避免重复的if-else系列代码气味

C# 如何避免重复的if-else系列代码气味,c#,code-cleanup,C#,Code Cleanup,学习C#4.5。我的吼叫语法太多,如果其他系列它似乎代码气味,想要一种方法来避免这种气味。任何类型的帮助都是可以接受的。多谢各位 public bool CheckValidCustomer() { return _checkManager.IsCustomerPersonal(_customer) ? IsValidPersonalCustomer() : IsValidCompanyCustomer(); } private bool IsValidCompanyCustomer(

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

您可以使用验证规则模式。

创建一组验证规则。然后一个接一个地把它们都看一遍。如果任何一条验证规则失败,则完整验证将失败(取决于业务规则)


您还可以参考(数据验证->验证过程部分),了解设计自己的验证规则引擎的想法。

我的个人建议:

  • 创建一个基类Customer和两个子类PersonalCustomer/CompanyCustomer。验证应该在这些类中完成——它们知道它们的实现细节
  • Customer基类有一个成员,该成员是验证操作链,链中的每个操作项都返回一个枚举作为验证结果(成功o4特定错误)
  • Customer基类有一个Validate方法,它调用链中的每个验证操作,如果验证失败,则返回
  • 每个子类实现详细的验证操作,并将其注册到验证链中。不再有支票管理器了。调用方只需调用_customer.Validate(),就不必担心客户是什么类型的
  • 一个表示层,用于将枚举(错误代码基本上)映射到一些特定于UI的字符串,这可以通过数组/哈希集完成,不再使用if/else或开关

  • 你可以这样做

    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;
    }
    
    private bool IsValidCompanyCustomer()
    {
    var companyValidationRules=新字典
    {
    {“请检查财务信息”。_checkManager.IsValidFinancialInfo},
    {“请检查公司信息”。\u checkManager.IsValidCompanyInfo},
    {“请检查股东信息。”,_checkManager.isvalidMakeHolderInfo},
    {“请检查负责人信息”。\u checkManager.IsValidResponsiblePersonInfo},
    {“请检查筛选信息。”,_checkManager.IsValidScreeningInfo},
    {“请检查我的号码上载信息。”,_checkManager.IsValidMyNumberUpload},
    {“请检查Id上载状态。”,_checkManager.isvalidUpload},
    {“请检查客户状态”。_checkManager.IsValidCustomerStatus},
    };
    var failedRule=companyValidationRules.Where(d=>!d.Value(\u客户))
    .选择(d=>d.Key)
    .FirstOrDefault();
    如果(!string.IsNullOrWhiteSpace(failedRule))
    {
    this.ProcessMessage=failedRule;
    返回false;
    }
    返回true;
    }
    private bool IsValidPersonalCustomer()
    {
    var companyValidationRules=新字典
    {
    {“请检查个人信息。”,_checkManager.IsValidPersonalInfo},
    {“请检查财务信息”。_checkManager.IsValidFinancialInfo},
    {“请检查公司信息”。\u checkManager.IsValidCompanyInfo},
    };
    var failedRule=companyValidationRules.Where(d=>!d.Value(\u客户))
    .选择(d=>d.Key)
    .FirstOrDefault();
    如果(!string.IsNullOrWhiteSpace(failedRule))
    {
    this.ProcessMessage=failedRule;
    返回false;
    }
    返回true;
    }
    

    }

    在Check manager中实现某种类型的“ValidateCompanyCustomer”。将每个“IsValidCompanyInfo”作为验证器“策略”实施。每个验证器策略都可以实现一个“检查”方法。然后,检查管理器将有一个IEnumerable的验证器策略来运行它。然后,您还可以单独测试每个验证器策略,而不是if/else语句。因为这是一段工作代码,StackOverflow不是发布这个问题的合适地方。这属于:你可能想去图书馆看看。