Principy tvorby objektů v komponentním frameworku BCF



Podobné dokumenty
Návrh programu v Black Box Component Builderu s využitím architektury Model View Controller

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

TÉMATICKÝ OKRUH Softwarové inženýrství

Sdílení dat mezi podprogramy

1. Dědičnost a polymorfismus

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

TÉMATICKÝ OKRUH Softwarové inženýrství

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Základy objektové orientace I. Únor 2010

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Sada 1 - Základy programování

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

dovolují dělení velkých úloh na menší = dekompozice

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Programování II. Modularita 2017/18

Analýza a Návrh. Analýza

1. Programování proti rozhraní

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

DUM 06 téma: Tvorba makra pomocí VBA

NPRG030 Programování I, 2015/16 1 / :25:32

První kroky s METEL IEC IDE

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

Postupy práce se šablonami IS MPP

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

typová konverze typová inference

CineStar Černý Most Praha

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Odvozené a strukturované typy dat

ADMINISTRACE POČÍTAČOVÝCH SÍTÍ. OPC Server

Prostředí pro výuku vývoje PCI ovladačů do operačního systému GNU/Linux

Příloha 6. Palety nástrojů

Vývoj informačních systémů. Přehled témat a úkolů

Tvorba aplikací v prostředí Black Box Component Builder

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

PODPROGRAMY PROCEDURY A FUNKCE

Úvod. Programovací paradigmata

Kapitola 1: Úvod. Systém pro správu databáze (Database Management Systém DBMS) Účel databázových systémů

Softwarové komponenty a Internet

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Jarkovský, L. Dušek, M. Cvanová. 5. Statistica

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Programovací jazyk Pascal

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Použití inteligentních značek s informačními službami

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

Objektově orientované technologie Diagram komponent Implementační náhled (Diagram rozmístění) Pavel Děrgel, Daniela Szturcová

TÉMATICKÝ OKRUH Softwarové inženýrství

PŘETĚŽOVÁNÍ OPERÁTORŮ

UML. Unified Modeling Language. Součásti UML

10 Balíčky, grafické znázornění tříd, základy zapozdření

Programování v C++, 2. cvičení

Objektově relační databáze a ORACLE 8

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

InsideBusiness Payments CEE

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

(IMPACT) CZ.1.07/2.2.00/

ALGORITMIZACE A PROGRAMOVÁNÍ

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Objektově orientovaný přístup

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY BAKALÁŘSKÁ PRÁCE. Návrhové vzory Dan Doležel

Fingerprint Verification Control

Allegro framework. Podstatné vlastnosti. Allegro Business Solution Framework

Základní datové struktury

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Informační systémy 2008/2009. Radim Farana. Obsah. Nástroje business modelování. Business modelling, základní nástroje a metody business modelování.

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Algoritmizace prostorových úloh

Roční periodická zpráva projektu

Obsah. Zpracoval:

RadioBase 3 Databázový subsystém pro správu dat vysílačů plošného pokrytí

Aplikace je program určený pro uživatele. Aplikaci je možné rozdělit na části:

MVC (Model-View-Controller)

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Reliance 3 design OBSAH

Národní standard pro elektronické systémy spisové služby

Seznámení s prostředím dot.net Framework

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

6. Příkazy a řídící struktury v Javě

HTML Hypertext Markup Language

Informační systémy 2008/2009. Radim Farana. Obsah. Obsah předmětu. Požadavky kreditového systému. Relační datový model, Architektury databází

Tieto Future Office. Přehled. Země: Česká republika. Odvětví: Samospráva

APS 400 ipanel. Online informační a ovládací panel pro systém APS 400. Uživatelská příručka

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

O datových typech a jejich kontrole

1/1 ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE PROVOZNĚ EKONOMICKÁ FAKULTA PŘIJÍMACÍ ŘÍZENÍ 2017/2018

Transkript:

