如果else语句重构凌乱

时间:2016-02-18 01:14:26

标签: if-statement switch-statement refactoring

我正在处理遗留代码库,其中包含以下代码段:

if ((results[0].Length == 0))
    customerName = "";
else
    customerName = results[0].Substring(18);

if ((results[1].Length == 0))
    meterSerialNumber = "";
else
    meterSerialNumber = results[1];

if ((results[2].Length == 0))
    customerID = "";
else
    customerID = results[2];

if ((results[3].Length == 0))
    meterCreditAmount = "";
else
    meterCreditAmount = results[3];

if ((results[4].Length == 0))
    debtInstallmentDeduction = "";
else
    debtInstallmentDeduction = results[4];

if ((results[5].Length == 0))
    vatOnEnergyAmount = "";
else
    vatOnEnergyAmount = results[5];

if ((results[6].Length == 0))
    vatOnDebt = "";
else
    vatOnDebt = results[6];

if ((results[7].Length == 0))
    outstandingDebtAmount = "";
else
    outstandingDebtAmount = results[7];

if ((results[8].Length == 0))
    tariffCategory = "";
else
    tariffCategory = results[8];

if ((results[9].Length == 0))
    tariffId = "";
else
    tariffId = results[9];

if ((results[10].Length == 0))
    encryptedToken1 = "";
else
    encryptedToken1 = results[10];

if ((results[11].Length == 0))
    encryptedToken2 = "";
else
    encryptedToken2 = results[11];

if ((results[12].Length == 0))
    encryptedToken3 = "";
else
    encryptedToken3 = results[12];

if ((results[13].Length == 0))
    encryptedToken4 = "";
else
    encryptedToken4 = results[13];

if ((results[14].Length == 0))
    systemMessage = "";
else
    systemMessage = results[14];

if ((results[15].Length == 0))
    customerMessage = "";
else
    customerMessage = results[15];

if ((results[16].Length == 0))
    predefinedMessage = "";
else
    predefinedMessage = results[16];

if ((results[17].Length == 0))
    transactionAcknowledgeNumber = "";
else
    transactionAcknowledgeNumber = results[17];

对于可接受的编码标准,重构这个的最佳方法是什么?将此作为案例陈述是否可以接受?

1 个答案:

答案 0 :(得分:1)

这不是一个案例执行,所以它不能被重构为switch-case。然而,它可以转换为功能代码,然后将其分解为一个单独的方法,以便" ugly"部分隐藏在方法调用之后。

步骤#1 - 使代码正常运行

在这里,我们通过遵循功能代码编写实践来重写代码。重写的代码如下所示:

customerName = (results[0].Length == 0) ? "" : results[0].Substring(18);
meterSerialNumber = (results[1].Length == 0) ? "" : results[1];
customerID = (results[2].Length == 0) ? "" : results[2];
meterCreditAmount = (results[3].Length == 0) ? "" : results[3];
debtInstallmentDeduction = (results[4].Length == 0) ? "" : results[4];
vatOnEnergyAmount = (results[5].Length == 0) ? "" : results[5];
.
.
.
transactionAcknowledgeNumber = (results[17].Length == 0) ? "" : results[17];

以这种方式编写代码有很多好处。重要的包括:

  • 代码简洁;
  • 在一个地方(通过三元运算符)而不是两个(if中的一个和else子句中的另一个)初始化值。

步骤#2 - 分解方法

既然已经在功能上初始化了值,您可以创建一个包含属性customerNamemeterSerialNumber,...,{{1}的类(或者您可能已经拥有此类) }。可以将类的构造函数设计为读取transactionAcknowledgeNumber并填充类成员,也可以编写一个方法来读取结果。所以它看起来像:

results

<子> PS:

1。我承认ResultValues resultVal = new ResultValues(); resultVal.Read(results); . . . //Accessing the values later in the code Print(resultVal.customerName); ... 可能不是一个好的课程。或者,您可以通过添加相关数据来创建多个类,然后让这些类的ResultValues方法读取Read()中的值。

2。步骤#2的基本思想是将“丑陋的”&#34;另一个简单易读的方法调用。