Рекомендация 104. Замените условные операторы полиморфизмом.

искусственный интеллект

Предположим, разработка автономной системы вождения. В начале своего проектирования система автопилота имеет нумерационный тип команд системы вождения:

enum DriveCommand

{

Начало,

       stop

}

Предположим также, что существует метод вождения, который обрабатывает команды, получаемые транспортным средством. Сначала мы кодируем так:

статическая пустота Main (string [] args)

{

   DriveCommand comand=DriveCommand.Start;

   Drive(comand);

   comand=DriveCommand.Stop;

    Drive(command);

}

static void Drive(DriveCommand command)

{

     if(command==DriveCommand.Start)

     {

// запуск автомобиля

      } else if(command==DriveCommand.Stop)

       {

//Автомобиль останавливается

        }

}

Или с переключателем:

static void Drive(DriveCommand command)

{

    switch(command)

     {

         case DriveCommand.Start:

// запуск автомобиля

              break;

        case  DriveCommand.Stop:

//Автомобиль останавливается

       break;

      default:

          break;

 }

}

По мере разработки новых функций мы добавляем все больше и больше команд.

enum DriveCommand

{

Начало,

останавливаться,

Пауза,

       turnLeft

          .

          .

}

С увеличением количества элементов DriveCommand использование оператора if или оператора switch будет очень запутанным, и у вас могут быть сотни различных команд в сложном Xiongtai. Для каждой дополнительной команды мы должны изменить метод Drive. Метод Drive был бы чрезвычайно раздутым, и каждая строка кода была бы почти идентичной.

В этом случае мы должны рассмотреть вопрос о рефакторинге исходного кода и соблюдении принципа открытого-закрытого в шаблоне проектирования. Принцип открытого-закрытого означает: открыть для расширения, закрыть для модификации.

Создайте абстрактный класс:

abstract class Commander

{

     public abstract void Execute();

}

Все команды, такие как Start или Stop, наследуются от этого абстрактного класса.

класс StartCommander: Командир

{

        public override void Execute()

         {

//запускать

         }

}

класс StopCommander: Командир

{

        public override void Execute()

         {

//останавливаться

         }

}

После использования полиморфизма следующий код изменяется на:

static void Main(string[] args)

{

     Commander commander=new StartCommander();

      Driver(commander);

      commander=new StopCommander();

      Driver(commander);

}

static void Drive(Commander commander)

{

     commander.Execute();

}

Таким образом, код намного упрощается, а расширяемость повышается.Для метода Drive, даже если добавить больше имен, изменение выравнивания не требуется.