Principy tvorby objektů v komponentním frameworku BCF Michal Brožek Katedra měřicí a řídicí techniky, VŠB Technická univerzita Ostrava, FEI, tř. 17. Listopadu, 708 33, Ostrava Poruba, Česká republika. Abstrakt Komponentní framework je pro většinu programátorů novým konceptem. Jednotné používání návrhových modelů v BCF (BlackBox Component Framework) značně přispívá k pochopení frameworku. V příspěvku budou čtenáři seznámeni s konkrétními postupy používání a vytváření nových objektů na základě návrhových vzorů v komponentním frameworku BCF. Tyto postupy vycházejí z principů komponentního programování v BCF. Jednoduché názorné ukázky konkrétního použití návrhových vzorů budou psány v implementačním jazyce Component Pascal. Protože BCF je zaměřen na zpracování složených dokumentů, i když nejenom na ně, budou pro demonstraci použity příklady zaměřené na zpracování dokumentů. Příspěvek vznikl na základě práce na projektu GAČR Vývoj programových a technických prostředků pro přenositelné a bezpečné aplikace řízení procesů číslo projektu 102/97/0542. A projektu FRVŠ Techniky komponentního programování v oblasti návrhu a implementace řídicích systémů číslo projektu 0655/98. 1. Úvod Protože je Component Pascal velmi podobný Pascalu a ještě více Module, mohou programující v těchto jazycích velmi rychle proniknout do problematiky programování v BCF. Flexibilita Component Pascalu umožňuje psát jak jednoduché programy, tak složité aplikace orientované na zpracování dokumentů v tomtéž jazyce. Vyspělý typový a modulární systém BCF umožňuje vyjádřit návrhové aspekty programu. Tím je umožněna i kontrola kompilátorem. Touto cestou je tedy možno považovat jazyk nejenom za prostředek implementace, ale i za prostředek specifikace. Na rozdíl od C++ nebo Smalltalku lze přímo v Component Pascalu vyjádřit řadu důležitých aspektů softwarové architektury. BCF je zaměřen na aplikace založené na dokumentech. Jak již jméno samotné napovídá, je BCF založen na principech abstrakce typu black-box. Framework se skládá z jádra, které je tvořeno vrstvenými moduly, a otevřené množiny sub-systémů. 18

Každý sub-systém je sám o sobě množinou vrstvených modulů. BCF se zaměřuje na vizuální komponenty což je flexibilní koncept, jak se ukázalo v případech VB, OLE, ActiveX prvků nebo JavaBeans. Základním kamenem vizuálních komponent je to, jak vypadají a interakce se svým obsahem a obsaženými komponentami. Hlavní abstrakcí v BCF je proto obraz ( view ). V BCF může být obraz plně soběstačný, tj. obsahuje vlastní zabudovaný model a ovladač (editor). Pro více komplexní obraz, jako jsou třeba kontejnerové obrazy, je použito řádné rozdělení na modely, obrazy a ovladače k dosažení zvýšené možnosti konfigurace a zvládnutí komplexnosti. 2. Objekty v BCF Pro pochopení dále uvedených příkladů je nutné objasnit způsob, jak jsou v BCF objekty definovány a jaké metody je možné vytvářet. Component Pascal používá jednotnou konstrukci pro označení jak rozhraní objektů, tak i jejich implementací záznamy. Toto sjednocení dovoluje fixovat některé implementační aspekty rozhraní, zatímco jiné mohou zůstat otevřené. Tato flexibilita je v komplexním frameworku často žádoucí. Je důležité sdělit architektonická rozhodnutí co nejpřesněji. Z tohoto důvodu může být záznam v Component Pascalu ohodnocen atributy tak, aby rozhraní explicitně zahrnovalo základní architektonická rozhodnutí. Je výhodou, že kompilátor umožňuje ověřování těchto rozhodnutí. Tyto atributy jsou EXTENSIBLE, ABSTRACT a LIMITED. Tyto atributy umožňují rozlišovat čtyři možné kombinace rozšíření a alokace: Tab. 1: Atributy architektury záznamu Atribut Rozšiřitelnost Alokace Přiřazení záznamu Bez NE ANO ANO ("FINAL") EXTENSIBLE ANO ANO NE ABSTRACT ANO NE NE LIMITED NE* NE* NE *kromě definujícího modulu Typ záznam je struktura, která je složena z neměnného počtu elementů, nazývaných položky, které mohou být různých typů. Deklarace typu záznam specifikuje jméno a typ každé položky. Každá položka může být exportována, tedy zpřístupněna. Component Pascal umožňuje kromě standardního exportu navíc tzv. read-only export (obsah proměnné, nebo položky záznamu může být pouze přečten, ale ne změněn). V rámci definujícího modulu jsou všechny položky veřejné a je možné je číst i změnit. Atributy jsou tedy uplatněny pouze za hranicemi definujícího modulu. 19

