Приложения ТРИЗ к программированию
Для решения некоторых задач программирования в качестве "инструмента", облегчающего разработчику абстрагирование от конкретики, предлагается использовать "абсолютно тупого героя", которому поручается некая деятельность. Поскольку этот герой непроходимо туп (мы даже пишем его с маленькой буквы, чтобы и тени величия в нем не наблюдалось), то задача поручить ему деятельность, которая, тем не менее, должна быть выполнена — нетривиальна.
Тем не менее, надо описать решение так, чтобы тупой (несколько тупых) смогли качественно и незатратно порученную задачу выполнить.
Остальное понятно из контекста разбираемых примеров.
ПРИМЕР 2. "НЕВАЖНО ГДЕ РИСОВАТЬ. "С.В. Сычев, идея, текст про тупогоК.А. Лебедев, задача
ШАГ 0ЧТО МЫ ИМЕЕМ?В графический редактор, который "умеет" работать с линиями, прямоугольниками и многоугольниками, понадобилось добавить новую фигуру – кривую Безье второго порядка.
Это вот такая штуковина. Кривая Безье 2-го порядка.
Согласно требованиям, фигура должна делать следующее:
- Во-первых, рисовать себя в окне.
- Во-вторых, проверять, попадает ли заданная точка на линию контура.
Поскольку вторая задача для кривых Безье аналитически неразрешима, она выполняется в два прохода:
- Сначала кривая Безье преобразуется в ломаную линию,
- а затем (уже для ломаной линии!) осуществляется проверка на попадание точки.
Получается, что для рисования фигуры в окне и для проверки попадания точки необходимо совершить одинаковое действие – растеризацию. Понятно, что это действие удобно выполнять при помощи одной и той же процедуры. В противном случае, возникает дублирование кода, которое, как известно опытным разработчикам, потенциально чревато ошибками.
Для устранения дублирования кода программист инкапсулировал алгоритм растеризации в базовом классе, а конкретные функции "рисования", вызываемые из алгоритма, поместил в производные классы. В результате, получились три класса: базовый и два производных. Базовый класс ответственен за алгоритм, производные – за рисование в окне и формирование набора точек.
// Базовый класс: содержит алгоритм растеризации class CBezier2 ; // Производный класс: реализует функции MoveTo и LineTo для рисования в окне class CBezier2InWindow : public CBezier2 ; // Производный класс: реализует функции MoveTo и LineTo для рисования в памяти class CBezier2InMemory : public CBezier2