![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Теперь вернемся к понятию «модуль» и уточним семантику этого понятия.
¨ Как демонстрирует программа InfixToPostfix - инструментарий, предоставляемый модулем UStack, позволяет программировать работу со стеком, не зная способа его реализации. Достаточно знать лишь семантику средств, объявленных в интерфейсной секции модуля (которая описана там, к сожалению, не на языке спецификаций, а просто в комментариях). Однако этого эффекта в определенной мере можно было бы достичь и ограничившись средствами аппарата процедур-функций. ¨ Модуль вводит в употребление новые средства программирования - механизм инкапсуляции. Инкапсуляция (encapsulation) – «скрытие», защита от внешнего воздействия: извне модуля доступны данные и операции, определенные в модуле (локальные???!!!), но только те, которые объявлены в интерфейсной секции (как видимые). Понятие инкапсуляция вносит существенно новое в дилемму локальные - глобальные. ¨ Интерфейсные инструменты - описанные в интерфейсной секции: · интерфейсный тип данных – TVal (в модуле UVal); · интерфейсная переменная – ErrStack; · интерфейсные процедуры и функции – Empty, Push, Pop, Top, WriteAll. Интерфейсные инструменты используются для организации информационной и операционной связи с модулем. ¨ Инкапсулированные инструменты - описанные в секции реализации: · инкапсулированные типы данных – TStack; · инкапсулированные переменные - Stack; · реализация тел интерфейсных процедур и функций – тоже инкапсулирована. Инкапсулированные инструменты «скрыты в капсуле», вне модуля на них невозможно ссылаться по их именам. Однако, не являясь глобальными, они не являются и локальными инструментами модуля. Из смысла программы InfixToPostfix ясно, что инкапсулированная в модуле UStack переменная Stack «живет» в течение всего периода выполнения программы InfixToPostfix. Она «непрерывно хранит» элементы стека и положение «его вершины», ее значение изменяется в процессе работы программы со стеком. Манипулировать стеком (переменнной Stack) программа InfixToPostfix может только косвенно с помощью («рук-манипуляторов») Push, Pop. Кстати, традиционной локальной переменной является i: INTEGER (в процедуре WriteAll). А глобальных для всей многомодульной программы переменных не может быть. Переменные Vh, Vih, x, y можно было бы использовать как глобальные, но только процедурами и функциями в пределах головного модуля InfixToPostfix, вне него они не видны. ¨ Возможно, используя отмеченные выше инкапсулированные инструменты, некоторые действия в программе InfixToPostfix можно было бы реализовать и эффективнее, чем это сделано в примере, однако § Инкапсуляция защищает модуль от некорректного внешнего вмешательства в функционирование его инструментов.
Можно изменить всё в секции реализации – реализацию процедур и функций и даже представление данных для стека, но в пределах сохраняющих синтаксис и семантику того, что уже объявлено в интерфейсной секции, от этого не пострадает правильность работы программы InfixToPostfix. Оформление модуля в C/C++. Для понятия «модуль» в С/С++ нет специальной синтаксической конструкции языка. Но это ни в коей мере не означает, что это понятие не играет важнейшей роли в методологии, методике и практике программирования на С/С++ (*):
|