Tab. 2: Atributy viditelnosti Atribut Význam bez označení Soukromá položka mínus Export pouze pro čtení Hvězdička * Export čtení i změna Pozn.: Atributy jsou používány pro proměnné, konstanty, typy, procedury i metody. Typy záznamů označené jako ABSTRACT nebo EXTENSIBLE jsou rozšiřitelné, neboli mohou být použity jako základ pro rozšiřující záznam. Uveďme následující příklad: T0 = EXTENSIBLE RECORD x: INTEGER END T1 = RECORD (T0) y: REAL END V tomto příkladu je T1 rozšířením T0 a T0 je základním typem pro T1. Rozšiřující typ T1 se skládá z položek svého základního typu a z položek, které sám deklaruje. Všechny identifikátory, které jsou nově zavedeny, musí být jiné než ty, které byly deklarovány v původním, základním záznamu (záznamech). Existují další pravidla, která zaručují zachování neměnnosti architektonických rozhodnutí, a která jsou kontrolována kompilátorem. Základním typem abstraktního záznamu musí být abstraktní záznam. Záznam, který rozšiřuje skrytý (neexportovaný) záznam, nemůže být exportován. Jakýkoliv záznam je automaticky rozšířením předdeklarovaného záznamu ANYREC. ANYREC neobsahuje žádné položky. Příklady definic záznamů: Tree = POINTER TO Node Node = EXTENSIBLE RECORD Key : INTEGER; Left, right: Tree END CenterTree = POINTER TO CenterNode CenterNode = RECORD (Node) Width: INTEGER; subnode: Tree END Object=POINTER TO ABSTRACT RECORD END; 2.1 Metody Globálně deklarované procedury mohou být ve stejném modulu asociovány se záznamem. Říkáme, že metody jsou svázány s typem záznam. Vazba je vyjádřena typem příjemce v hlavičce deklarace metody. Příjemce může být parametr (VAR nebo IN) nebo odkaz. Příkladem hlavičky deklarace metody svázané se záznamem T0 může být následující: PROCEDURE (VAR t: T0) Insert (a: INTEGER), NEW; V tomto případě je příjemcem proměnná t typu T0. To znamená, že metoda Insert je svázaná se záznamem T0. Jestliže je metoda M svázána s typem T0, pak je 20

explicitně svázána s jakýmkoliv typem T1, který je rozšířením T0. Jestliže je metoda M` (se stejným názvem jako M) deklarována a svázána s T1, pak dojde k přepsání vazby a nová metoda M` je redefinicí původní M pro záznam T1. Formální parametry M a M` musí být shodné. Výjimkou je případ, kdy M je funkce vracející ukazatel. V tomto případě musí být návratový typ (výsledek) funkce M` rozšířením návratového typu M. Tab. 3: Atributy metod Atribut NEW ABSTRACT EMPTY EXTENSIBLE Význam Poprvé definovaná metoda Abstraktní metoda Prázdná neimplementovaná metoda Rozšiřitelná metoda Atribut NEW musí být použit u všech nově deklarovaných metod a nesmí být použit u předefinování metod. Tento atribut pomáhá detekovat nekonzistence mezi záznamem a jeho rozšířením, pokud jeden z nich je změněn, aniž by byl aktualizovaný druhý. Abstraktní (ABSTRACT) a prázdné (EMPTY) metody jsou tvořeny pouze hlavičkou procedury. Abstraktní metody nejsou nikdy volány. Záznam, který obsahuje abstraktní metody, musí být rovněž abstraktní. Volání prázdné (EMPTY) metody nemá žádný efekt. U metod označených symbolem je exportována pouze implementace. Takovéto metody mohou být sice předefinovány, ale jejich volání je možné jen z modulu, kde je provedena implementace. Příklady metod: PROCEDURE (obj: Object) Draw (w: Window), NEW, ABSTRACT (* nová abstraktní metoda *) PROCEDURE (obj: Object) Notify (e: Event), NEW, EMPTY (* nová prázdná metoda *) PROCEDURE (t: Tree) Insert (node: Tree), NEW, EXTENSIBLE; VAR p, father: Tree; (* zde je nějaký implementující kód*) END Insert PROCEDURE (t: CenterTree) Insert (node: Tree); (* redefinice *) (* nová implementace *) 21

