Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oop-VisualWorks.pdf
Скачиваний:
28
Добавлен:
13.02.2015
Размер:
1.23 Mб
Скачать

Глава 4

Пакеты и парселы

Пространства имён — языковая поддержка разработки кода разными программистами, позволяющая избежать конфликта имён.

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

Парсел — внешнее представление пакетов и связок пакетов в виде файлов, что позволяет передавать смолтоковский код вне образа среды от одного разработчика другому и конечному пользователю.

Общую схему разработки приложения в VisualWorks можно описать следующим образом. Код приложения разрабатывается в пространствах имён и классах, сохраняется в образе системы и/или во внешних файлах с расширеием *.st командой File Out As. . . . По мере создания приложения, код, содержашийся в пространствах имён и классах объединяется в пакеты и связки пакетов, затем, по завершении разработки, окончательная версия сохраняется во внешних файлах, парселах.

Следует отметить, что наиболее совершенные средства управления исходным текстом приложений, отслеживающим последовательности версий, обеспечивает пакет StORE, описание которого выходит за рамки этого учебника (см. [10]).

4.1.Пакеты и связки пакетов

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

4.2. Парселы

63

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

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

Например, в системе есть очень большая связка пакетов, именуемая Base VisualWorks. Её пакеты и связки пакетов содержат родственные части основного кода системы. Например, связка Kerner содержит пакеты, которые определяют основные функциональные возможности Смолтока, такие как построение классов и их поведение. Связка пакетов Tools содержит пакеты инструментов, отделяя их от основных функциональных возможностей среды.

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

4.2. Парселы

Парселы — одна из составляющих технологии поставки конечному пользователю программного продукта в виде файлов, которая обеспечивает механизм быстрой и корректной загрузки объектов в смолтоковский образ. Все дополнения среды VisualWorks поставляются как парселы, которые загружаются в образ.

Каджый парсел хранится в двух файлах. Файл парсела с расширением .pcl, содержит оттранслированную программу в бинарном формате, а файл парсела с расширением .pst содержит соответствующий исходный текст. Несмотря на поверхностное сходство между pst-файлами и файлами с расширением .st, записываемых командой File Out As. . . , pst-файлы нельзя загружать командой File In. . . . Это только файлы исходного кода для соответствующего pcl-файла!

Из внешних файлов — парселов, или st-файлов — код загружается в VisualWorks, при загрузке распределяется по пакетам, и таким образом вводится в структуру среды. Загрузку и удаление (выгрузку) парселов из среды можно провести с помощью инструментов VisualWorks: Parcel Manager (см. раздел 5.2), страницы Parcel системного браузера (см. 6.4), и специальных инструментов быстрой загрузки и выгрузки парселов, до-

64

Глава 4. Пакеты и парселы

ступных в основном окне среды VisualWorks по командам меню System

→ Load Parcel Named. . . и System → Unload Parcel Named. . . , соответственно.

Но, если нужно, парселы можно загружать и выгружать программно. Например, когда пользователь запускает новый инструмент или открывает новое окно в приложении, приложение может загрузить парсел, содержащий этот инструмент или окно. Следующая строка кода программы загружает парсел из файла UIPainter.pcl:

Parcel loadParcelFrom: ’..\parcels\UIPainter.pcl’.

Точно так же, когда парсел больше не нужен, чтобы его выгрузить из среды, достаточно выполнить следующий код:

Parcel unloadParcelNamed: ’UIPainter’.

Отметим различие между этими двумя сообщениями. Чтобы загрузить парсел, нужно указать имя его pcl-файла; чтобы выгрузить парсел, нужно указать имя парсела. Эти два имени могут отличаться.

Кроме этого, нужные изначально парселы можно загружать при запуске системы VisualWorks с помощью опций командной строки (см. [9, p. 8-29 – 8-30]).

Работа с парселами имеет некоторые особенности.

Частичная загрузка. Парселы поддерживают механизм частичной загрузки определений из парсела. Если парсел содержит класс, требующий суперкласса, которого нет в системе, или метод, требующий класса, которого нет в системе, класс или метод не устанавливаются. Вместо этого эти классы и методы добавляются в набор uninstaliedClasses или uninstaliededMethods, соответственно. Когда парсел с неинсталированным кодом загружается вновь, парсел проверяет, был ли загружен отсутствовавший объект. Если он был загружен, парсел загружает ранее незагруженный код.

Сохранение парсела с неинсталлированным кодом приведет к потере такого кода. Диалоговое окно сообщит об этом, и, чтобы не потерять код, операцию сохранения следует отменить.

Восстановление кода при выгрузке. Парселы запоминают методы и классы, которые они заменяют при загрузке, и восстанавливают их при выгрузке данного парсела из образа.

Действия при сохранении, загрузке и выгрузке. При выполнении каждой из операций парселы могут выполнять предварительные действия до операции и заключительные по завершении операции. Эти действия первоначально определяются для пакетов и связок, а затем переназначаются на парсел, когда он создаётся.

4.3. Особенности операций File Out As. . .

и File In. . .

65

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

Устойчивость к изменению формы. Изменение формы относится к тем переопределениям классов, при которых добавляются или удаляются переменные экземпляра, или экземпляр класса теряет или приобретает индексированные переменные, удаляются или вводятся ограничения на классы хранимых индексированными переменными объектов. Это приводит к тому, что экземпляры классов приобретают или теряют поля переменных, или, другими словами, изменяют свою форму.

Парселы поддерживают механизм замены формы экземпляров и методов, который пытается откорректировать объекты таким образом, чтобы они могли загружаться. Если, например, парсел загружает объект, число переменных экземпляра которого изменилось, он назначает те же значения переменным с теми же именами, отказывается от значений пропавших переменных, и устанавливает значения новых переменных равными nil. Система не может пока справляться с изменениями формы, отличными от добавления или удаления именованных переменных экземпляра. Если форму класса меняют два определения класса, то «победит» последнее загруженное определение. Новое определения переписывает старое, а не сливается с ним, таким образом, например, переменные экземпляра из двух переопределений не объединяются.

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

Обычно парсел не приходится создавать явно, поскольку он создаётся при сохранении (публикации) пакетов и связок пакетов.

4.3.Особенности операций File Out As. . . и File In. . .

В связи с введением пространств имён и пакетов загрузка файлов исходного текста командой File In. . . в VisualWorks 7.4.1 приобретает некоторые особенности, а именно, поведение при загрузке меняется в зависимости от происхождения файла.

Если файл исходного текста сохранялся командой File Out As. . . в версии VisualWorks ранее 5.i, в которой других пространств имён кроме Smalltalk не было, то командой File In. . . код будет загружаться в пространство имён Smalltalk. Будут соответствующим образом исправлены определения классов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]