文件变得非常大,需要将数据分离到另一个文件中,但也需要使用私有变量.我怎样才能正确地做到这一点



所以我有一个巨大的(遗留)文件,称之为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)以及设计模式。

如果没有看到整个的内容,就很难或不可能告诉你一些真正具体的东西。你可能需要一个重构武器库。对于某些部分,提取方法和合并通用功能是正确的;对于其他部分,依赖性反转可能是选择的工具。

除了一些关键的烂泥,(干净的)重写可能是最明智、最有利可图的事情:从定义输入和预期输出开始(在此期间,编写测试)。

相关内容

  • 没有找到相关文章

最新更新