t.insert^ (node) (* volá metodu Insert záznamu Tree super call*) END Insert 3. Návrhové vzory Architektura BCF je založena na velkém množství nových vzorů a postupů. Některé z nich jsou specifické pouze pro BlackBox. V této kapitole se budeme zabývat nejčastěji používanými návrhovými vzory v BCF: carrier-rider-mapper separace (CRM separace), directory objekty a HMVC. 3.1 Nosič-Jezdec-Formátovač návrhový vzor Nosič-Jezdec-Formátovač (CRM) návrhový vzor je v BCF takřka všudypřítomný. Tím, že je sjednocujícím prvkem v celém BCF, přispívá k porozumitelnosti frameworku. Klíčová idea je oddělení objektů, které nesou data (Nosič), přístupové cesty k datům v těchto objektech (Jezdec) a filtrům, které formátují data (Formátovače). Nosič udržuje data, která jsou přístupná logicky podle pozice. Abstraktní rozhraní Nosiče otevírá cestu pro rozšiřitelnost: mnoho konkrétních implementací může implementovat právě toto abstraktní rozhraní. Jezdec zapouzdřuje přístupovou cestu k datům na dané pozici. Nosič vytvoří svého Jezdce a tím má Nosič privilegovaný přístup k implementaci Jezdce. Proto Jezdec může efektivně udržovat specifický přístup k Nosiči. Rozdělení na Nosiče a Jezdce je obdobné jako návrhový vzor Iterátor [1][2] (viz. dále). Klienti používají kombinaci přímého rozhraní Nosiče a poskytovaného rozhraní Jezdce pro přístup k Nosiči. Společně rozhraní Nosiče a Jezdce tvoří úzké hrdlo, které ruší vazbu klienta od potenciálně mnoha implementací Nosiče. Formátovače jsou používány pro poskytnutí rozhraní, které je mnohem vhodnější pro určité klienty, jimž nevyhovuje surové rozhraní, které poskytuje Nosič a Jezdec. Klient 1:1 Formátovač 1:1 Jezdec n:1 Nosič Uživatelské rozhraní úzké rozhraní rozhraní na implementaci Obr. 1 Nosič-Jezdec-Formátovač 3.2 Directory objekty BlackBox abstrakce v BCF je přivedena do takového extrému, že ani jména abstraktních rozhraní nejsou veřejná. Použití příkazu NEW (součást jazyka) je předepsáno tak, že vyžaduje jméno třídy. Namísto toho jsou nové objekty vytvářeny použitím factory ( továrních ) metod nebo objektů[2]. Factory objekty, které jsou v BCF nazývány directory objekty, jsou použity, když je potřeba vytvořit nový objekt. 22

Každý modul, který zavádí novou abstrakci, zároveň poskytuje konfigurovatelný directory objekt, a pokud ten není k dispozici, je nahrazen standardním directory objektem. Použití je zřejmé z následujícího jednoduchého demonstračního příkladu: Directory = POINTER TO ABSTRACT RECORD END; VAR dir- : Directory; PROCEDURE (d : Directory) New* (): Docu, NEW; VAR doc : Docu; NEW(doc); (* zde jsou možné počáteční inicializace *) RETURN doc (* vrací nově vytvořený objekt *) END New; VAR Dok1 : Docu; Dok1 := dir.new(); 3.3 Hierarchický Model-Obraz-Ovladač (HMVC) Původní model MVC je nepoužitelný pro kombinované dokumenty, a proto BCF definuje model, který takovéto dokumenty podporuje [3]. Model je datová struktura, která uchovává data. Příkladem modelu v BlackBoxu je textový model. Text se skládá nejenom z pole znaků, ale obsahuje také font, velikost měřenou obvykle v bodech, a různorodé atributy, jako je podtržené, tlusté, italické atd. Všechny tyto informace musí být uloženy spolu s každým znakem v modelu. Obraz je vizuální reprezentace modelu v okně. V případě textového modelu jsou v okně znázorněny znaky. V závislosti na atributech uložených v textovém modelu budou znaky zobrazovány na obrazovce v daném fontu, budou normální nebo podtržené atd. Už teď je zřejmé, z významu modelu a obrazu, že obraz nebude existovat bez modelu. Protože obraz je vizuální zobrazení modelu na výstupním zařízení (obrazovce), musí mít něco, co zobrazí. Z pohledu programování musí být vytvořen nejprve model a teprve následovně je možné jej zobrazit pomocí obrazu. Ovladač je objekt, který řídí vzájemné působení mezi uživatelem a oknem (tedy obrazem), a manipuluje tak s modelem [4]. V příkladu textového modelu uživatel může chtít vložit slovo do textu na určitou pozici ve větě. Uživatel umístí kurzor pomocí myši do místa vkládání, klikne myší a pak začne psát slovo. Ovladač mění tvar kurzoru při pohybu nad textem a při kliknutí myši umístí kurzor na danou pozici. Ovladač je objekt, který řídí vzájemnou interakci mezi uživatelem a obrazem tak, aby měnil model. Primárním návrhovým konceptem MVC je oddělení obrazu od modelu. V HMVC může model obsahovat vnořené obrazy, pro které samozřejmě platí vše řečené. 3.4 Iterátory Model, obraz a ovladač jsou všechno objekty. Kromě nich je v BlackBoxu ještě jeden druh objektu, který je nutný pro I/O operace v oknech iterátory. Většina datových struktur je skladovými kontejnery pro sběr hodnot. Iterátor pro datovou strukturu je 23

