重构 - 如果情况我应该留下多余的

时间:2015-12-29 11:15:22

标签: c# refactoring

我正在修复c#中这个冗长冗长的方法的错误,并且一直在找到这些多余的if

ES

//var objParam = new SqlParameter(); var cmd = new SqlCommand(); var myVar = new Foo();
objParam = cmd.Parameters.Add("@SomeParam", SqlType.NVarchar, 40);
if(myVar.SomeParam.Length > 4)
    objParam.Value = myVar.SomeParam.Substring(0, 40);
else
    objParam.Value = myVar.SomeParam;

这些if在任何地方重复了一百万次,并始终为SqlType.NVarChar

我的问题是,我应该离开吗?我认为它不会使代码变慢或者任何东西,但是方法更长,并且它对可读性没有帮助。

我认为它们应该全部替换为

objParam = cmd.Parameters.Add("@SomeParam", SqlType.NVarchar, n);
objParam.Value = myVar.SomeParam.Substring(0, n);

显然有n个字符数。

注意:我知道这种添加参数的VB6方式非常陈旧但是我试图让我的老板不要注意我在这些旧程序上做的所有小的重构;)

3 个答案:

答案 0 :(得分:1)

创建此方法:

private static string getSomeParam(var myVar) => 
    myVar.SomeParam.Length > 40 ? myVar.SomeParam.SubString(0, 40) 
                                : myVar.SomeParam;

然后像这样使用它:

//var objParam = new SqlParameter(); var cmd = new SqlCommand(); var myVar = new Foo();
objParam = cmd.Parameters.Add("@SomeParam", SqlType.NVarchar, 40);
objParam.Value = getSomeParam(myVar);

这将增加可读性,并且将来可以轻松编辑此方法。因此,如果您决定将40变为常量maxLength或某个地方的某个地方。

如果您想更改myVar中的getSomeParam()值:

private static string getSomeParam(var myVar, var out objParam) =>
    objParam.Value = myVar.SomeParam.Length > 40 ? myVar.SomeParam.SubString(0, 40) 
                                                 : myVar.SomeParam;

并称之为:

objParam = cmd.Parameters.Add("@SomeParam", SqlType.NVarchar, 40);
getSomeParam(myVar, out objParam);

答案 1 :(得分:0)

当你有相同外观的if执行有意义的操作时,制作一个帮助方法是个好主意。它不仅可以使您的代码更短更容易阅读,而且还可以消除可能有害的复制,完美地通过您的问题中的拼写错误说明:

if(myVar.SomeParam.Length > 4) // <<= This const should be 40, not 4
    objParam.Value = myVar.SomeParam.Substring(0, 40);
else
    objParam.Value = myVar.SomeParam;

制作一个如下所示的帮助:

private static SqlParameter AddNvarchar(SqlCommand cmd, string name, int size, string val) {
    var res = cmd.Parameters.Add(name, SqlType.NVarchar, size);
    if(val.Length > size)
        res.Value = val.Substring(0, 40);
    else
        res.Value = val;
    return res;
}

现在您可以用以下方法替换多行分配:

var objParam = AddNvarchar(cmd, "@SomeParam", 40, myVar.SomeParam);

答案 2 :(得分:0)

我认为真正的问题 - 为什么你称之为“冗余”代码 - 如果你要获取长度小于40的字符串的子字符串,你只需返回原始字符串。所以编写逻辑只在子字符串长于40的情况下才会占用字符串,从而不必要地为代码库添加逻辑,复杂性和风险。

不幸的是,这不是C#substring方法的工作方式 - 如果你给它太短的字符串,它将抛出ArgumentOutOfRangeException。所以检查不是多余的。写这个的另一种方法是:

objParam.Value = myVar.SomeParam.Substring(0, Math.Max(40, SomeParam.Length));