[ <<< | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Источники | >>> ]


© 2001 А.И. Легалов

Конструирование обобщений

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

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

Методы формирования обобщений

Существуют различные методы построения обобщений: объединение абстракций на основе общего ресурса; использование альтернативного связывания; образное обобщение. Каждый из методов обобщения, как и агрегирования, имеет свои специфические особенности.

При объединении на основе общего ресурса происходит размещение специализаций в едином адресном пространстве. При этом обычно существует часть ресурса, одновременно перекрываемая всеми размещаемыми программными объектами. Общая схема такого перекрытия для плоскости приведена на рис. 6а. На рис. 6б показано аналогичное размещение с перекрытием для одномерного пространства адресов памяти. Однако, чаще всего, обобщения на основе общего ресурса строится таким образом, что начальный адрес для всех размещаемых объектов является одинаковым (рис. 6в).

Наличие общего ресурса для нескольких абстракций позволяет использовать такое обобщение в двух различных целях:

  1. Хранение одного из альтернативных объектов. В этом случае выделенное пространство предоставляется экземпляру абстракции только одного типа, который хранит свое значение, никоим образом по семантике не коррелирующееся с семантикой альтернативных объектов. Поэтому, любая попытка альтернативной интерпретации общего ресурса ведет к семантической ошибке в программе.
  2. Использование различных трактовок одного и того же пространства ресурсов. Может быть связано с различной семантической интерпретацией некоторой абстракции и обеспечивает разделение множества возможных операций над одним и тем же объектом на несколько непересекающихся групп. В частности, для математических операций целое число длиной два байта может интерпретироваться как единое слово, для операций сохранения-восстановления в двоичном формате, как младший и старший байты. Для операций сравнения и сдвига бывает необходимо отделять знаковый бит от значения. Для каждого из этих случаев возможна своя специализация. А вместе они могут формировать обобщение.

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

Альтернативное связывание предполагает независимое размещение специализаций в рассматриваемом пространстве (рис. 7).

Однако использование ссылки или указателя обеспечивает доступ только к одному избранному объекту. При этом одновременно могут существовать все экземпляры специализаций или только часть из них. Таким образом, обобщение строится на основе динамического подключения одного независимого объекта. Как и косвенное связывание при агрегировании, альтернативное связывание обычно осуществляется алгоритмически, хотя допускается и статическая его реализация, если подключаемая специализация известна заранее. Выполнение алгоритма, осуществляющего связывание, происходит для отдельного экземпляра обобщения только один раз. Одновременно с выбором специализации осуществляется и установка ключа, указывающего признак специализации. Дальнейшая работа с обобщением осуществляется на основе предварительного анализа значения ключа. Это значение позволяет семантически правильно обработать специализацию через "обезличенный" указатель. Альтернативное связывание позволяет гибко формировать обобщения во время работы программы.

Образное обобщение (рис. 8), как и образное агрегирование, связано с мысленными ассоциациями программиста без специального представления используемых абстракций внутри программы.

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

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


[ <<< | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Источники | >>> ]