Шаблон дизайна, чтобы избежать нескольких ifs - PullRequest
6 голосов
/ 21 октября 2011

У меня действительно классный класс с двумя методами, которые запускают или останавливают некоторые службы, когда эти службы доступны. Что-то вроде следующего (они не if-elses, просто если):

void startServices() { 
if (service1 == true) { 
  start1();
}
if (service2 == true) { 
  start2();
} if (serviceN == true) { 
  startN();
} 
} 


void stopServices() { 
if (service1 == true) { 
  stop1();
}
if (service2 == true) { 
  stop2();
}
if (serviceN == true) { 
  stopN();
}

}

Рекомендуете ли вы какой-нибудь дизайн, чтобы он был красивее?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 21 октября 2011

Вы можете использовать шаблон Стратегии.

Идея состоит в том, что вы должны знать, какую стратегию вы собираетесь использовать, когда создаете экземпляр своего класса (или вы можете изменить его динамически в latrr). Следовательно, вы можете передать эту стратегию при создании экземпляра (и при необходимости заменить его позже).

public interface IStartupStrategy
{
    void Start();
}

public interface IStopStrategy
{
    void Stop();
}

public class MyClass
{
    private readonly IEnumerable<IStartupStrategy> startupStrategies;
    private readonly IEnumerable<IStopStrategy> stopStrategies;

    public MyClass(IEnumerable<IStartupStrategy> startup, IEnumerable<IStopStrategy> stop)
    {
        this.startupStrategies = startup;
        this.stopStrategies = stop;
    }

    public void Start()
    {
        foreach(var strategy in this.startupStrategies)
        {
            strategy.Start();
        }
    }

    public void Stop()
    {
        foreach(var strategy in this.stopStrategies)
        {
            strategy.Stop();
        }
    }
}
4 голосов
/ 21 октября 2011

Зависит; Моя первая реакция - хранить сервисы в хэше или массиве. Каждый сервис реализует интерфейс с методами start и stop. Для запуска или остановки службы требуется только служебный ключ или индекс.

Возможно, все еще немного хрупко, но, не зная больше, я не уверен, как "доменизировать" ut, так что это больше похоже на то, что вы делаете.

2 голосов
/ 21 октября 2011

Используйте Объекты, где у вас есть список Сервисов, который вы можете перебирать, отключая их с помощью унаследованного метода stop ().

public interface Service {
  void start();
  void stop();
}

public class TestService implements Service {
  @Override
  void start() {
  }

  @Override
  void stop() {
  }
}

Каждый сервис также может сохранять свое состояние, чтобы только включитьих выключить, если они включены.

0 голосов
/ 21 октября 2011

Операторы Switch менее запутаны.При использовании вместе с перечислениями код становится очень читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...