99
парадигмой автоматного программирования и не знают, что автоматные модели
следует применять при разработке ПО систематически, для описания сложного
поведения, а не от случая к случаю, как например, при программировании
компиляторов и решении еще нескольких специфических задач.
Однако и в объектно-ориентированном программировании с явным выделением
состояний на первых этапах его развития акценты были расставлены точно таким же
образом. В первых работах (например, в работе [58]) по этой парадигме
предполагалось, что процесс проектирования должен происходить так же, как при
процедурном программировании с явным выделением состояний. Результатом этого
процесса, как и раньше, должно было быть множество взаимодействующих
автоматов и подпрограмм. И только после этого, уже на стадии реализации, в
разработку вовлекался объектно-ориентированный подход: предпринимались
попытки «втиснуть» эту совершенно чуждую объектной технологии древовидную
архитектуру, основанную на функциях, в множество классов.
При этом архитектура система получается неприспособленной к модификации,
непонятной, да и просто некрасивой – но это полбеды. Настоящая же беда
начинается тогда, когда в стройную объектно-ориентированную систему, которая
разрабатывалась долго и тщательно и имеет структуру на основе объектной
декомпозиции, вдруг понадобится ввести сущность со сложным поведением. Для
объектно-ориентированных систем введение новой сущности – это обыденная и
безболезненная операция. Она требует добавления нового класса, и небольших
изменений в тех классах, которые должны стать его клиентами. Однако при
описанном подходе к сочетанию автоматной и объектно-ориентированной парадигм,
вместо добавления одного класса придется перепроектировать всю систему с нуля в
автоматном стиле. Не самая радужная перспектива!
Таким образом, в настоящее время в индустрии разработки программного
обеспечения сложилась ситуация, когда автоматы используются для описания
поведения только в крайне сложных и ответственных системах, которые проще
перепроектировать с нуля с применением автоматов, чем заставить правильно
работать без них. В то же время, за использование автоматов при разработке
некритичного ПО приходится платить слишком высокую цену.
Корни этой проблемы в том, что автомат продолжает восприниматься как
подпрограмма. Даже если эта подпрограмма «обернута» в класс и переменная с
номером текущего состояния инкапсулирована в этом классе (что само по себе
неплохо) [58], сути дела такая «обертка» не меняет.
ПРИМЕЧАНИЕ
В истории объектной технологии уже была похожая попытка построить объектно-
ориентированный вариант некоторой концепции, просто обернув подпрограмму в
класс. Речь идет о так называемых активных объектах – одной из моделей
параллельных вычислений, которая основывается на отождествлении объекта и
процесса (или потока). У класса, порождающего активные объекты, есть главная
подпрограмма, выполнение которой отождествляется с работой процесса (потока).
Модель активного объекта применяется в некоторых, в том числе, популярных
языках программирования, однако, ее использование связано с рядом проблем
(например, известная проблема аномалии наследования). Причина состоит в том,