1.2. Декомпозиция

Декомпозиция известна давно и используется в самых разных предметных областях (при проектировании изделий, решении различных проблем, разработке крупных систем, программных комплексов и т.д.). Приведем пример /3/. Предположим, что группа авторов создает пьесу. Каждому автору выдается список персонажей, общий план и он должен написать текст для конкретного персонажа. Можно предположить, что любой из авторов без труда справится с поставленной перед ним задачей, однако маловероятно, что пьеса в целом окажется удачной, высокохудожественной. Приемлемые  в отдельности решения не могут быть объединены подходящим образом, если исходная задача была разделена на части непродуманно. Можно было задачу создания пьесы свести к задаче решения того, сколько актов она должна содержать, каков должен быть общий замысел и смысл отдельных диалогов. После этого исходная задача по-прежнему будет оставаться нерешенной, однако она настолько упростится, что может быть решена одним человеком или даже группой авторов (подобным образом писал свои знаменитые романы Дюма-отец).

Декомпозиция широко используется при проектировании крупных систем, таких как АРМ, САПР, ИС и их программного обеспечения (ПО).

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

Правильная декомпозиция является главным инструментом преодоления сложности разработки ПО больших систем и дает возможность привлекать для работы над проектом коллектив программистов /6/. Понятие «правильная» означает следующее:

- количество связей между отдельными подсистемами должно быть минимальным;

- связи компонентов внутри каждой подсистемы должны быть максимальными.

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

- каждая подсистема должна инкапсулировать свое содержание (скрывать его от других подсистем);

- каждая подсистема должна иметь четко определенный интерфейс с другими подсистемами /6/.

Таким образом, декомпозиция дает возможность создать оптимальную структуру разрабатываемой системы на самых ранних стадиях ее разработки.

В программной инженерии рассматриваются два основных подхода к декомпозиции крупной системы:

- структурный (функционально-модульный). В его основу положено описание структуры системы в терминах иерархии ее функций и передачи информации между отдельными функциональными элементами;

- объектно-ориентированный. В нем структура системы описывается в терминах объектов и связей между ними, а поведение системы описывается в терминах обмена сообщениями между объектами.