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

54

Глава 3. Пространства имён

Root Smalltalk JavaWorld

java lang awt

COM sun

microsoft

При работе в пространстве Smalltalk, поиск ссылки на именованные объекты начинается в пространстве Smalltalk, а не в пространстве Root. Практически, пространство Root можно проигнорировать. Если нужно обратиться к пространству имён Root из пространства Smalltalk то это можно сделать так: Root.Smalltalk.Root. Циклический вызов выглядит пугающе, но такое возможно, поскольку в пространстве Smalltalk определена разделяемая переменная Root, которая ссылается на пространство имён Root. Поскольку предполагается, что начальная часть пути всегда Root.Smalltalk, можно сократить ссылку до Root.

3.3. Ссылка на объекты и импорт

Объекты вновь создаваемых приложений, которые будут располагаться в собственном пространстве имён, должны ссылаться на множество объектов в пространствах имён VisualWorks, и, возможно, на объекты других разработчиков. В пределах естественного окружения ссылка на разделяемый объект происходит, используя его неквалифицированное имя — только имя самого объекта. Для ссылки на разделяемую переменную из другого пространства имён используется точечная нотация, которая производит связывание разделяемой переменной, описывая путь по иерархии пространств имён от пространства Smalltalk до пространства разделяемой переменной. Например, полная ссылка, устанавливающая связывание с системной константой Bold (определенной в пространстве имён TextConstants) такова:

Root.Smalltalk.Graphics.TextConstants.Bold

Однако, практически, система VisualWorks, когда производит синтаксический анализ точечного имени, по умолчанию считая Root.Smalltalk. начальной частью имени. Поэтому, на практике, ссылка выше сокращается до ссылки Graphics.TextConstants.Bold.

Ссылаться на каждый разделяемый объект явно, описывая путь в иерархии пространств имён от Root или Smalltalk до текущего пространства объекта, неудобно. Вместо этого, при определении нового простран-

3.3. Ссылка на объекты и импорт

55

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

Smalltalk defineNameSpace: #XML private: false

imports: ’ private Smalltalk.* XML.SAX.* ’

categoey: ’XML-NameSpace’

Smalltalk.XML defineNameSpace: #SAX

private: false

imports: ’private Smalltalk.* ’

 

сategory: ’XML-SAX’

 

Вэтих случаях производится общий импорт, использующий звездочку ( ) и позволяющий импортировать все связывания, определенные в указанном пространстве имён. В примере, импортируются все связывания из пространств Smalltalk и Smalltalk.XML.SAX.

Обратите внимание, что при импорте перед Smalltalk.* стоит слово private, а перед XML.SAX.* его нет. Если объект импортируется «частным образом» (private), импортированные им связывания не экспортируются этим объектом при его последующем импортировании. Если связывание кем-то определено как частное или импортировано «частным образом», это означает, что оно не должно быть доступно другим пространствам имён при дальнейшем импортировании. И это предписание автора следует уважать!

С другой стороны, если связывание импортируется в объект «публичнным образом» (public), то есть отсутствует слово private, то оно далее будет импортироваться в любое пространство имён или класс, который будет импортировать этот объект.

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

Впервом примере выше, импортируются все связывания из пространств имён Smalltalk и Smalltalk.XML.SAX. В частности, эти строки импортируют в пространство имён XML все разделяемые переменные, определенные в Smalltalk иSAX. Поскольку SAX импортируется «пуб-

56

Глава 3. Пространства имён

лично», это делает XML также и экспортером всех импортированных им связываний, так что они далее импортируются любым классом или пространством имен, который импортирует пространство XML. В этом случае, это именно то, что нужно, так как, если требуется XML, то требуется и SAX.

Включение ключевого слова private перед Smalltalk.* при его импортировании, запрещает, в частности, XML экспортировать свои связывания. Разумно ожидаться, что они будут импортироваться отдельно каждым заинтересованным в них пространством имён.

Иногда пространство имён или класс должны импортировать не все, а одно единственное связывание из другого пространства имён. Для этого используется импорт конкретного (specific) связывания . Например, пространство имён (ранее, пул) TextConstants должно обращаться только к классу Character из пространства имён Core, поэтому при его определении используется импорт конкретного связывания:

