有没有理由不重构这个,让它变得更简单?

时间:2013-09-18 21:20:43

标签: c# refactoring simplify

我在遗留代码库中遇到过这个问题:

string[] deptNo = UPC.getDept().Split(new Char[] {'.'});

......并认为这会更直接:

string[] deptNo = UPC.getDept().Split('.');

...但是如果有可能对点进行表征可能会导致整个意大利面条房屋在我做出这种改变时滑落,那么就不想改变它。

更新

回应所提出的警告:是的,我知道你需要在多年的意大利面条中匆匆忙忙地采取行动时的意思。对此代码的看似无关紧要的更改:

private void comboVendor_SelectedValueChanged(object sender, EventArgs e)
{
    try
    {
        if ((comboVendor.SelectedIndex >= 0) && (cmbVendor.Text != comboVendor.Text))
        {
            string t = comboVendor.Text; 
            t = t.Substring(0,maxVendorChar);
            t = t.Substring(0,substrLen);
            t = t.Trim();
            cmbVendor.Text = t;
            cmbVendor.Focus();
        }
    }
    catch (Exception ex)
    {
        Duckbill.ExceptionHandler(ex, "frmInv.comboVendor.SelectedValueChanged");
    }               
}

...即,将“Trim()”附加到“.Text”的实例,导致错误消息“指定的参数超出了有效值的范围”。因为“maxVendorChar”不大于被收集的字符串的值。因此,我必须将其更改为此才能使其正常工作:

private void comboVendor_SelectedValueChanged(object sender, EventArgs e)
{
    int substrLen;
    try
    {
        if ((comboVendor.SelectedIndex >= 0) && (cmbVendor.Text.Trim() != comboVendor.Text.Trim()))
        {
            string t = comboVendor.Text.Trim(); 
            substrLen = GetLowerInt(t.Length, maxVendorChar);
            t = t.Substring(0,substrLen);
            t = t.Trim();
            cmbVendor.Text = t;
            cmbVendor.Focus();
        }
    }
    catch (Exception ex)
    {
        Platypus.ExceptionHandler(ex, "frmInv.comboVendor.SelectedValueChanged");
    }               
}

private int GetLowerInt(int first, int second)
{
    return first < second ? first : second;
}

在远处,我听到一只乌鸦呱呱叫“永远不会”,但我不确定他在说什么。

更新2

每当人们注意到这个项目是多么的粘稠 - 滑,他们几乎总是建议我重构它;然而,如上所述,有时一点点的重构会引发一系列震耳欲聋的爆炸声,这让我希望自己能够独自生病。真正的解决方案是使用更好的方法和至少不太古老的技术来完全重写这个项目。这是我的愿景;但就目前而言,维护模式似乎是一天的顺序。

5 个答案:

答案 0 :(得分:3)

如果你正在处理一个泥泞的大球&#34;,那么最好单独留下(假设它表现正常)。

答案 1 :(得分:2)

取决于您是在寻找哲学原因还是技术原因。

没有技术原因。没有魔法,这两个陈述是一样的。 split的方法参数使用 params 关键字来允许可变数量的参数语法:

public string[] Split(params char[] separator)

有关将params关键字添加到方法参数的目的,请参阅此讨论:Why use the params keyword?

从哲学上讲,重构它可能没有任何实际好处。作为一般规则,您可能不希望仅仅因为可以清理,特别是没有测试。

答案 2 :(得分:1)

听起来你需要一些单元测试来为你提供重构代码所需的信心。最佳做法是在重构之前添加它们。

我们看不到Split()方法的方法签名,但如果它使用varargs,那么你的重构在理论上是安全的。

答案 3 :(得分:1)

假设getDept()返回一个字符串,第一种方法的优点是可以更容易地将新字符包含为拆分器。您只需将它们添加到char数组中。第二种方法修复了分隔字符。 在第二种方法中,'。'也是一个字符,不像“。”,它是一个字符串。 如果方法getDept()返回方法为Split(char[] splitters)的自定义类,则除非方法的重载为Split(char splitter),否则您将遇到麻烦。 在完全不相关但重要的一点上,实现版本控制系统可能是一个好主意,这样当某些内容失败时,您可以“重新滚动”更改(即返回到先前的“提交”)。 / p>

答案 4 :(得分:1)

我认为重新分解此代码没有任何价值,因为我在这里找不到任何附加值。

此外,我还会保留当前的代码,因为它可以让我在期货中添加更多的分隔符。