所以我有一个巨大的(遗留)文件,称之为huge.cxx。我正在添加新功能,但文件越来越大。我试图为不同的作业创建不同的类,但对于某些任务,我需要访问私有变量。以下是的大致情况
//HUGE.h
class Huge{
NewFeature object;
//...more stuff
};
//HUGE.cxx
Huge::Huge(){
//imagine object keeps track of id->func callback
object.on('uniqueID1', boost::bind(&HUGE::onID1Clicked,this));
}
void Huge::onID1Clicked()const{ return satisfiesSomeCondition(); }
//called internally when user right clicks
void Huge::createPopup()const{
for itr = object.begin to end
callback = itr->second;
//if satisfies condition add to popupmenu
if(callback()) addToPopupMenu( itr->first );
}
//event handler
void Huge::event(id){
//oh uniqueID1 was clicked as a menu item in right click
case 'uniqueID1': doSpecificFunctionality(); break;
}
所以你看,我有一些依赖关系,但文件太大了,我的更改也是如此。关于进一步分离成更多的文件,你有什么建议吗。我知道我可以在Huge文件中添加一个友元声明并添加另一个类,但如果可能的话,我想避免这个选项。
听起来您实际上需要进行一次重大重构,将关注点分离到适当的位置。
但是,为了解决眼前的问题,没有什么特别的理由需要在Huge.cxx
中定义所有的Huge
。您可以将函数定义拆分为单独的文件,只要每个函数都在的某个地方定义即可。
你可能会得到:
Huge.h
Huge-private.cxx
Huge-public.cxx
或者不管怎样,拆分代码都是有意义的。
只要所有的.cxx
文件都包括HUGE.h
,并且所有使用的函数都在那里声明(应该是这样),就可以将实现拆分为任意多的.cxx
文件。您甚至可以将每个函数放入自己的文件中。
要调用一个函数,编译器只需要从HUGE.h
中看到原型。稍后,当所有编译的文件链接在一起时,链接器将根据需要组合来自不同对象文件的代码。
认真的建议:了解重构(http://refactoring.com)以及设计模式。
如果没有看到整个的内容,就很难或不可能告诉你一些真正具体的东西。你可能需要一个重构武器库。对于某些部分,提取方法和合并通用功能是正确的;对于其他部分,依赖性反转可能是选择的工具。
除了一些关键的烂泥,(干净的)重写可能是最明智、最有利可图的事情:从定义输入和预期输出开始(在此期间,编写测试)。