web-dev-qa-db-ja.com

ラッパーで大量のパススルー関数を記述しないようにするにはどうすればよいですか?

共通の基本型の別のクラスをラップするクラスがあります。基本型のインターフェイスは非常に大きいため、これには多くのパススルー関数の記述が含まれます。これを回避する方法を探しています。

例を作ってみましょう:

      Car
     /   \
Volvo     VolvoWithTrailer

今度は、VolvoWithTrailerのcarインターフェースにありとあらゆる関数を実装し、ラップされたVolvoオブジェクトで適切な関数を呼び出す必要があります。ただし、GetMaxSpeed()は低い値を返します。基本的に私は多くの機能を持っています

int VolvoWithTrailer::GetNumSeats() {
  return mVolvo.GetNumSeats()
}

これを解決する明白な方法は、VolvoWithTrailerをVolvoのサブクラスにすることです。

    Car
     |
   Volvo
     |
VolvoWithTrailer

しかし、それは継承よりも構成を優先するという原則に違反しているようです。

他にどのようにすれば、これらのラッパーをすべて記述しないようにすることができますか(言語はC++)。または-それがあなたの立場である場合-なぜ私はそれらを記述する/継承を使用する必要があるのですか?これに役立つテンプレートの魔法はありますか?

13
Sarien

私の意見では、プログラムのlong-term安定性と保守性を向上させるために、必要なものは何でも書くべきです。今日20行のコードを記述しないようにすることの意味は何ですか。このコードを使用する何かに触れたり、このクラスを維持するために戻ったりするたびに、今日の時間を入力しなかったためにさらに5分以上かかる場合は、

したがって、質問は「何を書く必要があるか」になります。決定的な答えを出すのに十分な情報を提供していないと思います。[〜#〜] i [〜#〜]が考えていることをいくつかリストアップします決定:

1。現在または予見可能な将来にTrailerオブジェクトを単独で持つ必要がありますか?
もしそうなら、あなたはすでにどちらか一方をラップしなければならないので、両方の複合オブジェクトの周りにラッパーを作ることについてかなり良い議論があります。一貫性があるかもしれません。

2。開発者が頻繁に使用するコードの領域にある3つのタイプ(Car、Trailer、CarWithTrailer)のいずれか、またはそうなる可能性が高いですか
そうである場合、間違ったものを選択することの影響は、コードに触れるたびに非常にコストがかかるため、非常に注意してください。そうでなければ、それは何の違いももたらさないかもしれませんwhatあなたが決める。方向を選択して、それで行ってください。

3。最も理解しやすいことは何ですか?
あなたの後ろに来る誰かがあなたがやろうとしていることをすぐに「得る」という1つのアプローチがあなたに飛びつきますか?チームメイトには、1つのアプローチを維持するのが難しくなるような特定のバイアスがありますか?すべてが等しい場合は、認知負荷が最も低いソリューションを選択します。

4。あるアプローチを別のアプローチよりも優れたものにしていますか?
私に飛びつくことの1つは、CarWithTrailerWrapperがany車とanyトレーラーをラップできると書くと、ラッパーのアイデアには明確な利点があるということですCarWithTrailer。次に、すべてのパススルーメソッドを作成することになりますが、各Car Classに1回ではなく、-onceのみを作成します。

これにより、車やトレーラーを追加するにつれて、パススルーメソッドを作成するための初期投資が大幅に安くなります。また、1つの実装だけでさらに多くのことができるため、CarWithTrailerWrapperへの結合の影響を減らしながら、VolvoまたはVolvoWithTrailerに直接結合する誘惑を減らすのにも役立ちます。

たぶん、拡張メソッドを使用することで無料で得られる明確な利点があるかもしれませんが、私にはわかりません。

わかりましたので、重要なアプリケーションのために、先に進んでパススルーメソッドを入力するように自分自身で話し合ったようです

私はC++プログラマーではないので、どのコード生成ツールを利用できるかわかりません。 IDE私が使用するインターフェイスからメソッドを生成できます コードテンプレートを追加 できるので、パススルーの記述がかなり簡単になります。アクセス権がない場合IDEこれにより、実際にはかなり遠くまで行くことができます Excelがコードを記述します

5
Amy Blankenship

基本型のインターフェイスは非常に大きいため、これには多くのパススルー関数を記述する必要があります。

そして、あなたの問題があります。

インターフェイスは1つの責任のみを処理する必要があります。それらを薄く集中的に維持することで、デコレータ、プロキシ、またはその他のラッパーの場合に使用する必要があるパススルー作業の量が制限されます(クラスシミュレータを使用、テスト、維持、および拡張することに加えて)。

3
Telastyn