Декомпозиция известна давно и используется в самых разных предметных областях (при проектировании изделий, решении различных проблем, разработке крупных систем, программных комплексов и т.д.). Приведем пример /3/. Предположим, что группа авторов создает пьесу. Каждому автору выдается список персонажей, общий план и он должен написать текст для конкретного персонажа. Можно предположить, что любой из авторов без труда справится с поставленной перед ним задачей, однако маловероятно, что пьеса в целом окажется удачной, высокохудожественной. Приемлемые в отдельности решения не могут быть объединены подходящим образом, если исходная задача была разделена на части непродуманно. Можно было задачу создания пьесы свести к задаче решения того, сколько актов она должна содержать, каков должен быть общий замысел и смысл отдельных диалогов. После этого исходная задача по-прежнему будет оставаться нерешенной, однако она настолько упростится, что может быть решена одним человеком или даже группой авторов (подобным образом писал свои знаменитые романы Дюма-отец).
Декомпозиция широко используется при проектировании крупных систем, таких как АРМ, САПР, ИС и их программного обеспечения (ПО).
При декомпозиции крупная система разбивается на подсистемы так, чтобы каждая подсистема имела один и тот же уровень рассмотрения, решалась независимо от других подсистем, а объединение всех подсистем в одну обеспечивало бы решение поставленной задачи.
Правильная декомпозиция является главным инструментом преодоления сложности разработки ПО больших систем и дает возможность привлекать для работы над проектом коллектив программистов /6/. Понятие «правильная» означает следующее:
- количество связей между отдельными подсистемами должно быть минимальным;
- связи компонентов внутри каждой подсистемы должны быть максимальными.
При этом структура системы должна быть такой, чтобы все взаимодействия между ее подсистемами укладывались в ограниченные стандартные рамки, то есть:
- каждая подсистема должна инкапсулировать свое содержание (скрывать его от других подсистем);
- каждая подсистема должна иметь четко определенный интерфейс с другими подсистемами /6/.
Таким образом, декомпозиция дает возможность создать оптимальную структуру разрабатываемой системы на самых ранних стадиях ее разработки.
В программной инженерии рассматриваются два основных подхода к декомпозиции крупной системы:
- структурный (функционально-модульный). В его основу положено описание структуры системы в терминах иерархии ее функций и передачи информации между отдельными функциональными элементами;
- объектно-ориентированный. В нем структура системы описывается в терминах объектов и связей между ними, а поведение системы описывается в терминах обмена сообщениями между объектами.