Есть ли лучший способ моделировать пищевое поведение организма? - PullRequest
1 голос
/ 26 февраля 2010

По сути, у каждой сущности будет свой набор поведения при кормлении, которому она будет следовать. Почему-то модель, которую я придумал, не подходит. Я думаю, что самая тревожная часть в том, что использование синглетонов имело смысл.

Есть ли лучший способ?

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;
    }
}

1 Ответ

1 голос
/ 26 февраля 2010

Я думаю, что ваше решение отлично. Организм состоит из пищевого поведения, где каждое пищевое поведение является неизменным объектом, который реализует это поведение. Поскольку поведение обычно реализуется как классы, ваши синглтоны выглядят здесь как вполне допустимые.

Единственное, о чем я могу думать, это то, что публично видимый класс для поведения Myrmecophagy может быть ненужным. Вы можете просто поместить класс в FeedingBehavior, сделать его закрытым и открыть только статическое общедоступное поле только для чтения, содержащее синглтон.

Если вам интересно, у меня есть реализация 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
   {
      ...
...