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