Smalltalk.Graphics defineNameSpace: #TextConstants private: false

imports: ’private Core.Character’ category: ’Graphics-Constants’

После этого импортированное имя может использоваться непосредственно, без квалификации пути!

Так же надо поступить, если нужно импортировать из конкретного пространства имён (пула) не все переменные, а только одну или несколько его переменных. Например, если нужно импортировать единственную текстовую константу Bold из пространства имён TextConstants, то строка импорта в определении должна иметь вид

imports: ’private Graphics.TextConstants.Bold’.

Это позволяет в коде данного пространства имён ссылаться посредством неквалифицированного имени только на разделяемую переменную Bold из пространства имён TextConstants.

Если связывание определено в одном пространстве имён, а затем импортировано в другое, полное точечное имя может определять путь к пространству имён, импортирующему ссылку, вместо пути к родному пространству имён. Так, например, если пространство Smalltalk.MyNameSpace импортирует имя Bold, точечное имя MyNameSpace.Bold является законным точечным именем, по которому достигается разделяемая переменная Bold. Поэтому нет необходимости в ссылке на разделяемую переменную Bold обязательно использовать путь к её родному пространству имён TextConstants.

3.4. Особенности импорта

57

Поскольку точечное имя вводит путь, начинающийся сразу после пространства имён Smalltalk, точечные имена не поддерживают правила относительного пути, подобного тому, которое используется в файловой системе. Однако, можно сослаться на связывание относительно контекста текущего пространства имён, начиная описание пути со знака подчеркивания и точки (_.). Можно использовать этот подход, например, тогда, когда пространство имён MyNamespace1 импортирует другое пространство имён MyNamespace2, и в MyNamespace2 есть класс MyClass с переменной класса MyVariable. В этом случае любой объект в MyNamespace1 может ссылаться на переменную MyVariable посредством

_.MyClass.MyVariable.

3.4.Особенности импорта

Когда говорят об “импортировании пространства имён”, обычно подразумевают импортирование содержимого пространства имён, а не только самого имени этого пространства. Содержимое пространства имён может включать в себя:

определения классов,

определения других пространств имён,

определения разделяемых переменных.

Определение пространства имён Smalltalk «публичным образом» импортирует все пространства имён системы для дальнейшего их экспорта, поэтому все эти связывания доступны из пространства Smalltalk:

Smalltalk.Root defineNameSpace: #Smalltalk private: false

imports: ’ Core.* Kernel.* OS.* External.*

Graphics.* UI.* Tools.*

CraftedSmalltalk.* XProgramming.SUnit.* Database.*

Lens.*

private VWHelp.*

category: ’System-Name Spaces’

58

Глава 3. Пространства имён

В то же время, каждое из определений этих пространств имён импортирует пространство Smalltalk, но уже «частным образом». Например,

Smalltalk defineNameSpace: #Kernel private: false

imports: ’private Smalltalk.*’ category: ’System-Name Spaces’

Таким образом, каждое пространство имён, в свою очередь, импортирует частным образом все связывания из пространства Smalltalk, включая все связывания, которые Smalltalk импортировал из своих подпространств, но не имеет права далее импортировать эти связывания в случае, когда оно само будет импортироваться!

В результате, например, экземпляр класса External.CComposite может ссылаться на класс Core.Array c помощью неквалифицированного имени — просто Array. Таким образом, как и прежде, все основные классы, пространства имён (среди них пулы в смысле классического Смолтока), другие разделяемые переменные, доступны непосредственно из пространства Smalltalk.

Такой подход упрощает перемещение в последующие реализации VisualWorks кода предшествующих версий, гарантируя доступность всех классов системы. Когда код импортируется, он загружается непосредственно в пространство имён Smalltalk, где имеет доступ ко всем необходимым классам системы, и потому может работать с ним без изменения своего кода.

Добавленные в систему VisualWorks компоненты других производителей, которые не импортированы в Smalltalk, должны явно импортироваться создаваемым пространством имён или классом.

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

Следует отметить тот факт, что при импортировании самого класса его переменные класса не импортируются. Класс — не пространство имён! Хотя в некоторых ситуациях класс может выступать в роли про-

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