Приложения ТРИЗ к программированию

Приложения ТРИЗ к программированию

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

Тем не менее, надо описать решение так, чтобы тупой (несколько тупых) смогли качественно и незатратно порученную задачу выполнить.

Остальное понятно из контекста разбираемых примеров.

ПРИМЕР 2. "НЕВАЖНО ГДЕ РИСОВАТЬ. "

С.В. Сычев, идея, текст про тупогоК.А. Лебедев, задача

ШАГ 0ЧТО МЫ ИМЕЕМ?

В графический редактор, который "умеет" работать с линиями, прямоугольниками и многоугольниками, понадобилось добавить новую фигуру – кривую Безье второго порядка.

Это вот такая штуковина. Кривая Безье 2-го порядка.

Согласно требованиям, фигура должна делать следующее:

  • Во-первых, рисовать себя в окне.
  • Во-вторых, проверять, попадает ли заданная точка на линию контура.

Поскольку вторая задача для кривых Безье аналитически неразрешима, она выполняется в два прохода:

  • Сначала кривая Безье преобразуется в ломаную линию,
  • а затем (уже для ломаной линии!) осуществляется проверка на попадание точки.

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

Для устранения дублирования кода программист инкапсулировал алгоритм растеризации в базовом классе, а конкретные функции "рисования", вызываемые из алгоритма, поместил в производные классы. В результате, получились три класса: базовый и два производных. Базовый класс ответственен за алгоритм, производные – за рисование в окне и формирование набора точек.

// Базовый класс: содержит алгоритм растеризации class CBezier2 ; // Производный класс: реализует функции MoveTo и LineTo для рисования в окне class CBezier2InWindow : public CBezier2 ; // Производный класс: реализует функции MoveTo и LineTo для рисования в памяти class CBezier2InMemory : public CBezier2

📎📎📎📎📎📎📎📎📎📎