objekt, který pracuje na kolekci dat. Iterátory v BlackBoxu jsou nezbytné pro I/O operace oken a jsou navrženy pro práci s hodnotami znaků, uložených v textovém modelu. V BlackBoxu jsou dva druhy iterátoru pro text jeden pro vkládání textu do modelu, nazývaný formátovač, a jeden pro čtení hodnot z modelu, nazývaný skener. Formátovače jsou používány pro výstup z oken a skenery pro vstup do oken. Každý z těchto iterátorů má vztah na textový model a nemá žádný vztah na obraz. Následující jednoduchý demonstrační příklad ukazuje vztah mezi modelem a obrazem v použití spolu s iterátorem. PROCEDURE (doc : Docu) OpenDocu*, NEW; VAR md : TextModels.Model; (* model *) vw : TextViews.View; (* obraz *) fm : TextMappers.Formatter; (* iterátor formátovač *) md := TextModels.dir.New(); (* directory objekt pro model *) fm.connectto(md); (* připojení iterátoru na model *) fm.writestring("ahoj:"); fm.writetab; fm.writeint(ab.a); fm.writetab; fm.writeint(ab.b); fm.writeln; vw := TextViews.dir.New(md); (* directory objekt pro obraz napojení na model*) Views.OpenView(vw); END Print; 4. Závěr Nosič-Jezdec-Formátovač návrhový vzor je v BCF takřka všudypřítomný. Tím, že je sjednocujícím prvkem v celém BCF, přispívá k porozumitelnosti frameworku. Klíčová idea je oddělení objektů, které nesou data (Nosič), přístupové cesty k datům v těchto objektech (Jezdec) a filtrům, které formátují data (Formátovače). Component Pascal používá jednotnou konstrukci pro označení jak rozhraní objektů, tak i jejich implementací: záznamy. Toto sjednocení dovoluje fixovat některé implementační aspekty rozhraní, zatímco jiné mohou zůstat otevřené. Tato flexibilita je v komplexním frameworku často žádoucí. Silným konceptem jsou abstraktní rozhraní a directory objekty. Kombinací obou lze vytvářet abstraktní rozhraní komponent s konkrétní i když ne viditelnou implementací, přístupnou právě pomocí těchto directory objektů. Tento koncept rovněž vychází z principů CMR separace. 24

Literatura: [1] Gamma, E., Helm, R., Johnson, R.,Vlissides, J., Design Patterns: Elements of Reusable Object-Oriented Software. Reading, MA: Addison-Wasley, 1995. [2] Warford, J., Programming in BlackBox The PBox Project. ftp://ftp.pepperdine.edu/pub/compsci/prog-bbox [3] Szyperski, C., Component Software Beyond Object-Oriented Programming. Reading, MA: Addison-Wesley, 1998. [4] BlackBox Component Builder Documentation. Switzerland, Oberon microsystems, Inc., 1997. 25