背景
我正在进行中的C#项目。我不是C#程序员,主要不是C ++程序员。因此,我基本上被分配了简单的重构任务。
该代码是一团糟。这是一个巨大的项目。由于我们的客户要求频繁发布具有新功能和错误修复的程序,因此所有其他开发人员在编码时都被迫采取暴力手段。该代码极难维护,所有其他开发人员都同意。
我不是在这里辩论他们是否做对了。在重构时,我想知道我是否以正确的方式进行操作,因为重构后的代码似乎很复杂!这是我作为简单示例的任务。
问题
有六类:A
,B
,C
,D
,E
和F
。所有的类都有一个功能ExecJob()
。所有六个实现都非常相似。基本上,起初A::ExecJob()
是写的。然后需要一个稍有不同的版本,该版本B::ExecJob()
通过对的复制粘贴修改进行实现A::ExecJob()
。当需要另一个略有不同的版本时,C::ExecJob()
编写此类代码。所有六个实现都有一些通用代码,然后有一些不同的代码行,再有一些通用代码,依此类推。这是实现的一个简单示例:
A::ExecJob()
{
S1;
S2;
S3;
S4;
S5;
}
B::ExecJob()
{
S1;
S3;
S4;
S5;
}
C::ExecJob()
{
S1;
S3;
S4;
}
SN
一组完全相同的语句在哪里。
为了使它们通用,我创建了另一个类并将通用代码移到函数中。使用参数控制应执行的语句组:
Base::CommonTask(param)
{
S1;
if (param.s2) S2;
S3;
S4;
if (param.s5) S5;
}
A::ExecJob() // A inherits Base
{
param.s2 = true;
param.s5 = true;
CommonTask(param);
}
B::ExecJob() // B inherits Base
{
param.s2 = false;
param.s5 = true;
CommonTask(param);
}
C::ExecJob() // C inherits Base
{
param.s2 = false;
param.s5 = false;
CommonTask(param);
}
请注意,此示例仅使用三个类和过分简化的语句。实际上,CommonTask()
通过所有这些参数检查,该函数看起来非常复杂,并且还有更多的语句。同样,在实际代码中,有几个CommonTask()
外观函数。
尽管所有实现都共享通用代码,并且ExecJob()
功能看起来更可爱,但仍然存在两个困扰我的问题:
- 对于中的任何更改
CommonTask()
,都需要测试所有六个(将来可能会更多)功能。 CommonTask()
已经很复杂了。随着时间的推移,它将变得更加复杂。
我做对了吗?