首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简化事务代码的条件语句

简化事务代码的条件语句
EN

Code Review用户
提问于 2014-01-27 17:20:21
回答 2查看 576关注 0票数 8

下面的代码有一个函数:

代码语言:javascript
运行
复制
public void func()
{
    if (!string.IsNullOrEmpty(customerpay) && !string.IsNullOrEmpty(warrantypay) && !string.IsNullOrEmpty(maintanceplan))
    {
        if (customerpay == "Include" && warrantypay == "Include" && maintanceplan == "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[C^W^I]";
        }
        else if (customerpay == "Include" && warrantypay == "Include" && maintanceplan != "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[C^W]";
        }
        else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan != "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[C]";
        }
        else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan == "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[W^I]";
        }
        else if (customerpay != "Include" && warrantypay != "Include" && maintanceplan == "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[I]";
        }
        else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan != "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[W]";
        }
        else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan == "Include")
        {
            transactiontype = "," + "[Population].[Transaction Type Code].&[C^I]";
        }
    }
}

我需要简化上面的if-else C#代码。有办法这样做吗?

EN

回答 2

Code Review用户

回答已采纳

发布于 2014-01-27 17:55:09

你可以这样做:

代码语言:javascript
运行
复制
public void func()
{
    if (string.IsNullOrEmpty(customerpay) || string.IsNullOrEmpty(warrantypay) || string.IsNullOrEmpty(maintanceplan))
        return;

    if (customerpay != "Include" && warrantypay != "Include" && maintanceplan != "Include")
        return;

    List<char> parts = new List<char>();
    if (customerpay == "Include")
        parts.Add("C");
    if (warrantypay == "Include")
        parts.Add("W");
    if (maintanceplan == "Include")
        parts.Add("I");

    transactiontype = ",[Population].[Transaction Type Code].&[" + string.Join("^", parts) + "]";
}

首先,如果任何字符串是空的,我们就返回;通过反转逻辑,我们可以减少一个缩进级别,从而使代码变得非常复杂。我们还返回原始代码中没有处理的单个情况:如果所有三个字符串都不是"Include"

在那之后,一旦你找到你的字符串的模式,就很容易了。结果字符串中唯一变化的部分在末尾的括号中。有三个可能的字符:CWI。如果对应的字符串等于"Include",则它们将出现。字符由^分隔。因此,我们只需单独检查每个条件,并将字符收集到一个列表中。然后加入分离字符,生成最终的结果字符串。

票数 11
EN

Code Review用户

发布于 2014-01-27 17:56:47

第一种情况可以逆转,立即降低筑巢水平:

代码语言:javascript
运行
复制
if (string.IsNullOrEmpty(customerpay) || string.IsNullOrEmpty(warrantypay) || string.IsNullOrEmpty(maintanceplan))
{
   return;
}

// rest of conditions

这段代码看起来像示例代码,但我还是要说:func对于任何函数来说都是一个不好的名称,特别是返回void的函数。为了遵循命名C#约定,应该将其命名为Func --但这与框架的Func<T>冲突,使其更加混乱。给出有意义的名字!!

回到else if块..。

此代码构建一个string。我认为transactionType应该是transactionTypeBuilder,并且应该是StringBuilder类型--不要像那样连接字符串,而是构建它们!

此外,每个分支实际上都是要添加到字符串的最后一部分,因此,如果您引入了一个变量并将transactionType赋值更改为以下内容,那么很容易理解代码所做的事情:

代码语言:javascript
运行
复制
transactionType = string.Format(",[Population].[Transaction Type Code].&[{0}]", code);

其中code是每个分支试图解决的问题。这给你留下了这样的印象:

代码语言:javascript
运行
复制
var code = string.Empty;
if (customerpay == "Include" && warrantypay == "Include" && maintanceplan == "Include")
{
    code = "C^W^I";
}
else if (customerpay == "Include" && warrantypay == "Include" && maintanceplan != "Include")
{
    code = "C^W";
}
else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan != "Include")
{
    code = "C";
}
else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan == "Include")
{
    code = "W^I";
}
else if (customerpay != "Include" && warrantypay != "Include" && maintanceplan == "Include")
{
    code = "I";
}
else if (customerpay != "Include" && warrantypay == "Include" && maintanceplan != "Include")
{
    code = W";
}
else if (customerpay == "Include" && warrantypay != "Include" && maintanceplan == "Include")
{
    code = "C^I";
}

现在,每个测试似乎都在为bool而哭泣。考虑到这一点:

代码语言:javascript
运行
复制
var code = string.Empty;
var includeCustomerPay = (customerPay == "Include");
var includeWarrantyPay = (warrantyPay == "Include");
var includeMaintenancePlan = (maintenancePlan == "Include");

if (includeCustomerPay && includeWarrantyPay && includeMaintancePlan)
{
    code = "C^W^I";
}
else if (includeCustomerPay && includeWarrantyPay && !includeMaintancePlan
{
    code = "C^W";
}
else if (includeCustomerPay && !includeWarrantyPay && !includeMaintancePlan)
{
    code = "C";
}
else if (!includeCustomerPay && includeWarrantyPay && includeMaintancePlan)
{
    code = "W^I";
}
else if (!includeCustomerPay && !includeWarrantyPay && includeMaintancePlan)
{
    code = "I";
}
else if (!includeCustomerPay && includeWarrantyPay && !includeMaintancePlan)
{
    code = "W";
}
else if (includeCustomerPay && !includeWarrantyPay && includeMaintancePlan)
{
    code = "C^I";
}

不是开始有什么东西出现了吗?每个bool的“代码”总是按相同的顺序排列,并由一个"^"隔开。

因此,在一点林克的帮助下,可以删除整个条件:

代码语言:javascript
运行
复制
var codes = new[] 
              { 
                  includeCustomerPay ? "C" : string.Empty,
                  includeWarrantyPay ? "W" : string.Empty,
                  includeMaintenancePlan ? "I" : string.Empty
              };

var code = string.Join("^", codes.Where(c => !string.IsNullOrEmpty));
transactionType = string.Format(",[Population].[Transaction Type Code].&[{0}]", code);
票数 10
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/40178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档