1

基本的に、各エンティティには、それが従う摂食行動のコレクションがあります。どういうわけか、私が思いついたモデルは適切ではありません。最も厄介な部分は、シングルトンの使用が理にかなっているということです。

より良い方法はありますか?

public bool IsEntityEdible(Entity target)
{
    foreach (var feedingBehavior in FeedingBehaviors)
    {
        if (feedingBehavior.WouldEat(target))
        {
            return true;
        }
    }

    return false;
}

public abstract class FeedingBehavior
{
    public abstract bool WouldEat(Entity entity);   
}

public sealed class Myrmecophagy : FeedingBehavior
{
    public readonly static Myrmecophagy Instance = new Myrmecophagy();

    private Myrmecophagy() { }

    public override bool WouldEat(Entity entity)
    {
        return entity is Ant || entity is Termite;
    }
}
4

1 に答える 1

1

あなたのソリューションは完全に問題ないと思います。生物は摂食行動で構成されており、各摂食行動は行動を実装する不変のオブジェクトです。通常、動作はクラスとして実装されるため、ここではシングルトンが完全に有効に使用されているように見えます。

私が考えることができる唯一のことは、Myrmecophagy 動作のパブリックに表示されるクラスは不要である可能性があるということです。クラスを FeedingBehavior 内に配置し、プライベートにして、シングルトンを保持する public static read-only フィールドのみを公開することができます。

興味がある場合は、私のプロジェクトの 1 つに RFC3454 の実装があります。RFC では、さまざまなプロファイルに従って文字列を準備するためのフレームワークについて説明しています。そこで、いくつかの標準プロファイルをシングルトン インスタンスとして公開するか、ユーザーがカスタム プロファイルを実装するために拡張できる抽象クラス StringPreparer を作成しました。

public abstract class StringPreparer
{
   public static readonly StringPreparer Domain = new DomainStringPreparer();
   public static readonly StringPreparer Node = new NodeStringPreparer();
   public static readonly StringPreparer Resource = new ResourceStringPreparer();
   public static readonly StringPreparer Sasl = new SaslStringPreparer();
   public static readonly StringPreparer Trace = new TraceStringPreparer();

   protected StringPreparer()
   {
   }

   public abstract bool TryPrepare(
      string text, int offset, int count, out string result);

   ...

   private class DomainStringPreparer : StringPreparer
   {
      public override bool TryPrepare(
         string text, int offset, int count, out string result)
      {
         ...
      }
   }

   private class NodeStringPreparer : StringPreparer
   {
      ...
于 2010-02-26T00:21:06.923 に答える