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 に答える