Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 111
Текст из файла (страница 111)
С точки зрения программиста, рассмотрение программы как единого набо=з подпрограмм не обеспечивает адекватного уровня организации программы и управления ю. Решить эту проблему можно, разделив программу на синтаксические контейнеры, ко-:рые содержат группы логически связанных подпрограмм и данных. Эти синтаксические ентейнеры часто называются модулями, а процесс их разработки — модулярнзацией.
Вторая практическая проблема, связанная с большими программами, — повторнаа компи.-.яция. Для маленькой прсираммы повторная компиляция всей программы после каждой модификации стоит немного. Однако, когда размер программы возрастает до нескольких -.ысяч строк, стоимость повторной компиляции становится значительной. Таким образом, чеобходимо найти способ избежать повторной компиляции неизменных частей программы. Это можно сделать, составив программу из наборов подпрограмм и данных, каждый из ко-.рых можно компилировать отдельно, без повторной компиляции остальной части про-.раммы. Такой набор называется единицей компиляции.
Инкапсуляция — это способ объединения в единое целое подпрограмм и ланных, которые они обрабатывают. Инкапсуляция, которая компилируется либо отдельно, либо независимо от других, является основой абстрактной системы и логической организации набора соответствующих вычислений. Следовательно, инкапсуляция решает обе практические проблемы, описанные выше. Инкапсуляции часто размещают в библиотеках и делают доступными лля повторного использования в других программах. Люди пишут программы, размер которых превышает несколько тысяч строк, уже более 40 лет, так что техника создания инкапсуляций развивается уже довольно давно. 10.2. Инкапсуляция Во многих алголоподобных языках программы можно организовывать в виде определений подпрограмм, вложенных в подпрограммы более высокого уровня.
которые их используют. Как обсуждалось в главе 4, метод организации программ, который использует контекст описания, далек от идеала. Кроме того, в некоторых языках программирования подпрограммы не являются елиницами компиляции. Следовательно, их нельзя назвать подходящими конструкциями для инкапсуляции. В языке РОКТКА1л1 77 подпрограммы можно собирать в файлах, независимо друг от друга компилировать и размешать в библиотеках. Наборы определений СОММоц-блоков люжно обрабатывать аналогичным образом. Это — эффективный прием организации программ, но прн использовании таких инкапсуляций нет проверки интерфейса.
Поэтому такой полхол по своей природе небезопасен. В языке С наборы связанных между собой функш~й н определений данных можно помешать в файл, который компилируется независимо от других файлов. Несмотря на то что компиляторы языка С в настояшее время проверяют правильность интерфейса должным образом определенных функций, они все еше не осушествляют проверку типов в определениях данных нз лругих файлов.
(Под "должным образом определенными" мы подразумеваем такие функции. которые не используют заголовки функций, не соответствующие стандарту А1ЧВ! С.) Таким образом, С-файлы также не обеспечивают безопасную инкапсуляцию. Многие современные языки, включая РОКТКАМ 90 и Ада, позволяют собирать наборы подпрограмм, типов и данных в модули, которые можно компилировать отдельно, подразумевая при этом, что информация об их интерфейсе сохраняется компилятором для проверки типа интерфейса прн использовании их другим модулем.
Рассматриваемые языки также содержат механизмы управления доступом к сущностям в этих модулях, что позволяет модулю содержать некоторые иклена типов, которые являются видимыми во внешних модулях, при этом представления таких типов вилимы лля других сушностей только внутри модуля. Эти модули обеспечивают отличную инкапсуляшпо. Они не только поддерживают точную и логичную организацию программы, но и делают эту организацию ясной для читателя программы.
Характерные особенности срелств обеспечения инкапсуляции в языках ЯМУ1.А 67, Ада и С+~ обсуждаются вместе с абстрактными типами данных в разделе 10.5. 1О.З. Введение в абстракцию данных Абсграктный тип данных — это инкапсуляция, которая содержит только представления ланных одного конкретного типа и подпрограммы, которые выполняют операции с даннылкн этого типа. С помощью управления доступом несушественные детали описания типа кюжно скрыть от внешних модулей, которые используют такой тип. Программные модули, которые используют абстрактный тип данных, могут объявлять переменные этого типа, даже несмотря на то, что реальное представление типа скрыто от них. Экземпляр абстрактного типа данных называется объектом.
Сушествует олна обшая причина создания абстракции типа данных и абстракции процесса. Это — средство против сложности, способ сделать большие и/или сложные программы более управляемыми. Другие мотивы создания н преимушества абстрактных типов данных обсуждаются далее в этом разделе. Как и абстракция процессов, абстракция данных допускает совершенно разные методологии программирования. т32 Глава 10. Абстрактные типы данных В последние годы возрастает популярность новой методологии разработки нро: раммного обеспечения — объектно-ориентированного программирования. 1)Г>ьектноорнентированное программирование, описанное в главе 11. — это результат непользования абстракции данных при разработке программ, а абстракция данных — одна нз его важнейших составных частей.
10.3.1. Число с плавающей точкой как абстрактный тип данных Понятие абстрактного типа данных, по крайней мере в терминах встроенных типов, — не новое изобретение. Все встроенные типы данных, даже в языке РОКТКАХ 1, являются абстрактными, хотя так их называют редко. Рассмотрим, например. числа с плаваюшей точкой. Большинство языков программирования включают в себя хотя бы един тип лля представления таких чисел. что позволяет создавать переменные этого типа и выполнять с ними арифметические операции. В языках высокого уровня типы для представления чисел с плаваюшей точкой используют ключевое понятие в абстракции данных; сокрытие информации. Реальное представление данных в ячейке памяти, предназначенной для хранения чисел с плаваюшей точкой.
скрыто от пользователя. С ними можно выполнять лишь те операции. которые предусмотрены в языке. Пользователь не может создавать новые операции с данными этого типа, за исключением тех, которые можно сконструировать с помошью встроенных операций. Кроме того, нельзя непосредственно манипулировать частями реального представления чисел с плавающей точкой, поскольку это представление скрыто от пользователя.
Так обеспечивается переносимость программ между конкретными реалнзациячн языка, даже если эти реализации используют разные представления чисел с плаваюшей точкой. 10.3.2. Абстрактные типы данных, определвемые пользователем Понятие абстрактных типов данных, определяемых пользователем. возникло относительно недавно.
Абстралтные типы данных, определяемые пользователем, должны иметь те же свойства, что и числа с плавающей точкой: 1) определение типа, позволяюшее программным модулям обьявлять переменные этого типа, создавая при этом реальное представление этих переменных в памяти; 2) набор операций для манипуляций с объектами данного типа. Ниже приводится формальное определение абстрактного типа данных в контексте типов, определенных пользователем. Абстрактный тип данных — это тип данных.
который удовлетворяет следующим двум условиям. ° Представление (определение типа) и операции над объектами данного типа содержатся в одной синтаксической единице. Кроме того. переменные данного типа можно создавать и в других модулях. ° Представление объектов данного типа скрыто от программных модулей. используюших этот тип, так что над такими объектами можно производить лишь те операции, которые прямо предусмотрены в определении типа. Программные модули, которые используют некоторый абстрактный тнп данных, называются клиентами этого типа.
433 10.3. Вавдвиив в абстракцию данных Основные преимушества упаковки представления типа и операций в отдельную синтаксическую единицу те же, что и у инкапсуляции. Во-первых, это позволяет организовывать программу в виде логических единиц, которые можно компилировать отдельно. Во-вторых, появляется возможность модифицировать представления объектов данного типа или операции с ними в отдельной части программы. У сокрытия деталей представления типа есть несколько преимушеств.
Наиболее важное из них то, что клиенты не могут "видеть" детали:представления объектов, и, следовательно. их код не зависит от этого представления. Таким образом, представления объектов можно изменять в любое время, не требуя прн этом вносить изменения в код клиентов. Интерфейс абстракции представляет некоторые (но не все) ее свойства. Другим очевидным и важным преимуществом сокрытия информации является повышенная надежность.
Клиенты не могут непосредственно изменять основные представления объектов ни преднамеренно, нн случайно, следовательно, возрастает целостность таких объектов. Объекты можно изменять только с помощью предусмотренных для этого операций. Важность сокрытия деталей представления абстрактного типа данных трудно переоценить. 10.3.3.