0

外部ファイルからデータを読み込み、データを操作し、計算を行うクラスを作成しました。

クラス、特にコンストラクターが非常に長い。ここで、外部ファイルからデータを読み込み、計算の準備として操作します。これを行うには、テンプレート関数を使用します。

クラスを分割した方がスタイルが良いことはわかっていますが、変更できない商用コードと組み合わせて使用​​しています。また、コードを使用する必要がある人は、それが 1 つのクラス + 補助ファイルである必要があるため、この 1 つのクラスに制限されています。コードを読みやすくするために、コンストラクターからのコードの一部を「auxiliary.h/.cpp」というヘルパー .cpp/.h ファイルに保存し、関数を介してアクセスしたいと思います。

問題は次のとおりです。

1) テンプレート関数 (クラスのメンバー関数) を関数引数として補助ファイルに渡します。これはできませんが、「曖昧さ回避」と呼ばれるものによって可能になるかもしれないと聞いています。テンプレート以外の関数やベクトルなどを渡すことは問題ありません...テンプレート関数が問題です。

2) また、テンプレート関数を引数として補助ファイルにアクセスする関数に渡すことができたとしても、引数リストが非常に長くなってしまいます。

私が知りたいのは、補助ファイルがクラスを「見る」ようにする方法はありますか? 補助ファイルで処理を行う各関数で、クラスのインスタンスを引数/パラメーターとして渡そうとしました。しかし、これは「instanceNameがこのスコープで宣言されていません」という結果になり、かなり循環的/複雑なアプローチのように見えます。

アドバイスをいただければ幸いです。ありがとう。

4

2 に答える 2

4

クラスを分割する方が良いスタイルだと思いますが、変更できない商用コードと組み合わせて使用​​しています...

私はあなたの特定の状況についてより多くの背景を見逃しているかもしれませんが、あなたが使用しているサードパーティのコードに関係なく、あなたはあなたが書いたコードであなたがやりたいことを何でもできるはずです、そしてあなたはたくさん書いたようです。

クラスが大きすぎることを認識したので、次のステップは、クラスを個別の、よりまとまりのあるクラスに分割することです。すでに大きい1つのクラスの内部状態を単純に変更する他のファイル/関数を作成しようとすると、コードがさらに大きくなり、現在よりもさらにスパゲッティになります。

サードパーティのライブラリが、作成した単一のクラスで動作する必要がある場合は、Facadeデザインパターンを確認してください。複雑なクラスの「見た目」を外部に簡単に設定できますが、内部的には、より専門的なクラスをいくつでも作業に委任するだけです。

1つのクラスにサードパーティのライブラリへのアクセスを許可する場合は、それも可能です。アダプタのデザインパターンなどを見てみましょう。

私が提供できるもう1つのアドバイスは、リファクタリングに関するこの本を取り上げることです。複雑すぎるように見えるコードを取得し、手順を系統的に適用して、コードをはるかに読みやすく、保守しやすくする方法を示します。たとえば、データメンバーを見てみましょう。それらのいずれかが、1つのグループに属しているように見えますか(つまり、一緒にアクセス/変更されることがよくあります)?はいの場合は、メインクラスに必要なものだけを取得/設定するための最小限のインターフェイスを提供する独自のクラスにそれらを移動することを検討してください。

この投稿はあなたの特定の質問に答えませんが、一歩下がってください。実際には存在しないかもしれないいくつかの制約のために、OOルールと優れた設計原則を破るよりもはるかに優れた解決策があるかもしれません。

于 2011-10-15T08:22:46.843 に答える
0

おそらく、ヘルパー関数の代わりにテンプレート ヘルパー クラスを作成して、最初の (大きな) クラスへのポインターを渡すことができますか?

于 2011-10-15T08:10:09.953 に答える