我有两种方法几乎相同的内容:
public string Method1(int someInt)
{
if(someBoolean)
return "test";
if(someOtherBoolean)
{
return "dfjakdsad";
}
else
{
string myStr = getString(someInt)
}
}
public string Method2(myEnum myenum)
{
if(someBoolean)
return "test";
if(someOtherBoolean)
{
return "dfjakdsad";
}
else
{
string myStr = getString(myenum)
}
}
Run Code Online (Sandbox Code Playgroud)
区别在于方法签名和单个语句else,string myStr = getString
从许多地方调用Method1,因此它必须以某种方式保留.我该怎么重构呢?
如果您的枚举可以转换为int,并假设您的getString返回枚举的数值而不是文本,那么只需:
public string Method2(myEnum myenum)
{
return Method1((int)myenum);
}
Run Code Online (Sandbox Code Playgroud)
作为一个有趣的一面 - 我已经看到这种情况创造了"相同的空白,不同的价值观".
另外有趣的是 - 我的基于头部的编译器说代码实际上不会编译:-)
我不担心重构这一点 - 增益略高于代码可读性,并且可能,如果发生变化,降低了变更的复杂性 - 但是它不是复杂的代码,因此如果大量使用额外的测试开销可能超过增益.
更新:如果enum getString返回文本,即"Foo",那么你就不能以我所描述的方式重构这段代码.
我建议使用泛型:
public string Method<T>(T arg)
{
if(someBoolen)
return "test";
if(someOtherBoolean)
{
return "dfjakdsad";
}
else
{
string myStr = getString(arg)
}
}
Run Code Online (Sandbox Code Playgroud)
这假设它getString本身是通用的或可以处理任何类型的对象.