Cтраница 3
Мы можем изменять коды реализации экспортируемой процедуры для повышения эффективности программы или по каким иным причинам всякий раз без каких бы то ни было последствий для импортирующих программ-клиентов до тех пор, пока интерфейс ( специфицированный в модуле определения) не будет изменен. Если интерфейс был изменен, требуется перекомпиляция модуля определения с последующей перекомпиляцией модуля реализации. После этой перекомпиляции ни одна программа, импортирующая что-то из новейших версий этих модулей, не будет работать до тех пор, пока они тоже не будут перекомпилированы. Таким способом Модула-2 устанавливает совместимость различных частей большой программы. [31]
Последний шаг заключается в соединении страницы свойств с элементом управления ActiveX. После создания элемента мастер ActiveX Control Wizard автоматически добавляет объявление метода DefinePropertyPages в модуль реализации. В этом методе можно вызвать метод DefinePropertyPage ( в данном случае имя метода необычно) для каждой страницы свойств, которую необходимо добавить в элемент управления. [32]
Мы, программисты, могли бы быть удовлетворены модулями определений, содержащими только комментарии, указывающие на сервис, доступный в соответствующем модуле реализации. Все, что мы реально желаем знать, - это как можно использовать сервис модуля реализации. Однако компилятор требует точного определения, какие процедуры, типы, переменные и константы экспортируются. Включение точных определений позволяет компилятору проверить использование экспортируемых объектов. [33]
Имеется две формы экспорта типа: прозрачный и скрытый. В прозрачном экспорте тип полностью описывается в модуле определений и его описание не должно повторяться в модуле реализаций. Модуль-клиент, импортирующий прозрачный тип, имеет доступ ко всем деталям этого типа. [34]
Процедуры из раздела определений глобального модуля - видимые, все остальные - скрытые. Для видимых процедур в модуле определений указывается только интерфейс ( заголовок); тело процедуры спрятано в модуле реализации. [35]
Если модуль А импортирует что-нибудь из модуля Б, то модуль определений для Б должен компилироваться перед модулем А. Очевидно, что модули определений должны компилироваться вначале, поскольку, пока не скомпилированы модули определений, невозможна обработка модулей реализации. [36]
После того как вы успешно откомпилируете модуль определения, модуль реализации и программный модуль и запустите все это, перепишите и перекомпилируйте модуль реализации, применяя структуру указателя, и убедитесь, что ничего больше не следует менять и перекомпилировать, чтобы вся программа работала. [37]
На последующих стадиях проекта проектируются, реализуются и тестируются модули реализации. Обычно модуль реализации изменяется и перекомпилируется много раз без изменения его модуля определений. [38]
Модуль реализации является скрытой частью глобального модуля. Это место, где происходит действительное выполнение функций глобального модуля, в отличие от модуля определений, который их объявляет. В остальном модуль реализаций конструируется подобно программному модулю. [39]
Корректность другого сорта не может быть проконтролирована компилятором. Реализация должна правильно выполнять объявленные функции. Иногда функция в модуле реализации содержит тонкую ошибку. Например, процедура StrLen ( разд. Другая возможная ситуация - когда сама функция некорректна, например процедура StrLen, возвращающая длину неиспользуемой части строковой переменной вместо длины действующей части. [40]
Если бы одно слово IMPLEMENTATION было удалено из заголовка, то этот модуль можно было бы компилировать как программный. То, что тело модуля пусто, приводит к практической проблеме, но не к синтаксической. Это показывает, что этот модуль реализации на самом деле отличается от синтаксиса программного модуля только заголовком. Этот модуль реализации нельзя было бы откомпилировать таким способом, если бы в его модуле определения имелись объявления CONST, TYPE или VAR, используемые модулем реализации. [41]
Суммирование модулей также обладает инвариантностью к виду повреждения. Полярность и величина импульсов, изменяющиеся в зависимости от того, какой из проводов закорочен или оборван, не имеют значения. При посылке радиоимпульсов должны суммироваться модули огибающих реализаций, одновременно принимаемых с трех проводов. [42]
Заметим, что следующий модуль реализации дает описание для типа Указ, поскольку оно скрыто экспортируется в модуле определений. Указ является типом указателя, который подробно обсуждается в гл. Также заметим, что Шкала автоматически доступна внутри модуля реализации. [43]
Иногда информации, содержащейся в модуле определений, недостаточно. Если возможно, вы можете обратиться к модулю реализаций, чтобы понять, как в действительности он работает. Однако часто коммерческие системы Модулы-2 поставляются без исходных текстов модулей реализаций. Первоначально я считывал числа, используя процедуру Readlnt из модуля InOut. К сожалению, оказалось, что знаки плюс н минус, стоящие перед выражениями в скобках, пропадали. [44]
Три процедуры в процедуре Editor используют ряд импортированных элементов. Модуль TextEditor требует ряд глобальных переменных. Распечатка 12.4 также показывает процедуру Editor в контексте всего модуля реализации TextEditor, так что можно просмотреть импортированные параметры и глобальные переменные. [45]