C++. Паттерн «Стратегия». Приложение к знакомству. Ложная стратегия.

  • "Стратегия" как паттерн требует себе использования именно похожих по смыслу алгоритмов: если алгоритмы схожи только типом и количеством входных данных, то это не значит, что они подходят в качестве стратегий одной крови.
Чтобы лучше понять, что означает приведённое утверждение, сыграем роль человека, совершившего ошибку в выборе алгоритмов: вместо схожих по природе выберем разные, но схожие по количеству и типу входных данных. Обычные массивы в С++ задаются с фиксированным размером и только на уровне компиляции, помните сколько проблем это доставляло в начале изучения языка? Приходилось сразу использовать указатели и работать с памятью. Вот мы взяли и предположили, что все операции с памятью — это схожие действия. Чем схожие, сами не поняли, но коли всё одно — работа с памятью, посчитали, что все операции с памятью схожие, и стали писать код, в котором объединили операцию выделения памяти и операцию очистки в одну семью.
Готовый листинг этой части фигурирует под номером #5, здесь я показываю пошаговое формирование с небольшими ошибками и исправлениями.

Добавляем функции ввода в массив значений и функции вывода значений массива на экран.

Пишем части выделения и освобождения памяти. Записываем в массив значения и выводим их на экран.

Здесь, казалось бы всё хорошо. Мы можем подставлять предполагаемую стратегию в наш объект, а внутренний менеджер объекта сам позаботится о выполнении заказа на стратегию, т. е. использует заданную списком аргументов. Но не всё так прекрасно, как может показаться на первый взгляд.

  • Паттерн "стратегия" предполагает, что алгоритмы одной семьи могут свободно заменять друг друга.

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

Из-за того, что мы объединили разные алгоритмы в одну семью стратегий, у нас появились проблемы.

  • Паттерн "стратегия" предполагает, что в одной семье будут находиться исключительно схожие по смыслу алгоритмы, а не схожие по входным данным. Не разные действия, а разные варианты исполнения одного действия.
  • Использование готовой реализации паттерна не обязательно будет значить, что используется паттерн, имеющий эту реализацию.
  • Паттерн представляет собой не какой-то конкретный код, а общую концепцию или пример решения той или иной проблемы, которое нужно будет подстроить под нужды вашей программы.
  • Паттерн — это не только архитектура программы, но и сама решаемая задача.

Примеры схожих алгоритмов:
-выделение памяти разными способами
-разные способы произношения
-разные способы произвести подсчёт чего-либо
-разные способы произвести сортировку

Примеры разных алгоритмов:
-Произвести разные действия (сложить и вычесть, сложить и умножить…, сесть и прыгнуть, сказать и открыть окно).
-Произвести противоположные действия.

Хоть мы и использовали один из способов реализации стратегии, получилось, что мы использовали другой паттерн. Какой именно, не знаю, мне сказали, что команду.

Добавить комментарий

Ваш адрес email не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/aleksey-kostarev/php-5-6991697/?lfrom=15589587
Яндекс.Метрика