5.1. Модульность, иерархия, абстрагирование

    До сих пор мы обсуждали проблемы, связанные с разработкой небольших программ. Напомним главные из них:

    • образное представление программы и выделение из него составных частей – фрагментов алгоритма и данных;

    • определение переменных и их смысловой интерпретации;

    • выделение фрагментов алгоритма с известным результатом (контекстов);

    • определение соглашений – инвариантов, соблюдаемых программой;

    • выстраивание программы из полученных «запчастей».

    С ростом объема программного кода становится все труднее собрать воедино все, что касается программы. Единственный известный пока нам прием – модульное программирование (см. 3.4) предполагает разбиение алгоритмической компоненты – функций на независимые части – модули. Далее нам придется выйти на следующий уровень программирования, где рассматривается не столько содержание отдельных компонентов программы, а их выделение из общей «массы» программы и определение правил взаимодействия с другими компонентами. Здесь имеют место общие принципы, используемые при проектировании сложных систем:

    • модульность – система состоит из независимых компонент – модулей, для которых определены программные интерфейсы их взаимодействие, а сами они построены по принципу «черного ящика» - их внутреннее содержание скрыто от внешнего пользователя;

    • иерархия – одни из компонент системы могут быть использованы как составные части для построения более сложных компонент. В иерархических системах используется также принцип рекурсии – в компоненту могут входить в качестве составных частей компоненты такого же типа (а в нее – аналогичные, и т.д. до бесконечности);

    • абстрагирование (обобщение) – множество компонент различных видов получают в программе единого «представителя» - абстракцию (обобщение), наличие которого в любом месте программы может обозначать включение на это место любого их них. Абстрагирование обеспечивает универсальность программы, ее наличие дает программе «свободу выбора». В большинстве случаев абстрагирование реализуется динамически, т.е. позволяет связывать абстракцию с конкретной компонентой и изменять эту связь во время работы программы.

    Здесь мы просто перечислим, где мы уже сталкивались с подобными приемами, а где их еще предстоит встретить.

    Модульность программы – функции. Функция является основным элементом модульности (1.6, 3.4). В классической технологии программирования программа выглядит как набор функций, вызывающих друг друга, каждая из которых представляет собой относительно независимую часть алгоритма с собственными локальными данными и программным интерфейсом.

    Абстрагирование – значение, переменная, формальный параметр. Функция является также и элементом абстрагирования в том смысле, что она каждый ее формальный параметр обозначает произвольную переменную или выражение, подставляемое при вызове (1.6). В этом смысле функция представляет собой абстрактный алгоритм «на все случаи жизни».

    Иерархия алгоритмов – библиотека функций. Функция в программе является также и элементом иерархии, поскольку последовательность вызовов функций сверху-вниз обычно соответствует иерархии решаемых в системе задач. Набор функция одного уровня, предназначенный для решения одного типа задач или работающих с данными одного типа, объединяются в библиотеки.

    Иерархия данных – производный тип данных. По аналогии с алгоритмической компонентой программы данные также допускают иерархическое описание (5.4), оно касается форм представления – типов данных. Производные типы данных конструируются из уже известных. Иерархия типов данных существует в программе параллельно с иерархией функций, их обрабатывающих.

    Абстрагирование - указуемая переменная, указатель. Переменная – указатель (5.2) дает возможность программе обрабатывать произвольные данные, не привязываясь к именам указуемых переменных (разыменование). Это является дополнительной «степенью свободы» алгоритма.

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

    Модульность программы – класс. Синтаксической и технологической единицей в программе является класс – набор данных (свойств) и работающих с ними функций (методов) (10.1). Объектно-ориентированная программа представляет собой систему взаимодействующих объектов различных классов.

    Иерархия классов – наследование. Наследование (11.2) – механизм, позволяющий включать некоторый (базовый) класс в качестве составной части в другой (производный) класс. Таким образом, система классов обеспечивает представление сущностей от самой общей (абстрактной) до частных (конкретных).

    Абстрагирование - шаблон класса. Средство статической подстановки – шаблон класса, дает возможность обозначать абстрактного «представителя» типа данных (или класса) в виде текстового параметра, заменяемого при трансляции (10.5). Получается достаточно простое, хотя и не очень эффективное средство, обеспечивающее универсальность разрабатываемых на его основе программ.

    Абстрагирование - виртуальные функции и абстрактные базовые классы. В отличие от шаблона виртуальные функции (11.4) позволяют производить связывание абстрактного «представителя» с конкретным методом (а через него – с классом) во время исполнения программы, т.е. динамически. На их основе создаются абстрактные представления (интерфейсы), через которые объекты различных классов включаются в единый процесс обработки.