update dev300-m58
[ooovba.git] / sj2 / doc / concepts.html
blob49f336b131d8a7cee68854f7994df08f800e1dc2
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
2 <HTML>
3 <HEAD>
4 <TITLE></TITLE>
5 <META NAME="GENERATOR" CONTENT="StarOffice/4.0 (WinNT/Win95)">
6 <META NAME="AUTHOR" CONTENT=" ">
7 <META NAME="CREATED" CONTENT="19970401;13233926">
8 <META NAME="CHANGEDBY" CONTENT=" ">
9 <META NAME="CHANGED" CONTENT="19970529;8045806">
10 </HEAD>
11 <BODY>
12 <H1>Stardivision erweiterte Java Grundkonzepte</H1>
13 <H2><A NAME="Exceptions"></A>Exceptions:</H2>
14 <P>Die Grundidee von Exceptions ist es einen Fehlerkontext
15 aufzuspannen, der erst n&auml;her betrachtet werden mu&szlig;, wenn
16 man Fehler korrigieren will. Der Programmcode sollte durch die
17 Behandlung von Fehlern nicht undurchsichtig und unleserlich werden.
18 Meiner Meinung nach sollten Exceptions deswegen auch nicht als
19 zweiter Returnwert vergewaltigt werden.<BR><B>Ziel:</B> Nach dem
20 Auftreten einer Exception sollte es m&ouml;glichst einfach sein das
21 System in einen definierten arbeitsf&auml;higen Zustand zu
22 versetzen.<BR>Es gibt grunds&auml;tzlich drei verschiedenen Arten von
23 Exceptions. Diese unterscheiden sich durch den Zustand in dem sie das
24 Objekt hinterlassen.</P>
25 <OL>
26 <LI><P><A NAME="Undefined Exception"></A>Die von der Methode
27 benutzten Objekte sind in einem undefinierten Zustand. Jede auf dem
28 Objekt aufgerufene Methode mu&szlig; nach einer solchen Exception
29 nicht mehr ihre Spezifikation einhalten. Diese Exception wird im
30 folgenden mit &#132;Undefined Exception&#147; benannt. Dabei ist zu
31 beachten, da&szlig; keine weiteren <A HREF="#Resourcen">Resourcen</A>,
32 au&szlig;er die angegebenen, benutzt werden. Au&szlig;erdem werden
33 &#132;ReadOnly&#147; Resourcen nicht modifiziert.</P>
34 <LI><P><A NAME="Defined Exception"></A>Die von der Methode benutzten
35 Objekte sind in einem genau definierten Zustand, der aber von der
36 Zusicherung der Methode abweicht. Diese Exception wird im folgenden
37 mit &#132;Defined Exception&#147; benannt. Dabei ist zu beachten,
38 da&szlig; keine weiteren <A HREF="#Resourcen">Resourcen</A>, au&szlig;er
39 die angegebenen, benutzt werden. Au&szlig;erdem werden &#132;ReadOnly&#147;
40 Resourcen nicht modifiziert.</P>
41 <LI><P><A NAME="Transacted Exception"></A>Die von der Methode
42 benutzten Objekte sind in ihrem vorherigen Zustand, der aber von der
43 Zusicherung der Methode abweicht. Diese Exception wird im folgenden
44 mit &#132;Transacted Exception&#147; benannt. Dabei ist zu beachten,
45 da&szlig; keine weiteren <A HREF="#Resourcen">Resourcen</A>, au&szlig;er
46 die angegebenen, benutzt werden. Au&szlig;erdem werden &#132;ReadOnly&#147;
47 Resourcen nicht modifiziert. Diese Spezifikation trifft auch auf
48 &#132;Defined Exception&#147; zu, wegen ihrer Bedeutung f&uuml;hre
49 ich sie extra auf.</P>
50 </OL>
51 <P>Die Benutzbarkeit eines Objektes, nachdem eine Exception
52 aufgetreten ist, ist vom obigen Typ der Exception abh&auml;ngig.</P>
53 <P><FONT COLOR="#ff0000">Satz 1.1: Nachdem eine &#132;Undefined
54 Exception&#147; aufgetreten ist, kann mit dem Objekt sowie allen
55 &#132;ReadWrite&#147; Resourcen nicht mehr weiter gearbeitet werden.</FONT></P>
56 <P><FONT COLOR="#ff0000">Satz 1.2: Nachdem eine &#132;Defined
57 Exception&#147; aufgetreten ist, kann aufgrund des genau definierten
58 Zustandes weiter gearbeitet werden.</FONT></P>
59 <P><FONT COLOR="#ff0000">Satz 1.3: Nach einer &#132;Transacted
60 Exception&#147; ist der gleiche Zustand wie vor dem Aufruf
61 wiederhergestellt.</FONT></P>
62 <P>Es sollten m&ouml;glichst nur &#132;Transacted Exception&#147;
63 ausgel&ouml;st werden. Bei komplizierten Methoden l&auml;&szlig;t
64 sich aber eine &#132;Defined Exception&#147; nicht immer vermeiden.
65 Eine &#132;Undefined Exception&#147; deutet immer auf eine
66 Programmierfehler hin. Der Typ der Exeption kann nur in Zusammenhang
67 mit der Methode in der sie Auftritt ermittelt werden.</P>
68 <P><FONT COLOR="#ff0000">Satz 1.4: Durch die Klasse der Exception
69 kann niemals alleine der Typ (undefined, defined oder transacted)
70 entschieden werden.</FONT></P>
71 <H2><A NAME="Resourcen"></A>Resourcen (under construction)</H2>
72 <P>Die Grundidee von Resourcen ist die Aufteilung eines Gebildes in
73 weitere Einheiten. Auf diesen k&ouml;nnen dann verschiedene Auftr&auml;ge
74 gleichzeitig arbeiten, wenn sie nicht dieselben Resourcen benutzen.
75 Z.B. kann man in einer Textverarbeitung die einzelnen Dokumente als
76 Einheiten betrachten. Auftr&auml;ge, die sich nur auf ein Dokument
77 beziehen, k&ouml;nnen parallel zu anderen Dokumenten bearbeitet
78 werden.<BR>Mit Resourcen sind im System bzw. der Applikation
79 vorhandene Objekte, Services, Kan&auml;le ... gemeint, die zur Zeit
80 nur von einem Thread benutzt werden k&ouml;nnen. Als Konsequenz
81 m&uuml;ssen Resourcen einem Thread zugeordnet werden, bevor dieser
82 sie benutzt.<BR><B>Ziel:</B> Es mu&szlig; m&ouml;glich sein, 1.
83 Auftr&auml;ge parallel abzuarbeiten, 2. die Frage &#132;Warum k&ouml;nnen
84 zwei Auftr&auml;ge nicht parallel arbeiten?&#147; beantwortet zu
85 k&ouml;nnen.<BR>Es gibt verschiedene M&ouml;glichkeiten diese
86 Zuordnung vorzunehmen. Zwei stelle ich kurz vor.</P>
87 <OL>
88 <LI><P><A NAME="Prealloc Resource Konzept"></A>Eine Art der
89 Zuordnung ist das vorherige Anfordern aller f&uuml;r den Auftrag
90 ben&ouml;tigten Resourcen. Ist dies m&ouml;glich, kann der Auftrag
91 ohne weitere St&ouml;rungen ablaufen. Die Resourcen d&uuml;rfen
92 freigegeben werden, bevor der Auftrag beendet ist. Dies gilt
93 nat&uuml;rlich nur f&uuml;r nicht mehr verwendete Resourcen. Es darf
94 ebenfalls das Zuordnungsrecht von lesend und schreibend auf lesend
95 zur&uuml;ckgenommen werden. Diese Zuornungsart wird im weiteren mit
96 &#132;Prealloc Resource Konzept&#147; bezeichnet.</P>
97 <LI><P><A NAME="Ondemand Resource Konzept"></A>Eine andere Art der
98 Zuordnung ist das Anfordern der Resourcen, wenn sie ben&ouml;tigt
99 werden. Dabei kann es zu St&ouml;rungen kommen, wenn sich
100 verschiedene Auftr&auml;ge um die gleiche Resource bewerben. Die
101 Resourcen d&uuml;rfen freigegeben werden, bevor der Auftrag beendet
102 ist. Dies gilt nat&uuml;rlich nur f&uuml;r nicht mehr verwendete
103 Resourcen. Es darf ebenfalls das Zuordnungsrecht von lesend und
104 schreibend auf lesend zur&uuml;ckgenommen werden. Diese Zuornungsart
105 wird im weiteren mit &#132;Ondemand Resource Konzept&#147;
106 bezeichnet.</P>
107 </OL>
108 <P>Es gibt noch weitere M&ouml;glichkeiten Auftr&auml;ge zu
109 bearbeiten, die die gleichen Resourcen benutzen. H&auml;ufig findet
110 man solche L&ouml;sungen bei Datenbankanwendungen.<BR>In der
111 folgenden Tabelle stehen sich die beiden Konzepte mit ihren Vor- und
112 Nachteilen und ihren Anforderungen gegen&uuml;ber.</P>
113 <TABLE WIDTH=100% BORDER=1 CELLPADDING=5 FRAME=BOX RULES=ALL>
114 <COLGROUP>
115 <COL WIDTH=85*>
116 <COL WIDTH=85*>
117 <COL WIDTH=85*>
118 </COLGROUP>
119 <THEAD>
120 <TR>
121 <TH WIDTH=33% VALIGN=TOP>
122 <P><BR></TH>
123 <TD WIDTH=33% VALIGN=TOP><DL>
124 <DD>Prealloc Resource Konzept </DD>
125 </DL>
126 </TD>
127 <TD WIDTH=33% VALIGN=TOP>
128 <DL>
129 <DD>Ondemand Resource Konzept </DD>
130 </DL>
131 </TD>
132 </TR>
133 </THEAD>
134 <TBODY>
135 <TR>
136 <TD VALIGN=TOP>
137 <P>Alle Resourcen m&uuml;ssen vor der Auftragsausf&uuml;hrung
138 bekannt sein.</TD>
139 <TD VALIGN=TOP>
140 <P>Ja</TD>
141 <TD VALIGN=TOP>
142 <P>Nein</TD>
143 </TR>
144 <TR>
145 <TD VALIGN=TOP>
146 <P>Nicht mehr ben&ouml;tigte Resourcen d&uuml;rfen freigegeben
147 werden.</TD>
148 <TD VALIGN=TOP>
149 <P>Ja</TD>
150 <TD VALIGN=TOP>
151 <P>Ja</TD>
152 </TR>
153 <TR>
154 <TD VALIGN=TOP>
155 <P>Es kann zu Verklemmungen oder &#132;Races&#147; kommen.</TD>
156 <TD VALIGN=TOP>
157 <P>Nein</TD>
158 <TD VALIGN=TOP>
159 <P>Ja</TD>
160 </TR>
161 <TR>
162 <TD VALIGN=TOP>
163 <P>In Bearbeitung befindliche Auftr&auml;ge m&uuml;ssen, aufgrund
164 fehlender Resourcen, abgebrochen werden.</TD>
165 <TD VALIGN=TOP>
166 <P>Nein</TD>
167 <TD VALIGN=TOP>
168 <P>Ja</TD>
169 </TR>
170 <TR>
171 <TD VALIGN=TOP>
172 <P>Der Zustand der Resourcen ist zu jedem Zeitpunkt der
173 Auftragsabarbeitung bekannt.</TD>
174 <TD VALIGN=TOP>
175 <P>Ja</TD>
176 <TD VALIGN=TOP>
177 <P>Nein</TD>
178 </TR>
179 <TR>
180 <TD VALIGN=TOP>
181 <P>Algorithmus zur Resourcevergabe.</TD>
182 <TD VALIGN=TOP>
183 <P>Einfach, da nur &uuml;berpr&uuml;ft werden mu&szlig;, ob alle
184 ben&ouml;tigten Resourcen verf&uuml;gbar sind.</TD>
185 <TD VALIGN=TOP>
186 <P>Komplex, da neben dem Anfordern von Resourcen auch noch
187 &uuml;berpr&uuml;ft werden mu&szlig;, ob das System <A HREF="#lebendig">lebendig</A>
188 ist.</TD>
189 </TR>
190 <TR>
191 <TD VALIGN=TOP>
192 <P>Parallelit&auml;t</TD>
193 <TD VALIGN=TOP>
194 <P>Hoch, da unabh&auml;ngige Auftr&auml;ge meistens nur lesend
195 auf gemeinsame Resourcen zugreifen.</TD>
196 <TD VALIGN=TOP>
197 <P>Sehr hoch, da die ben&ouml;tigten Resourcen erst angefordert
198 werden, wenn man sie braucht.</TD>
199 </TR>
200 </TBODY>
201 </TABLE>
202 <P ALIGN=LEFT>Meiner Meinung nach ist nur das &#132;Prealloc Resource
203 Konzept&#147; ohne richtige Programmierwerkzeuge zur Entwicklung
204 paralleler Algorithmen (z.B. Netzprogrammierung) wenigstens ein
205 bi&szlig;chen beherschbar.</P>
206 <P ALIGN=LEFT>Es stellt sich die Frage wie das &#132;Prealloc
207 Resource Konzept&#147; in einem Komponenten-Modell und in einem
208 Objekt-Environment integriert werden kann. Ein Objekt-Environment ist
209 ein mehr oder weniger dynamische Menge von Objekten die miteinander
210 in Verbindung stehen. Aus dem obigen Beispiel k&ouml;nnte man die
211 Verbindung der Textverarbeitung zu ihren Dokumenten als
212 Objekt-Environment bezeichnen. Ein Objekt in diesem Environment kann
213 nun &uuml;ber seine Verbindungen mit anderen Objekten kommunizieren.
214 Die Schnittstellen mit denen &uuml;ber die Verbindung kommuniziert
215 wird nennt man Komponenten-Modell. Die Idee des Objekt-Environments
216 ist es weitere Objekte m&ouml;glichst einfach zu integrieren. So
217 k&ouml;nnten in unserem Beispiel weitere Dokumenttypen wie ein
218 HTML-Dokument eingebunden werden. Die Schittstellen m&uuml;&szlig;ten
219 nur dem, von der Textverarbeitung geforderten, Komponenten-Modell
220 gen&uuml;gen. Liefert aber das Modell, wie heute &uuml;blich, keine
221 Information &uuml;ber die ben&ouml;tigten Resourcen bei Benutzung der
222 Schnittstellen, dann k&ouml;nnen Verklemmungen bzw. Inkonsistenzen
223 nicht vermieden werden. Aus diesem Grunde ist es notwendig, das
224 Resource-Konzept in das Komponenten-Modell zu integrieren.<BR><B>Ziel:</B>
225 Es mu&szlig; ein Kompromi&szlig; zwischen hoher Nebenl&auml;ufigkeit
226 und der damit verbundenen Komplexit&auml;t, sowie einfacher
227 Programmierung und geringer Nebenl&auml;ufigkeit gefunden
228 werden.<BR><B>Folgen:</B> In einem Objekt-Environment m&uuml;ssen die
229 einzelnen Objekte also dynamisch auf Verbindungen zu Objekten mit
230 hoher oder geringer Nebenl&auml;ufigkeit reagieren. Die Komplexit&auml;t
231 dieser Aufgabe darf aber nicht in die Objekte verlagert werden, da
232 von einem seriellen Objekt (bzw. dessen Programmierer) nicht die
233 Steuerung nebenl&auml;ufiger Auftr&auml;ge verlangt werden
234 kann.<BR><B>L&ouml;sungsansatz:</B> Die Behandlung der
235 Nebenl&auml;ufigkeit wird nicht in einer einfachen Komponente
236 implementiert. Das bedeutet sie mu&szlig; mit einer
237 Default-Behandlung zufrieden sein, die minimale Nebel&auml;ufigkeit
238 nach sich zieht. Eine Komponente kann sich aber in die Vergabe der
239 Resourcen einmischen. So kann sie ihren Grad der Nebenl&auml;ufigkeit
240 erh&ouml;hen. Dies ist dann aber auch mit erh&ouml;htem
241 Implementationsaufwand zu bezahlen. Auf der anderen Seite macht es
242 aber keinen Sinn serielle oder Komponenten mit zu gro&szlig;em
243 Resourcebedarf einzubinden, wenn das Objekt-Environment danach
244 praktisch nicht mehr lauff&auml;hig ist. Das bedeutet, da&szlig; das
245 Objekt-Environment auch Forderungen bez&uuml;glich des Resourcebedarf
246 an die Komponenten stellen darf.</P>
247 <H3>Anforderungen</H3>
248 <OL>
249 <LI><P ALIGN=LEFT>Es mu&szlig; ein Modell geben, in dem alle
250 vorhandenen Resourcen und deren Beziehung zueinander eingetragen
251 werden. Dadurch kann abgesch&auml;tzt werden, welchen Resourcebedarf
252 eine Komponente hat. Das &#132;Sch&auml;tzen&#147; ist w&ouml;rtlich
253 zu nehmen. (Im Zusammenhang mit <A HREF="#Security">Security</A>
254 wird man aber auch noch sehen, da&szlig; der Zugriff auf bestimmte
255 Resourcen nicht m&ouml;glich ist.) F&uuml;r das &#132;Prealloc
256 Resource Konzept&#147; gilt, es m&uuml;ssen mindestens die
257 ben&ouml;tigten Resourcen verf&uuml;gbar sein. Zur Not sind diese
258 alle.</P>
259 <LI><P ALIGN=LEFT>Eine nebenl&auml;ufige Komponente mu&szlig; in
260 jeder ihrer von au&szlig;en erreichbaren Methoden kontrollieren, ob
261 die entsprechenden Resourcen f&uuml;r sie angefordert wurden. Damit
262 serielle Komponenten diese Methoden nutzen k&ouml;nnen, k&ouml;nnen
263 die ben&ouml;tigten Resourcen angefordert werden, wenn vorher noch
264 <B>keine einzige</B> durch den ausf&uuml;hrenden Auftrag belegt war.
265 Zur Erl&auml;uterung: Serielle Komponenten belegen keine Resourcen.
266 Damit w&uuml;rde jeder Aufruf einer nebenl&auml;ufigen Komponente
267 scheitern. Um dies zu vermeiden, werden die Resourcen in der
268 nebenl&auml;ufigen Komponente angefordert.</P>
269 <LI><P ALIGN=LEFT>Serielle Komponenten m&uuml;ssen also damit
270 rechnen eine Fehlermeldung &uuml;ber nicht verf&uuml;gbare Resourcen
271 zu bekommen.</P>
272 </OL>
273 <H3>Szenarien</H3>
274 <P>Von unserem bisherigen Beispiel ausgehend, gibt es eine
275 Applikation in der sich drei Dokumente befinden. Ein serielles
276 Textdokument, ein nebenl&auml;ufiges Tabellendokument und ein
277 nebenl&auml;ufiges Pr&auml;sentationsdokument. Die Applikation selbst
278 ist nebenl&auml;ufig. Die Relationen gehen von der Applikation zu den
279 Dokumenten und umgekehrt. Die Dokumente kennen sich nicht.</P>
280 <P>Fall 1:<BR>In das serielle Textdokument soll eine Zeichenfolge
281 eingef&uuml;gt werden. Da es sich um eine serielle Komponente
282 handelt, kann dieses Einf&uuml;gen nicht von selbst ausgel&ouml;st
283 werden, es mu&szlig; von einer nebenl&auml;ufigen Komponente, hier
284 die Applikation, angesto&szlig;en werden. Die Applikation ist aber
285 verpflichtet die Resourcen vorher zu reservieren. F&uuml;r diese
286 Absch&auml;tzung gibt es drei realistische M&ouml;glichkeiten. 1. Sie
287 reserviert nur das Textdokument selbst. Das bedeutet, das
288 Textdokument kann mit keinem anderen Objekt, auch nicht mit der
289 Applikation, kommunizieren. 2. Die Applikation und das Textdokument
290 wird reserviert. Es ist also nur der Zugriff auf die anderen
291 Dokumente verwehrt. 3. Alle Objekte werden reserviert. Geht es nach
292 dem &#132;Prealloc Resource Konzept&#147; mu&szlig; 3. gew&auml;hlt
293 werden. Aufgrund von Sicherheitsbeschr&auml;nkungen werden wir aber
294 noch sehen, das serielle Komponenten in ihrer Auftragsbearbeitung
295 gestoppt werden k&ouml;nnen. Wenn der Abbruch eines Auftrags m&ouml;glich
296 ist, spielt es aber keine Rolle durch wen (Resourcen oder <A HREF="#Security">Security</A>)
297 dies geschehen ist.</P>
298 <P>Fall 2:<BR>In das nebenl&auml;ufige Tabellendokument soll eine
299 Zeichenfolge eingef&uuml;gt werden. Dieser Auftrag kann von der
300 Applikation oder der Komponente selbst ausgel&ouml;st werden. In
301 jedem Fall m&uuml;ssen die Resourcen vor der Auftragsbearbeitung
302 reserviert werden. Man kann dies auch der Komponente &uuml;berlassen
303 (siehe Anforderung 2.), aber man scheitert, wenn zwei Auftr&auml;ge
304 zu einem Auftrag zusammengefa&szlig;t werden sollen. Dies passiert
305 z.B., wenn der Auftrag &#132;Text ersetzen&#147; aus den Auftr&auml;gen
306 &#132;L&ouml;schen&#147; und &#132;Einf&uuml;gen&#147; besteht. Auf
307 jeden Fall wird nur das Tabellendokument selbst reserviert, da das
308 Einf&uuml;gen keine Auswirkung auf andere Komponenten hat.</P>
309 <P>Fall 3:<BR>In das nebenl&auml;ufige Tabellendokument wird der
310 Applikationsname aus der Applikation eingef&uuml;gt. Dazu fragt das
311 Tabellendokument nach den ben&ouml;tigten Resourcen, um den Namen zu
312 holen und ihn einzuf&uuml;gen. Zum Holen wird die Applikation
313 ben&ouml;tigt und zum Einf&uuml;gen das Tabellendokument. Beide
314 m&uuml;ssen vor der Auftragsausf&uuml;hrung reserviert werden.</P>
315 <P>Fall 4:<BR>Das nebenl&auml;ufige Tabellendokument f&uuml;gt
316 selektierten Text aus dem seriellen Textdokument ein. Da das
317 Textdokument seinen Resourcebedarf nicht mitteilt, wird einer aus
318 Fall eins abgesch&auml;tzte Bedarf genommen. Man kann sehen, da&szlig;
319 der Auftrag f&uuml;r alle drei M&ouml;glichkeiten erteilt werden
320 kann. Seine Nebenl&auml;ufigkeit wird dann durch die Absch&auml;tzung
321 eingeschr&auml;nkt. Zus&auml;tzlich m&uuml;ssen nat&uuml;rlich die
322 ben&ouml;tigten Resourcen f&uuml;r das Einf&uuml;gen geholt werden.
323 Alle m&uuml;ssen vor der Auftragsausf&uuml;hrung reserviert werden.</P>
324 <H3>Programmierkonzepte</H3>
325 <P>Welche Konzepte k&ouml;nnen in einer objektorientierten Sprache
326 wie c++ oder Java oder einer prozeduralen Sprache wie Fortran oder
327 &#132;c&#147; eingesetzt werden, um Nebenl&auml;ufigkeit zu
328 erreichen. </P>
329 <OL>
330 <LI><P>Es gibt zwei M&ouml;glichkeiten eine Resource zu belegen. Das
331 ist Exclusive (lesen, schreiben) und &#132;ReadOnly&#147;. Eine
332 Resource kann von mehreren Auftr&auml;gen benutzt werden, wenn diese
333 nur &#132;ReadOnly&#147; ben&ouml;tigen.</P>
334 <LI><P>Es gibt Resourcen f&uuml;r die man die Resourceverteilung
335 optimieren kann. Ein Objekt welches nicht ge&auml;ndert werden kann
336 und das w&auml;hrend der Auftragsausf&uuml;hrung immer konsistent
337 ist kann die Anforderung &#132;Exclusiv&#147; automatisch auf
338 &#132;ReadOnly&#147; abschw&auml;chen. Dies lohnt sich, wenn man
339 serielle Komponenten hat, die nichts &uuml;ber die
340 Resourceanforderungen mitteilen. Als Beispiel m&ouml;chte ich eine
341 Instanz der Klasse String in Java nennen. Ein weitere Art von
342 Resourcen fordern bei Auftr&auml;gen an sie 1. keine weiteren
343 Auftr&auml;ge an, 2. beenden sie die Auftr&auml;ge schnell und 3.
344 die Reihenfolge der &Auml;nderung an ihnen ist f&uuml;r andere nicht
345 wichtig. Dies ist zum Beispiel bei der Speicherverwaltung in c der
346 Fall. Diese Art der Resource darf zu einem sp&auml;teren Zeitpunkt
347 angefordert werden. Sie mu&szlig; sofort benutzt und wieder
348 freigegeben werden. Aus diesem Grund erledigen solche Resourcen das
349 Anfordern und Freigeben selbst.</P>
350 <LI><P>Bevor ein Auftrag ausgef&uuml;hrt werden kann, m&uuml;ssen
351 alle von ihm ben&ouml;tigten Resourcen reserviert werden. Dies ist
352 f&uuml;r einen Auftrag, der aus mehreren Teilauftr&auml;gen besteht,
353 aufwendig. Eine Optimierung kann darin bestehen die Teilauftr&auml;ge
354 asynchron auszuf&uuml;hren. Allerdings dringt diese Verhaltensweise
355 nach au&szlig;en. Z.B. m&uuml;ssen Auftr&auml;ge, die diesen dann
356 asynchronen Auftrag nutzen, dann auch asynchron sein. Eine weitere
357 Optimierung in der Autragsvergabe gibt es, wenn ein Autrag die
358 Resourcervergabe nicht &auml;ndert. Es ist dann m&ouml;glich mehr
359 Auftr&auml;ge vorzuziehen.</P>
360 <LI><P>Es mu&szlig; eine Queue geben, in die Auftr&auml;ge eingef&uuml;gt
361 werden k&ouml;nnen. Konfliktfreie Auftr&auml;ge k&ouml;nnen parallel
362 ausgef&uuml;hrt werden. <B>Achtung:</B> Der Resourcebedarf eines
363 Auftrages kann nur bestimmt werden, wenn alle ben&ouml;tigten
364 Resourcen &#132;ReadOnly&#147; reserviert werden k&ouml;nnen, es sei
365 denn kein vor ihm laufender Auftrag &auml;ndert die Resourcevergabe.
366 Warum ist das so? Ein Auftrag kann eine Resource dahingehend &auml;ndern,
367 da&szlig; danach andere Resourcen ben&ouml;tigt werden als vorher.
368 Der vorher bestimmte Bedarf ist dann falsch.</P>
369 <LI><P>Das Modell der Resourcen kann vergr&ouml;bert oder verfeinert
370 werden. In einem Tabellendokument k&ouml;nnte man jede einzelne
371 Zelle zu einer Resource machen. Um die Komplexit&auml;t der
372 Resourcemodells zu vereinfachen kann man aber weiter alle Zellen der
373 Dokument-Resource zuordnen. Wird also aus einer anderen Komponente
374 die Zelle angefordert, wird automatisch das ganze Dokument
375 reserviert. Daraus ergeben sich zwei Vorteile: 1. F&uuml;r den
376 Auftraggeber ist die Vergr&ouml;berung transparent und 2. Kann die
377 Resource an dem Objekt reserviert werden, das man ohnehin kennt.</P>
378 <LI><P>Das Resource-Modell ist hierarchisch. Eine Resource kann nur
379 einer Vergr&ouml;berung zugeordnet werden. Die Tabellenzellen d&uuml;rfen
380 also nur dem Tabellendokument zugeordnet werden. Daraus ergibt sich,
381 da&szlig; innerhalb einer solchen Hierarchie nebenl&auml;ufig
382 gearbeitet werden kann. Es d&uuml;rfen dann aber keine Resourcen
383 au&szlig;erhalb der Hierarchie benutzt werden, selbst wenn diese
384 reserviert sind.</P>
385 </OL>
386 <H3>Probleme und L&ouml;sungen</H3>
387 <P>&Uuml;ber den Benutzer m&uuml;ssen Daten abgefragt werden, die
388 &uuml;ber die Benutzung von Resourcen entscheidet (z.B.
389 Dateiname):<BR>Ein solcher Auftrag mu&szlig; in zwei Teilauftr&auml;ge
390 unterteilt werden. Der erste erledigt die Abfrage. Danach werden alle
391 Resourcen freigegeben und dann fordert der zweite seine Resourcen und
392 wird bearbeitet. Eventuell kann ein solcher Auftrag den vorherigen
393 ersetzten, um zu verhindern das andere abh&auml;ngige Auftr&auml;ge
394 vor dem Aufgeteilten bearbeitet werden.</P>
395 <P>Ich habe mich bei einem Objekt als Listener angemeldet:<BR>Es gibt
396 zwei Arten von Benachrichtigungen die ich erhalte. 1. Aufgrund der
397 Ausf&uuml;hrung eines Auftrages und 2. einen Event von einer
398 nebenl&auml;ufigen Komponente. Im ersten Fall &uuml;berpr&uuml;fe ich
399 den Resourcebedarf und f&uuml;hre dann den Auftrag aus. Im zweiten
400 Fall reserviere ich die ben&ouml;tigten Resourcen und f&uuml;hren den
401 Auftrag aus. Sind Resourcen reserviert, ist dies Fall eins, sonst
402 Fall zwei.</P>
403 <P>Ich bin Broadcaster:<BR>Broadcaste ich aufgrund eines Auftrags tue
404 ich nichts weiter. L&ouml;se ich den Broadcast ohne Auftrag aus, mu&szlig;
405 ich die Resourcen f&uuml;r die Listener bestimmen und sie vor dem
406 Aufruf reservieren. Die einzelnen Listener werden als unabh&auml;ngig
407 betrachtet. Im Detail findet folgender Ablauf statt. 1. Die Liste der
408 Listener wird kopiert. 2. F&uuml;r den ersten Listener wird der
409 Resourcebedarf ermittelt.</P>
410 <H3>Implementation</H3>
411 <P>Die Basis f&uuml;r die Implementation des Resourcekonzeptes legen
412 die Klassen <A HREF="stardiv.resource.Resource.html#Resource">Resource</A>,
413 <A HREF="stardiv.resource.ResourceList.html#ResourceList">ResourceList</A>,
414 <A HREF="stardiv.resource.ResourceLockException.html#ResourceLockException">ResourceLockException</A>,
415 <A HREF="stardiv.resource.Task.html#Task">Task</A>, <A HREF="stardiv.resource.TaskManager.html#TaskManager">TaskManager</A>,
416 <A HREF="stardiv.resource.TaskThread.html#Task">TaskThread</A>,
417 <A HREF="stardiv.resource.ThreadData.html#ThreadData">ThreadData</A>
418 und das Interface <A HREF="stardiv.resource.Resourceable.html#Resourceable">Resourceable</A>
419 fest. Um ein Objekt in das Resourcekonzept einbinden zu k&ouml;nnen
420 sind folgende Schritte notwendig:<BR>1. Das Resourceable Interface
421 mu&szlig; implementiert werden. 2. Ein Konstruktor mit der dem
422 Objekte zugewiesenen Resource. 3. Jede public Methode bekommt eine
423 *_Resource(...) Methode zur Seite, mit der der Resourcebedarf
424 ermittelt werden kann. 4. Innerhalb der public Methode wird der
425 Resourcebedarf ermittelt. 5. Mit dieser Information die als
426 ResourceListe vorliegt, wird eine Auftrag (Task) erzeugt. 6. Dieser
427 Auftrag wird beim TaskManager angemeldet. 7. Nach der Zuteilung durch
428 den TaskManager wird der Auftrag ausgef&uuml;hrt. 8. Alle Resourcen
429 und der Auftrag werden wieder freigegeben.<BR>Diese Liste ist
430 detailliert aber nicht <B>vollst&auml;ndig</B>. In der Klasse
431 Resource steht imm eine Beispiel, welches aktuell sein sollte.</P>
432 <P>Folgende Programmierrichtlinien gibt es, um das &#132;Prealloc
433 Resource Konzept&#147; in Java zu integrieren:</P>
434 <OL>
435 <LI><P ALIGN=LEFT>Es mu&szlig; das Interface <A HREF="stardiv.resource.Resourceable.html#Resourceable">Resourceable</A>
436 implementiert werden. Mit Hilfe dieses Interfaces kann der
437 Resourcebedarf eines Objektes erfragt werden. Diese Richtlinien
438 gelten dann auch f&uuml;r die Superklasse.</P>
439 <LI><P ALIGN=LEFT>???Es mu&szlig; das Interface <A HREF="stardiv.concepts.ModifyTestable.html#ModifyTestable">ModifyTestable</A>
440 implementiert werden. Damit kann &uuml;berpr&uuml;ft werden, ob an
441 den Resourcen Ver&auml;nderungen vorgenommen wurden.</P>
442 <LI><P ALIGN=LEFT>Nur Methoden die &uuml;ber die Lebensdauer des
443 Objektes keine ver&auml;nderten Werte liefern d&uuml;rfen immer
444 gerufen werden. Das sind zum Beispiel alle Methoden der Klasse
445 java.lang.Object.</P>
446 <LI><P ALIGN=LEFT>Um den Resourcebedarf einzelner Methoden genauer
447 zu ermitteln kann eine Methode mit dem, um _Resource( ResourceList
448 aRL, boolean bCheck, ... ) erweiterten Namen, gerufen werden. Ein
449 Beispiel befindet sich in der Klasse <A HREF="stardiv.resource.Resource.html#Resource">Resource</A>.</P>
450 </OL>
451 <H2><A NAME="Security"></A>Security</H2>
452 <H2><A NAME="Data Requests"></A>Data Requests</H2>
453 <P>Diese Schnittstelle soll das Anfordern von Daten vereinheitlichen.
454 Das Problem, welches zu diesem Ansatz f&uuml;hrte, ist das Lesen von
455 Daten &uuml;ber einen &#132;langsamen&#147; Internet-Stream. Das
456 bedeutet es werden Daten ben&ouml;tigt, die erst noch &uuml;bertragen
457 werden m&uuml;ssen. Da das Pull-Modell immer einen eigenen Thread
458 vorraussetzt, um die restliche Anwendung nicht zu blockieren, habe
459 ich das Push-Modell gew&auml;hlt.<BR><B>Ziel:</B> F&uuml;r die
460 Implementation sollte es m&ouml;glichst transparent sein, wie die
461 Daten herangeschafft werden. Als zweites soll die Schnittstelle f&uuml;r
462 denjenigen einfach sein, der alle Daten sofort bereith&auml;lt.<BR><B>L&ouml;sung:</B>
463 Der Datenverarbeiter ist passiv. Das bedeutet, beim Entgegennehmen
464 der Daten beginnt er nicht sie zu verarbeiten. Dies mu&szlig; extra
465 angesto&szlig;en werden. Zweitens, der Datenverarbeiter h&auml;lt den
466 Status des Datenlieferanten. Dies k&ouml;nnen EOF, f&uuml;r alle
467 Daten gelesen, READY, f&uuml;r sind Daten da, PENDING, es kommen noch
468 weitere Daten und NO_SOURCE, es wurden nicht alle Daten verarbeitet
469 und es kommen keine weiteren Daten mehr. <B>Achtung</B> der Status
470 ist nur zu bestimmten Zeitpunkten g&uuml;ltig. Der Datenverarbeiter
471 darf nur im Zustand PENDING Daten bekommen. Diese Annahme sch&uuml;tzt
472 ihn vor der Implementation eines Puffers. Das <A HREF="stardiv.concepts.QueryData.html#QueryData">QueryData</A>
473 - Interface ist die Spezifikation f&uuml;r dieses Verhalten.</P>
474 <H2><A NAME="Modify"></A>Modify</H2>
475 <P>Das Ziel ist nur eine Schnittstelle zu erstellen, mit der ein
476 Objekt auf &Auml;nderungen &uuml;berpr&uuml;ft werden kann. Da es f&uuml;r
477 ein Objekt verschiedene M&ouml;glichkeiten gibt &Auml;nderungen an
478 sich zu pr&uuml;fen (z.B. &Auml;nderungsz&auml;hler, Kopie), mu&szlig;
479 die Schnittstelle m&ouml;glichst flexibel sein, um vielen
480 Implementationen gerecht zu werden. Die L&ouml;sung sind zwei
481 Methoden. Mit der einen (getModifyHandle()) kann der Zeitpunkt
482 festgemacht werden, zu dem m&ouml;gliche &Auml;nderungen &uuml;berpr&uuml;ft
483 werden sollen. Der R&uuml;ckgabewert ist eine beliebiges Objekt, so
484 da&szlig; in ihm die ben&ouml;tigte &Uuml;berpr&uuml;fungsinformation
485 (z.B. der &Auml;nderungsz&auml;hler) untergebracht werden kann.
486 Danach kann mit der zweiten Methode (isModified(Object)) &uuml;berpr&uuml;ft
487 werden, ob eine &Auml;nderung stattgefunden hat. Das Interface f&uuml;r
488 dieses Konzept hei&szlig;t <A HREF="stardiv.concepts.ModifyTestable.html#ModifyTestable">ModifyTestable</A>
489 .</P>
490 <H2><A NAME="LifeConnect"></A>LifeConnect</H2>
491 <P>LifeConnect ist die Kommunikation zwischen PlugIns, Applets und
492 JavaScript. Die Kommunikation kann in beide Richtungen erfolgen.Unter
493 JavaScript kann auf alle Systemklassen zugegriffen werden. Die
494 Abbildung der JavaScript-Aufrufe nach Java ist die Aufgabe der Klasse
495 <A HREF="stardiv.js.ip.CallJava.html#CallJava">CallJava</A>. Dazu
496 wird das in Java 1.1 implementierte Package java.lang.reflect
497 benutzt. Da JavaScript eine nicht typisierte Sprache ist, werden die
498 Werte nach JavaScript-Regeln in die entsprechenden Javatypen
499 umgesetzt. Bez&uuml;glich der Sicherheit wird ein JavaScript-Programm
500 auf die gleiche Stufe wie ein Applet gestellt. Um den Zugriff der
501 Applets auf JavaScript zu gestatten, mu&szlig; das HTML-Tag MYSCRIPT
502 angegeben werden. Auf die Java-Klassen kann in JavaScript mit dem
503 Prefix &#132;Package&#147; zugegriffen werden (sun, java und netscape
504 ben&ouml;tigen keinen Prefix). Die Klassen netscape.plugin.Plugin,
505 netscape.javascript.JSObject und netscape.javascript.JSException
506 dienen zur Kommunikation von Java mit JavaScript.</P>
507 <P>Konvertierungstabelle anhand der Spezifikation &#132;JavaScript
508 Language Specifications&#147; 3.1.2 TypeConversion</P>
509 <TABLE WIDTH=100% BORDER=1 CELLPADDING=5 CELLSPACING=0 FRAME=HSIDES RULES=ALL>
510 <COLGROUP>
511 <COL WIDTH=26*>
512 <COL WIDTH=40*>
513 <COL WIDTH=47*>
514 <COL WIDTH=47*>
515 <COL WIDTH=47*>
516 <COL WIDTH=47*>
517 </COLGROUP>
518 <THEAD>
519 <TR>
520 <TH WIDTH=10% VALIGN=TOP>
521 <P><BR></TH>
522 <TH WIDTH=16% VALIGN=TOP>
523 <P><I>byte</I></TH>
524 <TH WIDTH=19% VALIGN=TOP>
525 <P><I>short</I></TH>
526 <TH WIDTH=19% VALIGN=TOP>
527 <P><I>char</I></TH>
528 <TH WIDTH=19% VALIGN=TOP>
529 <P><I>int</I></TH>
530 <TH WIDTH=19% VALIGN=TOP>
531 <P><I>long</I></TH>
532 </TR>
533 </THEAD>
534 <TBODY>
535 <TR>
536 <TD VALIGN=TOP>
537 <P ALIGN=LEFT>Undef.</TD>
538 <TD VALIGN=TOP>
539 <P ALIGN=LEFT>Fehler</TD>
540 <TD VALIGN=TOP>
541 <P ALIGN=LEFT>Fehler</TD>
542 <TD VALIGN=TOP>
543 <P ALIGN=LEFT>Fehler</TD>
544 <TD VALIGN=TOP>
545 <P ALIGN=LEFT>Fehler</TD>
546 <TD VALIGN=TOP>
547 <P ALIGN=LEFT>Fehler</TD>
548 </TR>
549 <TR>
550 <TD VALIGN=TOP>
551 <P ALIGN=LEFT>Function</TD>
552 <TD VALIGN=TOP>
553 <P ALIGN=LEFT>(10) valueOf/error</TD>
554 <TD VALIGN=TOP>
555 <P ALIGN=LEFT>(11) valueOf/error</TD>
556 <TD VALIGN=TOP>
557 <P ALIGN=LEFT>(11) valueOf/error</TD>
558 <TD VALIGN=TOP>
559 <P ALIGN=LEFT>(12) valueOf/error</TD>
560 <TD VALIGN=TOP>
561 <P ALIGN=LEFT>(13) valueOf/error</TD>
562 </TR>
563 <TR>
564 <TD VALIGN=TOP>
565 <P ALIGN=LEFT>Object</TD>
566 <TD VALIGN=TOP>
567 <P ALIGN=LEFT>(10) valueOf/error</TD>
568 <TD VALIGN=TOP>
569 <P ALIGN=LEFT>(11) valueOf/error</TD>
570 <TD VALIGN=TOP>
571 <P ALIGN=LEFT>(11) valueOf/error</TD>
572 <TD VALIGN=TOP>
573 <P ALIGN=LEFT>(12) valueOf/error</TD>
574 <TD VALIGN=TOP>
575 <P ALIGN=LEFT>(13) valueOf/error</TD>
576 </TR>
577 <TR>
578 <TD VALIGN=TOP>
579 <P ALIGN=LEFT>Object (null)</TD>
580 <TD VALIGN=TOP>
581 <P ALIGN=LEFT>(10) 0</TD>
582 <TD VALIGN=TOP>
583 <P ALIGN=LEFT>(11) 0</TD>
584 <TD VALIGN=TOP>
585 <P ALIGN=LEFT>(11) 0</TD>
586 <TD VALIGN=TOP>
587 <P ALIGN=LEFT>(12) 0</TD>
588 <TD VALIGN=TOP>
589 <P ALIGN=LEFT>(13) 0</TD>
590 </TR>
591 <TR>
592 <TD VALIGN=TOP>
593 <P ALIGN=LEFT>double</TD>
594 <TD VALIGN=TOP>
595 <P ALIGN=LEFT>(10) Zahl oder Fehler, wenn Bereichs-&uuml;berschreitung</TD>
596 <TD VALIGN=TOP>
597 <P ALIGN=LEFT>(11) Zahl oder Fehler, wenn Bereichs-&uuml;berschreitung</TD>
598 <TD VALIGN=TOP>
599 <P ALIGN=LEFT>(11) Zahl oder Fehler, wenn Bereichs-&uuml;berschreitung</TD>
600 <TD VALIGN=TOP>
601 <P ALIGN=LEFT>(12) Zahl oder Fehler, wenn Bereichs-&uuml;berschreitung</TD>
602 <TD VALIGN=TOP>
603 <P ALIGN=LEFT>(13) Zahl oder Fehler, wenn Bereichs-&uuml;berschreitung</TD>
604 </TR>
605 <TR>
606 <TD VALIGN=TOP>
607 <P ALIGN=LEFT>boolean</TD>
608 <TD VALIGN=TOP>
609 <P ALIGN=LEFT>(15) 0/1</TD>
610 <TD VALIGN=TOP>
611 <P ALIGN=LEFT>(15) 0/1</TD>
612 <TD VALIGN=TOP>
613 <P ALIGN=LEFT>(15) 0/1</TD>
614 <TD VALIGN=TOP>
615 <P ALIGN=LEFT>(15) 0/1</TD>
616 <TD VALIGN=TOP>
617 <P ALIGN=LEFT>(15) 0/1</TD>
618 </TR>
619 <TR>
620 <TD VALIGN=TOP>
621 <P ALIGN=LEFT>Leer String</TD>
622 <TD VALIGN=TOP>
623 <P ALIGN=LEFT>error</TD>
624 <TD VALIGN=TOP>
625 <P ALIGN=LEFT>error</TD>
626 <TD VALIGN=TOP>
627 <P ALIGN=LEFT>error</TD>
628 <TD VALIGN=TOP>
629 <P ALIGN=LEFT>error</TD>
630 <TD VALIGN=TOP>
631 <P ALIGN=LEFT>error</TD>
632 </TR>
633 <TR>
634 <TD VALIGN=TOP>
635 <P ALIGN=LEFT>String</TD>
636 <TD VALIGN=TOP>
637 <P ALIGN=LEFT>(10) error/ Zahl</TD>
638 <TD VALIGN=TOP>
639 <P ALIGN=LEFT>(11) error/ Zahl</TD>
640 <TD VALIGN=TOP>
641 <P ALIGN=LEFT>(11) error/ Zahl</TD>
642 <TD VALIGN=TOP>
643 <P ALIGN=LEFT>(12) error/ Zahl</TD>
644 <TD VALIGN=TOP>
645 <P ALIGN=LEFT>(13) error/ Zahl</TD>
646 </TR>
647 </TBODY>
648 </TABLE><DL>
649 <DT><BR></DT>
650 </DL>
651 <TABLE WIDTH=100% BORDER=1 CELLPADDING=5 CELLSPACING=0 FRAME=BOX RULES=ALL>
652 <COLGROUP>
653 <COL WIDTH=27*>
654 <COL WIDTH=59*>
655 <COL WIDTH=44*>
656 <COL WIDTH=35*>
657 <COL WIDTH=36*>
658 <COL WIDTH=55*>
659 </COLGROUP>
660 <THEAD>
661 <TR>
662 <TH WIDTH=10% VALIGN=TOP>
663 <P><BR></TH>
664 <TH WIDTH=23% VALIGN=TOP>
665 <P><I>float</I></TH>
666 <TH WIDTH=17% VALIGN=TOP>
667 <P><I>double</I></TH>
668 <TH WIDTH=14% VALIGN=TOP>
669 <P><I>boolean</I></TH>
670 <TH WIDTH=14% VALIGN=TOP>
671 <P><I>String</I></TH>
672 <TH WIDTH=22% VALIGN=TOP>
673 <P><I>Object</I></TH>
674 </TR>
675 </THEAD>
676 <TBODY>
677 <TR>
678 <TD VALIGN=TOP>
679 <P ALIGN=LEFT>Undef.</TD>
680 <TD VALIGN=TOP>
681 <P ALIGN=LEFT>Fehler</TD>
682 <TD VALIGN=TOP>
683 <P ALIGN=LEFT>Fehler</TD>
684 <TD VALIGN=TOP>
685 <P ALIGN=LEFT>false</TD>
686 <TD VALIGN=TOP>
687 <P ALIGN=LEFT>&#132;undefined&#147;</TD>
688 <TD VALIGN=TOP>
689 <P ALIGN=LEFT>null</TD>
690 </TR>
691 <TR>
692 <TD VALIGN=TOP>
693 <P ALIGN=LEFT>Function</TD>
694 <TD VALIGN=TOP>
695 <P ALIGN=LEFT>(14) valueOf/error</TD>
696 <TD VALIGN=TOP>
697 <P ALIGN=LEFT>(15) valueOf/error</TD>
698 <TD VALIGN=TOP>
699 <P ALIGN=LEFT>(15) valueOf/ true</TD>
700 <TD VALIGN=TOP>
701 <P ALIGN=LEFT>(15) JS-Code der Funktion</TD>
702 <TD VALIGN=TOP>
703 <P ALIGN=LEFT>(30) netscape .javascript. JSObject</TD>
704 </TR>
705 <TR>
706 <TD VALIGN=TOP>
707 <P ALIGN=LEFT>Object</TD>
708 <TD VALIGN=TOP>
709 <P ALIGN=LEFT>(14) valueOf/error</TD>
710 <TD VALIGN=TOP>
711 <P ALIGN=LEFT>(15) valueOf/error</TD>
712 <TD VALIGN=TOP>
713 <P ALIGN=LEFT>(15) valueOf/ true</TD>
714 <TD VALIGN=TOP>
715 <P ALIGN=LEFT>(15) valueOf / toString
716 </TD>
717 <TD VALIGN=TOP>
718 <P ALIGN=LEFT>(30) Java-Cast/ error</TD>
719 </TR>
720 <TR>
721 <TD VALIGN=TOP>
722 <P ALIGN=LEFT>Object (null)</TD>
723 <TD VALIGN=TOP>
724 <P ALIGN=LEFT>(14) 0</TD>
725 <TD VALIGN=TOP>
726 <P ALIGN=LEFT>(15) 0</TD>
727 <TD VALIGN=TOP>
728 <P ALIGN=LEFT>(15) false</TD>
729 <TD VALIGN=TOP>
730 <P ALIGN=LEFT>(15) &#132;null&#147;</TD>
731 <TD VALIGN=TOP>
732 <P ALIGN=LEFT>(30) null</TD>
733 </TR>
734 <TR>
735 <TD VALIGN=TOP>
736 <P ALIGN=LEFT>double</TD>
737 <TD VALIGN=TOP>
738 <P ALIGN=LEFT>(14) Zahl oder Fehler, wenn Bereichs-&uuml;berschreitung</TD>
739 <TD VALIGN=TOP>
740 <P ALIGN=LEFT>(30) Zahl</TD>
741 <TD VALIGN=TOP>
742 <P ALIGN=LEFT>(7) 0, NaN -&gt; false !0, -+Infinite -&gt; true</TD>
743 <TD VALIGN=TOP>
744 <P ALIGN=LEFT>(8) Zahl, NaN, Infinity oder -Infinity</TD>
745 <TD VALIGN=TOP>
746 <P ALIGN=LEFT>(9) Number/ error
747 </TD>
748 </TR>
749 <TR>
750 <TD VALIGN=TOP>
751 <P ALIGN=LEFT>boolean</TD>
752 <TD VALIGN=TOP>
753 <P ALIGN=LEFT>(15) 0/1</TD>
754 <TD VALIGN=TOP>
755 <P ALIGN=LEFT>(15) 0/1</TD>
756 <TD VALIGN=TOP>
757 <P ALIGN=LEFT>(30) boolean</TD>
758 <TD VALIGN=TOP>
759 <P ALIGN=LEFT>(15) &#132;false&#147;/ &#147;true&#147;</TD>
760 <TD VALIGN=TOP>
761 <P ALIGN=LEFT>(15) Boolean/ error</TD>
762 </TR>
763 <TR>
764 <TD VALIGN=TOP>
765 <P ALIGN=LEFT>Leer String</TD>
766 <TD VALIGN=TOP>
767 <P ALIGN=LEFT>error</TD>
768 <TD VALIGN=TOP>
769 <P ALIGN=LEFT>error</TD>
770 <TD VALIGN=TOP>
771 <P ALIGN=LEFT>(15) false</TD>
772 <TD VALIGN=TOP>
773 <P ALIGN=LEFT>(30) String</TD>
774 <TD VALIGN=TOP>
775 <P ALIGN=LEFT>(15) String/ error</TD>
776 </TR>
777 <TR>
778 <TD VALIGN=TOP>
779 <P ALIGN=LEFT>String</TD>
780 <TD VALIGN=TOP>
781 <P ALIGN=LEFT>(14) error/ Zahl</TD>
782 <TD VALIGN=TOP>
783 <P ALIGN=LEFT>(15) error/ Zahl</TD>
784 <TD VALIGN=TOP>
785 <P ALIGN=LEFT>(15) true</TD>
786 <TD VALIGN=TOP>
787 <P ALIGN=LEFT>(30) String</TD>
788 <TD VALIGN=TOP>
789 <P ALIGN=LEFT>(15) String/ error</TD>
790 </TR>
791 </TBODY>
792 </TABLE>
793 <P><BR></P>
794 <P>Der Algorithmus zum mappen der polymorphen Methoden in Java:<BR>1.
795 Die Anzahl der Parameter mu&szlig; &uuml;bereinstimmen.<BR>2. Die
796 Parameter m&uuml;ssen, nach der obigen Tabelle, konvertiert werden
797 k&ouml;nnen.<BR>3. Es gibt ein Punktesystem, nach dem die Methode
798 ausgew&auml;hlt wird. Die Punkte stehen in Klammern in den
799 Tabelleneintr&auml;gen. Die Konvertierungspunkte f&uuml;r Zahlen sind
800 typabh&auml;ngig und nicht wertabh&auml;ngig. Dadurch ist
801 sichergestellt, das nicht unterschiedliche Methoden bei sich
802 &auml;ndernden Werten gerufen werden. Kommt es allerdings zu einem
803 Konvertierungsfehler (&Uuml;berlauf), dann wird versucht eine andere
804 Methode zu finden.<BR>4. Es wird vorausgesetzt, da&szlig; die
805 Methoden &#132;valueOf&#147; und &#132;toString&#147; keine
806 Seiteneffekte haben. Sie d&uuml;rfen also beliebig oft aufgerufen
807 werden.<BR>5. Es wird nur null auf eine Java-Array abgebildet.</P>
808 <H2><A NAME="Testen"></A>Testen</H2>
809 <P>Das Ziel dieses Abschnitts ist es Vorgehensweisen zu entwickeln,
810 mit denen sich die Java Grundkonzepte testen lassen. Folgende
811 Checkliste ist f&uuml;r jede Methode abzuarbeiten.</P>
812 <OL>
813 <LI><P>Zu jeder Klasse gibt es eine entsprechende Testklasse. Diese
814 steht im Package &#132;test&#147;.... Der Name der Klasse wird mit
815 &#132;Test&#147; erweitert. Beispiel: stardiv.memory.BitArray wird
816 zu test.memory.BitArrayTest. Jede dieser Klassen hat eine Methode
817 &#132;public static void main( String [] )&#147;. Diese Methode wird
818 aufgerufen, um den Test aller Methoden anzusto&szlig;en. Der Test
819 ist nicht interaktiv. Wird ein Fehler festgestellt, wird das
820 Programm mit exit( -1 ) verlassen.</P>
821 <LI><P>Jede Methode mu&szlig; unabh&auml;ngig von ihren Environment
822 getestet werden. Alle Resourcen f&uuml;r die Methode werden als
823 Dummy f&uuml;r den Test implementiert. Diese Forderung f&uuml;hrt zu
824 sauberen Schnittstellen, da ansonsten f&uuml;r den Test ja ganze
825 Objekte implementiert werden m&uuml;ssen.</P>
826 <LI><P>Das Testprotokoll protokolliert mit &#132;System.out.println&#147;.
827 Vor dem Test der einzelnen Methoden wird in einer Zeile kurz &uuml;ber
828 den Test informiert. Scheitert der Test, dann wird eine
829 Fehlermeldung ausgegeben in der &#132;failed&#147; enthalten sein
830 mu&szlig;. </P>
831 <LI><P>Um <A HREF="#Defined Exception">Defined Exception</A> und
832 <A HREF="#Transacted Exception">Transacted Exception</A> testen zu
833 k&ouml;nnen, sollten die <A HREF="stardiv.concepts.Resource.html#Resource">Resource</A>
834 und <A HREF="stardiv.concepts.ModifyTestable.html#ModifyTestable">ModifyTestable</A>
835 Interfaces implementiert werden. Es kann damit automatisch gepr&uuml;ft
836 werden, ob sich eine Resource unerlaubter Weise ge&auml;ndert hat.</P>
837 </OL>
838 <H2>Begriffe</H2>
839 <P><A NAME="lebendig"></A>Lebendig: Ein System wird als lebendig
840 bezeichnet, wenn alle in ihm befindlichen Auftr&auml;ge
841 fertiggestellt werden k&ouml;nnen. Sie sich also nicht in einer
842 Verklemmung oder einem &#132;Race&#147; befinden.</P>
843 </BODY>
844 </HTML>