私はゲームを開発しています。ゲーム内の各エンティティはGameObject
です。それぞれGameObject
は、、、およびで構成さGameObjectController
れGameObjectModel
ますGameObjectView
。(またはその継承者。)
NPCの場合、GameObjectController
は次のように分割されます。
IThinkNPC
:現在の状態を読み取り、何をすべきかを決定します
IActNPC
:実行する必要があることに基づいて状態を更新します
ISenseNPC
:現在の状態を読み取って世界の質問に答えます(例:「私は影に隠れていますか?」)
私の質問:これはISenseNPC
インターフェースに問題はありませんか?
public interface ISenseNPC
{
// ...
/// <summary>
/// True if `dest` is a safe point to which to retreat.
/// </summary>
/// <param name="dest"></param>
/// <param name="angleToThreat"></param>
/// <param name="range"></param>
/// <returns></returns>
bool IsSafeToRetreat(Vector2 dest, float angleToThreat, float range);
/// <summary>
/// Finds a new location to which to retreat.
/// </summary>
/// <param name="angleToThreat"></param>
/// <returns></returns>
Vector2 newRetreatDest(float angleToThreat);
/// <summary>
/// Returns the closest LightSource that illuminates the NPC.
/// Null if the NPC is not illuminated.
/// </summary>
/// <returns></returns>
ILightSource ClosestIlluminatingLight();
/// <summary>
/// True if the NPC is sufficiently far away from target.
/// Assumes that target is the only entity it could ever run from.
/// </summary>
/// <returns></returns>
bool IsSafeFromTarget();
}
どのメソッドもパラメータを取りません。代わりに、実装は関連するものへの参照を維持し、GameObjectController
それを読むことが期待されます。
しかし、私は現在、このための単体テストを作成しようとしています。もちろん、引数を直接渡すことはできないので、モッキングを使用する必要があります。私のやり方は本当にもろく感じます-ワールドクエリユーティリティを別の方法で使用する別の実装が登場した場合はどうなりますか?実際、私はインターフェースをテストしていません。実装をテストしています。貧しい。
そもそもこのパターンを使用した理由は、IThinkNPC
実装コードをクリーンに保つためでした。
public BehaviorState RetreatTransition(BehaviorState currentBehavior)
{
if (sense.IsCollidingWithTarget())
{
NPCUtils.TraceTransitionIfNeeded(ToString(), BehaviorState.ATTACK.ToString(), "is colliding with target");
return BehaviorState.ATTACK;
}
if (sense.IsSafeFromTarget() && sense.ClosestIlluminatingLight() == null)
{
return BehaviorState.WANDER;
}
if (sense.ClosestIlluminatingLight() != null && sense.SeesTarget())
{
NPCUtils.TraceTransitionIfNeeded(ToString(), BehaviorState.ATTACK.ToString(), "collides with target");
return BehaviorState.CHASE;
}
return currentBehavior;
}
おそらく、清潔さはそれだけの価値はありません。
したがって、ISenseNPC
毎回必要なすべてのパラメータを取得する場合は、静的にすることができます。何か問題はありますか?