我有一个项目。在此项目中,我希望对其进行重构以添加功能,并且对项目进行重构以添加功能。
问题是,当我完成后,原来我需要做一个小的接口更改以适应它。所以我做了改变。然后,就新类而言,无法使用其当前接口来实现消费类,因此它也需要一个新接口。现在已经三个月了,我不得不解决了几乎不相关的无数问题,而且我正在寻找解决从现在开始经过一年规划的问题,或者只是因为困难而列为无法解决的问题,然后再进行编译再次。
将来如何避免这种级联重构?这仅仅是我以前的课程互相依赖的一种征兆吗?
简要编辑:在这种情况下,重构就是功能,因为重构增加了特定代码的可扩展性并减少了一些耦合。这意味着外部开发人员可以做更多的事情,而这正是我想要提供的功能。因此,原始重构本身不应该是功能上的更改。
我五天前承诺的更大修改:
在开始重构之前,我有一个带有接口的系统,但是在实现中,我只是简单地dynamic_cast
通过了所有可能的实现。显然,这意味着您不能一方面从接口继承,其次,对于没有实现访问权即可实现此接口的任何人,这都是不可能的。因此,我决定要解决此问题并开放供公众使用的界面,以便任何人都可以实施,而实施该界面是整个合同所必需的-显然是一项改进。
当我发现并用火杀死所有地方时,我发现一个地方被证明是一个特殊的问题。它取决于所有各种派生类的实现细节以及已经实现但在其他地方更好的重复功能。它可以代替公共接口来实现,而可以重新使用该功能的现有实现。我发现它需要特定的上下文才能正常运行。粗略地说,调用先前的实现看起来像
for(auto&& a : as) {
f(a);
}
但是,要获得此上下文,我需要将其更改为更类似的内容
std::vector<Context> contexts;
for(auto&& a : as)
contexts.push_back(g(a));
do_thing_now_we_have_contexts();
for(auto&& con : contexts)
f(con);
这意味着对于以前曾经是其中一部分的所有操作f
,其中一些操作需要成为g
无需上下文的新功能的一部分,而其中某些操作则需要由现在延迟的一部分组成f
。但是,并非所有方法都f
调用需要或需要此上下文-其中一些需要通过单独的方式获得的独特上下文。因此,对于f
最终调用的所有内容(大致来说,几乎所有内容),我必须确定他们需要的上下文(如果有的话),应该从哪里获取以及如何将它们从旧f
分为新f
与新g
。
这就是我最终所处位置的方式。我一直坚持下去的唯一原因是因为无论如何我都需要这种重构。