0

所以我有一个巨大的(遗留)文件,称之为 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 文件添加一个朋友声明并添加另一个类,但如果可能的话想避免这个选项。

4

3 回答 3

3

听起来您实际上需要进行重大重构,将关注点分离到适当的位置。

但是,为了解决您眼前的问题,没有特别的理由为什么Huge需要在Huge.cxx. 您可以将函数定义拆分为单独的文件,只要每个函数都在某处定义。

你最终可能会得到:

  • Huge.h
  • Huge-private.cxx
  • Huge-public.cxx

或者,拆分代码是有意义的。

于 2013-02-21T16:47:56.730 回答
2

只要所有.cxx文件包括HUGE.h,并且所有使用的函数都在那里声明(应该是这种情况),您就可以将实现拆分为任意数量的.cxx文件。您甚至可以将每个函数放入自己的文件中。

要调用一个函数,编译器只需要从HUGE.h. 稍后,当所有编译的文件链接在一起时,链接器将适当地组合来自不同目标文件的代码。

于 2013-02-21T16:48:23.747 回答
1

严肃的建议:了解重构 ( http://refactoring.com ) 和设计模式。

没有看到整个事情,很难或不可能告诉你一些真正具体的事情。你可能需要一个重构弹药库。对于某些部分,提取方法和合并通用功能是正确的;对于其他部分,依赖倒置可能是首选工具。

除了一些临界质量之外,(干净的)重写可能是最明智和最有利可图的事情:首先定义输入和预期输出是什么(在此期间,编写测试)。

于 2013-02-21T16:48:54.543 回答