- •1.Введение
- •1.1.Декомпозиция и абстракция
- •1.2.Абстракция
- •1.2.1.Абстракция через параметризацию
- •1.2.2.Абстракция через спецификацию
- •1.2.3.Виды абстракций
- •3.Процедурная абстракция
- •3.2.Спецификации
- •3.3.Спецификации процедурных абстракций
- •3.4.Реализация процедур
- •3.5.Более обобщенные процедуры
- •3.6.Создание процедурных абстракций
- •3.7.Заключение
- •4.Абстракции данных
- •4.1.Спецификации для абстракций данных
- •4.2.1.Реализация на языке clu
- •4.2.2.Замечания по поводу операций up и down
- •4.3.Использование абстракций данных
- •4.4.Реализация полиномов
- •4.5.Пояснения для понимания реализаций
- •4.5.1.Функция абстракции
- •4.5.2.Инвариант представления
- •4.6.3.Сохранение инварианта представления
- •4.5.4.Изменяемые представления
- •4.6.Параметризованные абстракции данных
- •4.7.Списки
- •4.8.Упорядоченные списки
1.1.Декомпозиция и абстракция
Базовая парадигма в подходе к любой большой задаче ясна: мы должны разделять и властвовать». К сожалению, буквальное следование этому макиавеллевскому принципу по-прежнему предполагает долгий путь к решению задачи. Самым важным является то, каким образом мы осуществляем это разделение.
Нашей целью при декомпозиции программы является создание модулей, которые в свою очередь представляют собой небольшие программы, взаимодействующие друг с другом по хорошо определенным и простым правилам. Если мы достигнем этой цели, то разработка отдельных модулей может осуществляться различными людьми независимо друг от друга, без необходимости общения друг с другом, при этом все эти объединенные вместе программы будут функционировать правильно. Помимо этого в процессе модификации программы появится возможность корректировать отдельные модули без необходимости исправления других.
При декомпозиции задачи мы разбиваем ее на ряд подзадач так, что 1)каждая подзадача имеет один и тот же уровень рассмотрения; 2)каждая задача может быть решена независимо и3)полученные решения могут быть объединены вместе, позволяя решить исходную проблему.
Изящным примером декомпозиции является сортировка с использованием метода «сортировка слиянием». В этом случае сортируемый список произвольного размера разбивается на две более простые задачи, каждая из которых сортирует половину списка, после чего производится слияние двух отсортированных списков произвольной величины.
Декомпозиция является весьма полезным и экономящим время способом решения задач в самых различных областях. Со времен Беббиджа люди осознали выгоду от использования программистами таких средств декомпозиции, как макроопределения и подпрограммы. Важно понимать, что декомпозиция не является некой панацеей и при неграмотном использовании может принести массу неприятностей. Отметим далее, что большие или плохо понимаемые задачи поддаются декомпозиции с большим трудом. К числу наиболее распространенных проблем относится ситуация, ври которой создание отдельных компонент, способных решить соответствующие подзадачи, не приводит к тому, что объединение этих компонент позволяет решить исходную задачу. Это является одной из причин, по которой интеграция системы часто оказывается затруднительной.
Предположим, например, что группа авторов создает пьесу. Каждому автору дается список персонажей и общий план. Каждый из них должен при этом написать текст для одного из персонажей. Можно предположить, что любой из авторов без труда справится с поставленной перед ним задачей, однако маловероятно, .что пьеса в целом окажется удачной. Она может быть достаточно художественна, но в ней скорее всего будет отсутствовать какой-либо смысл. Приемлемые в отдельности решения не могут быть объединены подходящим образом, если исходная задача была разделена на части непродуманно.
Абстракция представляет собой эффективный способ декомпозиции, осуществляемый посредством изменения списка детализации. Когда мы абстрагируемся от проблемы мы предполагаем игнорирование ряда подробностей с тем, чтобы свести задачу к более простой. Например, в задаче по созданию пьесы мы можем свести все к задаче решения того, сколько актов она должна содержать, каков должен быть общий замысел или даже смысл (но не сам текст) отдельных диалогов. После выполнения этого исходная задача по-прежнему будет оставаться нерешенной, однако она значительно упростится —возможно, даже до такой степени, что может быть решена другим человеком или даже группой таких людей. (Подобным образом писал свои романы Дюма-отец.) Задачи абстрагирования и последующей декомпозиции типична для процесса создания программы: декомпозиция используется для разбиения программы на компоненты, которые могут ^быть затем объединены, позволив решить основную задачу абстрагирование же предполагает продуманный выбор компонент. Мы последовательно выполняем то один, то другой из этих процессов до тех пер, пока. не сведем исходную задачу к набору подзадач, решение которых известно. '