Декомпозиция и абстракция являются основными инструментами при разработке программы.
Декомпозиция - это разбиение задачи на ряд подзадач так, что 1) каждая подзадача имеет один и тот же уровень рассмотрения;
2) каждая задача "может быть решена независимо и 3) полученные решения могут быть объединены вместе, позволяя решить исходную проблему.
Создание программы группой разработчиков можно сравнить с написанием повести-буриме.
Каждому автору дается список персонажей (объектов программы) и общий план (спецификацию программы).
Даже если каждый из авторов справится с поставленной перед ним задачей, в повести
скорее всего будет отсутствовать какой-либо смысл (из-за отличающегося в каждой части повести поведения персонажей).
Приемлемые в отдельности решения не могут быть объединены подходящим образом,
если исходная задача была разделена на части непродуманно.
--
Поэтому декомпозиция должна быть дополнена абстракцией.
Абстрагирование предполагает игнорирование ряда подробностей, чтобы свести задачу к более простой.
Например, в задаче по созданию повести мы должны указать черты характера и цели каждого персонажа, взаимоотношений между ними,
каков должен быть общий замысел или даже смысл (но не сам текст) отдельных сцен.
После выполнения этого исходная задача написания повести по-прежнему будет оставаться нерешенной,
однако она значительно упростится.
--
Задачи абстрагирования и последующей декомпозиции типичны для процесса создания программы:
декомпозиция используется для разбиения программы на компоненты, которые могут быть затем объединены, позволив решить основную задачу;
абстрагирование же предполагает продуманный выбор компонент.
Мы последовательно выполняем то один, то другой из этих процессов до тех пор, пока не сведем исходную задачу к набору подзадач, решение которых известно.