2

いくつかのクラスで一連の操作を定義するためにビジターパターンを使用しています。
一部の操作は可換であるため、ビジターパターンコードが重複することになります。
クラスABCがあり、操作がA * A、A * B、A * C、B * A、B * B、B * C、C * A、C * B、C*Cであるとします。
A * A、B * B、C*Cは一意です。
A * B、B * Aとその友人は、A * Bを実装し、B*AにA*Bを呼び出すことができるコードの重複がありますが、最終的には自分自身に問いかけます。どのファイルで、AとBの間の操作を再度実装しましたか。 、AまたはBで?(クラスは約6つあるので、この質問をたくさんします。15組の可能な操作)
将来、誰かが実装時にA*BがB*Aを呼び出してA*Bを呼び出す無限ループを起こすリスクがあります。新しい操作。
A*BとB*Aのどちらを実装するかを決定する規則があるのは不自然です。
A*BとB*Aのいずれかによって呼び出される、実装されたすべての関数を含む3番目のファイルを作成できましたが、オブジェクト指向ではないようです。
この問題をどのように解決しますか?
ありがとう
(私はいくつかのコードをリストすることができましたが、それは長く、ポイントを簡単に説明していません)

4

2 に答える 2

4

A*Bあなたは正しいです、あなたは間違いなくの呼び出しとして実装することを控えるべきですB*A。呼び出しの無限のチェーンを作成する可能性に加えて、コードは対称ではないため、このアプローチはコード内の操作の対称性を反映していません。

より良いアプローチは、言語でサポートされているものに応じて、ヘルパークラスまたはトップレベル関数として「対称」操作を実装し、両方を作成してそのヘルパー実装A*BB*A呼び出すことです。

于 2012-08-18T15:30:50.823 に答える
1

私の提案は、パラメータービルダーとして機能するビルダーを使用することです

new ParameterBuilder()
    .setFirst( "A" )
    .setSecond( "B" )
    .setThird( "C" )
    ...
    .build();

ParameterBuilderそうすると、引数を取るメソッドは1つだけになります。

于 2012-08-18T15:42:26.463 に答える