私が今取り組んでいることの 1 つは、ゲームにいくつかの類似点があります。説明のために、架空の架空のゲームから引き出された例を使用して問題を説明します。
それをDeathBlaster 4: The Deatheningと呼びましょう。DB4 では、移動Ship
中に定期的かつランダムに遭遇する多数のオブジェクトがありPhenomena
ます。与えられた は、それに遭遇するPhenomenon
に 0 個、1 個、または複数個ある場合があります。たとえば、4 種類のと 3 種類の があるとします。Effects
Ship
Ships
Phenomena
現象 ========================================== 船の重力もブラックホール星雲フィールド ------------ -------------------------------------------------- ---- RedShip +20% スピード -50% パワー -50% シールド BlueShip 効果なし 無敵死 さまざまな効果 GreenShip -20% スピードデス +50% シールド 船の現象 イエローシップ死亡 +50% 威力 効果なし
さらに、Effects
相互に作用する可能性があります。たとえば、 aと a のGreenShip
両方にある a は、生成されたとの間である種の相乗効果を引き出すことができます。そのような場合、相乗効果自体が、たとえば、この相互作用の結果である可能性があります。最終結果がどうあるべきかを解決するために、a に作用するセット以外の情報は必要ありません。GravityWell
NebulaField
SpeedEffect
ShieldEffect
Effect
PowerLevelSynergyEffect
Effects
Ship
ここで問題が発生する可能性があります。単純な最初のアプローチとして、 everyが every の処理方法を知っている必要があるか、everyが every について知っている必要がありますShip
Phenomenon
Phenomenon
Ship
。これは明らかに容認できないため、これらの責任を別の場所に移したいと考えています。明らかに、ここには少なくとも 1 つの外部クラスがあり、おそらく aMediator
またはVisitor
何らかの種類です。
しかし、それを行うための最良の方法は何ですか? 理想的なソリューションには、おそらく次の特性があります。
- 新しい を追加するのと同じくらい簡単に、新しい
Ship
を追加できPhenomenon
ます。 - 効果を生み出さない相互作用はデフォルトであり、表現するための追加のコードは必要ありません。設定より規約。
- 相互にどのように相互作用するかを理解し
Effects
、これらの相互作用を管理して最終結果がどうなるかを決定することができます。
私は自分のアプローチがどうなるかをすでに決めていると思いますが、最良の設計のコンセンサスが何であるかを聞くことに興味があります. どこから始めますか?どのような道を探りますか?
フォローアップ更新:皆さん、ご回答ありがとうございます。これが私がやったことです。私の主な観察結果は、可能性のある×相互作用Effects
の数に比べて、異なる数が少ないように見えるということでした。つまり、相互作用の組み合わせはたくさんありますが、それらの相互作用の結果の種類の数は少なくなります。Phenomena
Ships
たとえば、表には 12 の相互作用の組み合わせがありますが、効果は 5種類しかないことがわかります。速度の変更、パワーの変更、シールドの変更、無敵、死亡です。
InteractionResolver
相互作用の結果を決定するために、3 番目のクラス を導入しました。Ship-Phenomenon
ペアをマップするディクショナリが含まれていますEffects
(基本的には、エフェクトといくつかのメタデータを実行するデリゲートです)。相互作用の計算結果が完了すると、それぞれに対応するShip
が渡されます。EffectStack
Effects
Ships
次に、 を使用して、既存の属性とプロパティに修飾子を追加することにより、それらEffectStack
の の実際の結果を決定します。Effects
私はこれが好きです:
Ship
について知る必要はありませんPhenomena
。Ship
-関係の複雑さは、 にPhenomena
抽象化されますInteractionResolver
。- 複数の、場合によっては複雑な効果を解決する方法の詳細は、 によって抽象化されてい
InteractionResolver
ます。船は必要に応じて効果を適用するだけです。 - これにより、追加の便利なリファクタリングが可能になります。たとえば、船が効果を処理する方法
EffectProcessorStrategy
は、 . デフォルトはすべての効果を処理することかもしれませんが、たとえば、 aBossShip
は異なる を持つことでマイナーな効果を無視するかもしれませんEffectProcessorStrategy
。