WEBVTT

00:10.630 --> 00:18.010
Also, unser Rätsel, unser Java-Rätsel, Java-Puzzler von dem Herrn

00:18.010 --> 00:19.370
Boch.

00:21.490 --> 00:24.450
Sie sehen, hier wird einfach, wie in einem Beispiel, den wir schon

00:24.450 --> 00:27.450
hatten, eine HashMap angelegt, eine besondere Form.

00:27.590 --> 00:31.110
Die Identity-HashMap benutzt sogenannte Referenzidentität.

00:32.510 --> 00:35.210
Und dann werden zwei Einträge gemacht.

00:35.570 --> 00:39.270
Sie wissen ja, eine HashMap ist einfach eine Streutabelle, in deren

00:39.270 --> 00:41.070
Einträge eingelegt werden.

00:41.810 --> 00:44.710
Womit man mit einer Streuadressierung, das heißt, man rechnet

00:44.710 --> 00:49.570
irgendeinen Code aus, aus dieser Zeichenreihe, um das als Zeige in

00:49.570 --> 00:50.750
eine Tabelle zu benutzen.

00:51.630 --> 00:54.330
Dann wird natürlich aufeinanderfolgende Zeichenreihen irgendwo

00:54.330 --> 00:57.390
hingestellt, je nachdem, welcher Code sich dabei ergibt.

00:58.310 --> 01:02.590
Was dann der HashCode oder der Streuwert ergibt an, wo das Element

01:02.590 --> 01:03.870
reinsetzen soll.

01:03.930 --> 01:07.010
Das heißt, wenn man nach einem solchen Element nach Mickey sucht,

01:07.390 --> 01:11.070
findet man das schnell wieder, weil man nach dem Schlüssel Mickey den

01:11.070 --> 01:14.210
gleichen Hash-Wert berechnet und der sagt einem, an welcher Stelle in

01:14.210 --> 01:15.450
der Tabelle das Ding sitzt.

01:15.890 --> 01:19.270
Also nicht von oben bis unten durchziehen, man muss nicht sortieren,

01:20.130 --> 01:25.910
man muss keine Tabellen, keine Suchbäume aufbauen oder sonst etwas.

01:26.110 --> 01:28.230
Das ist eine sehr schnelle, elegante Methode.

01:28.970 --> 01:33.350
Der Trick ist natürlich der HashCode, der muss so sein, dass er die

01:33.350 --> 01:40.290
Werte, die Schlüssel eben gut in der Tabelle streut, ohne sie alle auf

01:40.290 --> 01:43.150
die gleichen Bereiche in der Streutabelle abzubilden.

01:44.150 --> 01:47.450
Aber das nur nebenher, was eine Streutabelle ist oder ein HashMap.

01:49.350 --> 01:52.790
Hier werden zwei Dinge eingelegt und dann kommt System.Art.PrintLine

01:52.790 --> 01:55.830
mit der Größe m.size.

01:55.970 --> 01:58.790
Dann können Sie sich schon denken, dass da auch eine Überraschung

01:58.790 --> 01:59.390
dabei ist.

01:59.830 --> 02:00.990
Was wird dabei ausgegeben?

02:00.990 --> 02:03.630
Ist die Herstabelle 0, 1 oder 2 Elemente lang?

02:04.710 --> 02:05.450
Wer ist für 0?

02:08.860 --> 02:10.040
Wer ist für 1?

02:11.860 --> 02:12.920
Und wer ist für 2?

02:15.780 --> 02:17.100
Die Einser haben recht.

02:19.400 --> 02:21.340
Die Einser haben recht, woran liegt das?

02:23.980 --> 02:27.860
Das liegt daran, weil in Java, wenn Sie eine Zeichenkette wie Mickey

02:27.860 --> 02:35.160
eingeben, diese Zeichenkette abgelegt wird und Duplikate dafür, wenn

02:35.160 --> 02:38.140
Sie Mickey also nochmal eingeben, also eine zweite Zeichenreihe, ist

02:38.140 --> 02:39.760
das eigentlich die gleiche.

02:40.180 --> 02:44.300
Also hier, diese Zeichenreihe, ist die identische Zeichenreihe.

02:45.040 --> 02:49.640
Und dann sagt natürlich bei der Identity HashMap, sagt es, wir schauen

02:49.640 --> 02:54.060
nicht nur die Zeichen an, sondern auch den Verweis auf die

02:54.060 --> 02:55.040
Zeichenreihe selbst.

02:55.180 --> 02:59.100
Und wenn die gleich sind, dann nehmen wir an, die Dinger sind gleich,

02:59.100 --> 03:03.740
und der zweite Eintrag überschreibt den ersten.

03:04.220 --> 03:07.900
Es gibt nur einen, der mit Mickey, den Schlüssel Mickey hat, weil es

03:07.900 --> 03:09.720
auch nur eine Zeichenreihe Mickey gibt.

03:10.400 --> 03:12.240
Bei einer normalen HashMap wäre das anders.

03:13.160 --> 03:14.200
Das ist also ganz einfach.

03:15.480 --> 03:19.000
Wenn Sie natürlich Zeichenketten ändern, erzeugen Sie ein neues

03:19.000 --> 03:21.220
Objekt, bekommen einen Verweis auf dieses neue Objekt.

03:21.380 --> 03:23.940
Wenn ich dann Mickey 2 angegeben hätte, hätte ich in der Tat 2

03:23.940 --> 03:24.400
gekriegt.

03:26.440 --> 03:32.060
Also, die Lehre hieraus ist ganz einfach.

03:32.200 --> 03:35.180
Identity HashMap nur verwenden, wenn Sie auch wirklich eine

03:35.180 --> 03:38.840
Identitätsprüfung haben wollen, Referenzeindeutigkeit wirklich

03:38.840 --> 03:39.600
benötigt wird.

03:42.520 --> 03:46.420
Gut, und wenn Sie jetzt nicht mehr wissen, was Unveränderlichkeit oder

03:46.420 --> 03:51.720
Internierung zur Übersetzungszeit bedeutet, diese Zeichenreihe wird ja

03:51.720 --> 03:57.180
zur Übersetzungszeit eingegeben, dann lesen Sie in der Java Language

03:57.180 --> 03:58.380
Specification kurz nach.

03:59.160 --> 04:03.760
Das ist überhaupt immer eine gute Idee, in der Spezifikation

04:03.760 --> 04:06.200
nachzulesen, anstelle zu raten.

04:07.820 --> 04:13.940
Gut, dann, glaube ich, gibt es da nicht mehr viel zu sagen.

04:13.940 --> 04:23.800
Und wir hatten ja letztes Mal begonnen, über die UML-Sprache zu

04:23.800 --> 04:24.280
sprechen.

04:25.220 --> 04:29.840
Und das Erste, was wir jetzt lossteuern, sind die UML

04:29.840 --> 04:30.740
-Klassendiagramme.

04:30.880 --> 04:32.920
Und da hatten wir begonnen damit, dass ich sagte, wir brauchen erstmal

04:32.920 --> 04:36.680
eine ordentliche Definition, nicht so irgendein schwammiges Zeug, das

04:36.680 --> 04:40.140
die Verkäufer uns bieten, sondern eine gut fundierte.

04:40.140 --> 04:45.080
Da hatten wir gesagt, gut, wir stellen uns eine Grundmenge G vor, die

04:45.080 --> 04:49.960
enthält alles Substanzielle, alles Konzeptionelle, gegenwärtig,

04:50.020 --> 04:51.600
vergangen, zukünftig.

04:52.220 --> 04:56.640
Gerade Zukunftliches ist natürlich beim Programmieren sehr wichtig,

04:56.780 --> 04:59.320
Sie beschreiben Dinge, die erst in der Zukunft passieren werden, wenn

04:59.320 --> 05:01.160
nämlich das Programm ausführbar wird.

05:02.240 --> 05:05.520
Und natürlich will man auch dann auf Daten, die man aus der

05:05.520 --> 05:07.060
Vergangenheit hat, zurückgreifen können.

05:07.060 --> 05:09.620
Also wir brauchen sowohl Gegenwärtiges, Zukünftiges, als auch

05:09.620 --> 05:10.220
Vergangenes.

05:10.800 --> 05:17.560
Dann hatten wir gesagt, gut, ein Objekt ist ein identifizierbares,

05:19.240 --> 05:21.320
eindeutiges Element aus dieser Grundmenge G.

05:22.480 --> 05:24.920
Wir brauchen also nur einen einzelnen Menschen, der das kann.

05:26.760 --> 05:30.120
Und ich hatte da beim Hinausgehen, war einer ihrer Kollegen, hat

05:30.120 --> 05:35.760
nämlich gefragt, ob das G und die Menge Omega das Gleiche ist, nämlich

05:35.760 --> 05:36.680
die Menge aller Objekte.

05:36.740 --> 05:39.880
Und das ist natürlich nicht der Fall, denn es wird Dinge geben, die

05:39.880 --> 05:42.820
können wir nicht identifizieren, Dinge, die wir nicht kennen.

05:43.640 --> 05:46.820
Ich kann Ihnen die Dinge, die wir nicht kennen, nicht nennen, denn

05:46.820 --> 05:48.640
sonst wären sie schon wieder identifizierbar.

05:49.560 --> 05:52.560
Aber wir können schon mal sagen, wenn wir diese Grunddefinition

05:52.560 --> 05:55.560
annehmen, dann muss Omega kleiner sein als G, denn es gibt jede Menge

05:55.560 --> 05:58.880
Dinge, von denen wir nicht mal wissen, dass es sie gibt, und wir

05:58.880 --> 06:00.920
wissen nicht mal, dass es sie gibt.

06:01.660 --> 06:03.120
Wir können also nicht darüber sprechen.

06:03.780 --> 06:06.720
So, das war also das Objekt.

06:07.440 --> 06:10.380
Und dann sagten wir, was ist jetzt die Klasse?

06:10.700 --> 06:16.580
Da sagten wir, eine Klasse ist eigentlich eine Kategorie, das heißt

06:16.580 --> 06:22.160
eine, sagen wir, mehr oder weniger beliebige Zusammenfassung von

06:22.160 --> 06:25.600
Objekten, aus welchem Prinzip auch immer.

06:27.620 --> 06:30.620
Ich habe noch ein bisschen rumgelesen, was Kategorie eigentlich ist,

06:30.680 --> 06:31.980
da gibt es ziemlich viel zu lesen.

06:32.960 --> 06:36.280
Von philosophischen Gesichtspunkten, wo es um Existenz oder Nicht

06:36.280 --> 06:37.360
-Existenz auch geht.

06:38.060 --> 06:43.260
Uns interessiert es gar nicht mal, ob ein Objekt in einer Kategorie

06:43.260 --> 06:43.820
existiert.

06:43.940 --> 06:46.500
Es kann durchaus für unsere gedankliche Vorstellung durchaus sein,

06:47.140 --> 06:48.780
dass eine Kategorie leer ist.

06:49.580 --> 06:51.960
Dass es also keine Instanzen gibt, auch das kennen wir natürlich aus

06:51.960 --> 06:52.560
dem Programmieren.

06:52.920 --> 06:56.660
Jederzeit, sie legen Klassen an, aber erst wenn sie Instanzen auch mit

06:56.660 --> 07:01.880
anlegen, und das können sie manchmal nicht haben, dann ist diese

07:01.880 --> 07:02.680
Klasse nicht leer.

07:06.640 --> 07:09.940
Eine Kategorie gibt also an, wer die Mitglieder dieser Menge sind.

07:10.060 --> 07:12.360
Diese Kategorie könnte ich sagen, da werden einfach die Elemente

07:12.360 --> 07:14.860
aufgezählt, das wäre eine sehr primitive Art und Weise, da könnte ich

07:14.860 --> 07:18.220
sagen, der Erste, der Zweite und der Dritte sind sie, drei hier in der

07:18.220 --> 07:21.880
dritten Reihe, das wäre ziemlich ungeschickt, aber möglich.

07:22.860 --> 07:26.260
Generell gibt man eine gemeinsame Eigenschaft an, sodass man sagen

07:26.260 --> 07:31.760
kann, auch noch nicht gesehen Objekte sagen kann, ob sie zur Kategorie

07:31.760 --> 07:32.580
gehören oder nicht.

07:41.360 --> 07:42.400
Könnten Sie mitmachen?

07:43.380 --> 07:45.900
Wenn Sie sich unterhalten wollen, ist da oben eine Tür.

07:46.660 --> 07:48.660
Oder wenn es ein Problem gibt, dann fragen Sie mich.

07:51.600 --> 07:55.060
Das ist jetzt nochmal zur Wiederholung, das Exemplar ist jetzt ein

07:55.060 --> 07:57.780
konkretes Element einer bestimmten Klasse, es ist also nichts anderes

07:57.780 --> 08:01.620
als ein Objekt und wir sprechen davon auch manchmal von einer

08:01.620 --> 08:03.040
Ausprägung oder Instanz.

08:04.080 --> 08:05.980
So, jetzt haben wir endlich mal gesehen, was das ist.

08:06.140 --> 08:07.460
Und jetzt geht es eigentlich weiter.

08:08.880 --> 08:14.900
Wir müssen jetzt uns darüber unterhalten, was eine Klasse ist, aber

08:14.900 --> 08:19.240
vorher brauchen wir noch die Attribute, denn die Attribute werden

08:19.240 --> 08:24.840
jedenfalls bei uns im Programmieren vielfach die Elemente einer Klasse

08:24.840 --> 08:25.780
unterscheiden können.

08:25.780 --> 08:29.260
Und wir sagten, jetzt kommt ein komplexer Begriff, das ist die

08:29.260 --> 08:29.800
Gleichheit.

08:30.300 --> 08:32.520
Das hat sogar etwas mit unserem Rätsel zu tun.

08:32.640 --> 08:35.540
Wir hatten vorhin von Referenzgleichheit gesprochen, nämlich von

08:35.540 --> 08:37.280
Identität in diesem Falle.

08:38.140 --> 08:42.980
Also wir können durchaus Objekte einer Klasse Apfel haben, die gleich

08:42.980 --> 08:48.760
aussehen, zum Beispiel könnte ich mir vorstellen, dass es zwei Äpfel

08:48.760 --> 08:51.380
gibt, die rot sind und nicht angebissen und zwei Äpfel, die grün sind,

08:51.520 --> 08:52.080
aber angebissen.

08:52.580 --> 08:56.280
Und da würden wir sagen, die roten Äpfel sind nicht angebissen und

08:56.280 --> 08:57.940
sind gleich, aber nicht identisch.

09:00.940 --> 09:05.620
Das schauen wir uns jetzt an, das hatten wir schon besprochen, die

09:05.620 --> 09:06.060
Objektidentität.

09:06.240 --> 09:09.900
Hier kommt dieses Beispiel von dem roten und nicht angebissenen Apfel.

09:11.260 --> 09:14.480
Es sind nicht identisch, aber sie sind gleich.

09:15.860 --> 09:17.000
Was heißt jetzt das?

09:17.060 --> 09:18.920
Wann ist etwas identisch, wann ist es gleich?

09:18.920 --> 09:21.140
Und das wollen wir jetzt mal definieren.

09:22.260 --> 09:26.100
Zwei oder mehr Instanzen können also gleich sein, ohne dasselbe, also

09:26.100 --> 09:29.000
die Identität, das identische Objekt sein zu müssen.

09:31.140 --> 09:34.980
Wir können da nicht anders raus, als verschiedene Arten von Gleichheit

09:34.980 --> 09:35.720
zu definieren.

09:38.240 --> 09:41.280
Wir besprechen also von der Gleichheit X der Stufe, wir können

09:41.280 --> 09:44.140
beliebig hochziehen die Anzahl der Stufen, wir müssen uns aber nur die

09:44.140 --> 09:46.440
ersten drei anschauen, um zu verstehen, wie es geht.

09:46.440 --> 09:50.780
Wir sagen also zunächst mal, Gleichheit 0 der Stufe bedeutet, es

09:50.780 --> 09:52.980
handelt sich um ein und dasselbe Objekt.

09:54.840 --> 09:58.440
Wenn Sie jetzt wieder an unser Rätsel denken, da sprachen wir ja von

09:58.440 --> 10:03.700
Referenzidentität, da war mit dem Miki das ein und dasselbe Objekt

10:03.700 --> 10:06.980
gegeben, Identität, keine zwei.

10:08.680 --> 10:11.800
Das ist also ganz leicht, dann ist natürlich die Gleichheit 1.

10:11.900 --> 10:16.540
Stufe, sagen wir, zwei Objekte sind gleich in 1.

10:16.640 --> 10:20.080
Stufe, wenn sie schon mal identisch wären, wenn sie identisch sind,

10:20.140 --> 10:21.880
sind sie auch gleich in der 1.

10:21.980 --> 10:27.540
Stufe, aber wenn sie nicht identisch sind, dann müssen sie in allen

10:27.540 --> 10:29.980
Attributen identische Werte besitzen.

10:30.760 --> 10:33.000
Identische Werte ihrer Attribute besitzen.

10:33.360 --> 10:35.840
Und das sind die Äpfel von vorhin.

10:36.640 --> 10:41.880
Sie hatten in all ihren Attributen identische Werte, nämlich falsch,

10:41.960 --> 10:44.720
in dem einen Fall angebissen und in der Farbe rot.

10:46.040 --> 10:46.940
Identische Werte.

10:48.400 --> 10:51.380
Und da haben wir eine kleine Schwierigkeit schon, denn wir müssen

10:51.380 --> 10:54.680
jetzt unterscheiden zwischen primitiven Werten, nämlich den Farben

10:54.680 --> 11:01.460
oder den Zahlen oder den Zeichen und den Objekten.

11:02.560 --> 11:05.200
Und da wirkt sich jetzt die Gleichheit bei der Gleichheit 2.

11:05.420 --> 11:07.140
Stufe, wirkt sich dieser Unterschied aus.

11:07.140 --> 11:08.500
Bei Gleichheit 2.

11:08.700 --> 11:10.820
Stufe sagen wir erstmal, wenn sie 0.

11:10.960 --> 11:11.380
oder 1.

11:11.500 --> 11:13.180
Stufe gleich sind, sind sie auch Gleichheit 2.

11:13.340 --> 11:13.520
Stufe.

11:13.620 --> 11:15.080
Das ist also erstmal Grundlage.

11:16.700 --> 11:19.660
Wenn schon etwas in der niedrigen Stufe gleich ist, dann ist es auch

11:19.660 --> 11:20.660
in der höheren Stufe gleich.

11:21.060 --> 11:25.980
Aber schwieriger wird es jetzt, wenn wir sagen, handelt es sich um

11:25.980 --> 11:31.080
zwei verschiedene Objekte, die aber in allen Attributen gleiche, das

11:31.080 --> 11:32.000
wäre wieder die 1.

11:32.120 --> 11:35.640
Stufe, Entschuldigung, identische Werte, das wäre 1.

11:35.760 --> 11:38.000
Stufe oder gleiche Werte besitzen.

11:40.500 --> 11:42.380
Und in diesem Fall ist Gleichheit 1.

11:42.480 --> 11:43.240
Stufe gemeint.

11:45.560 --> 11:48.600
Das heißt also, wir haben Gleichheit, 2.

11:48.760 --> 11:49.980
Stufe heißt immer Gleichheit 1.

11:50.080 --> 11:50.440
oder 0.

11:50.520 --> 11:54.440
Stufe oder wir schauen uns die Attribute an und sagen dann, uns sind

11:54.440 --> 11:57.760
diese Dinge zwar nicht identisch, aber gleich nach 1.

11:57.880 --> 11:59.800
Stufe, dann haben wir Gleichheit 2.

11:59.960 --> 12:00.120
Stufe.

12:00.560 --> 12:05.400
Das ist ein bisschen umständlich, aber wenn ich also jetzt hergehe und

12:05.400 --> 12:10.920
eine Klasse bilden würde, die heißt Apfeltüte und dieser Apfeltüte

12:10.920 --> 12:15.380
drei Äpfel reingeben würde und ein zweites Objekt Apfeltüte machen

12:15.380 --> 12:20.680
würde, ebenfalls mit drei Objekten, mit drei Äpfeln, dann wären die

12:20.680 --> 12:24.200
Apfeltüten 1 und die Apfeltüte 2 gleich in 2.

12:24.380 --> 12:30.960
Stufe, wenn die Äpfel, die da drin sind, gleich sind 1.

12:31.100 --> 12:31.440
Stufe.

12:31.440 --> 12:34.920
Das heißt wiederum, ich kann jeweils zum ersten Apfel da einen ersten

12:34.920 --> 12:37.760
Apfel in der anderen Tüte finden und sagen, die sind gleich auf 1.

12:37.860 --> 12:41.120
Stufe, das heißt, deren Attributwerte sind identisch.

12:42.480 --> 12:44.480
Sie sehen schon, es geht jetzt weiter hoch.

12:45.160 --> 12:47.840
In der Praxis für den Programmierer ist das sogar wichtig.

12:48.420 --> 12:51.160
Wir haben vorhin gerade gesehen, die Identität versus Gleichheit ist

12:51.160 --> 12:51.840
schon mal wichtig.

12:53.120 --> 12:59.720
Aber natürlich kann es jetzt sein, dass wir Klassen bilden, deren

12:59.720 --> 13:02.360
Attribute selbst Objekte sind.

13:03.320 --> 13:06.480
Und dann trifft die Frage Gleichheit zweiter Stufe auf.

13:08.240 --> 13:11.860
Wenn die eingebetteten Objekte selbst wieder Objekte und die wieder

13:11.860 --> 13:14.800
Objekte und die wieder und wieder und wieder Objekte enthalten bis zur

13:14.800 --> 13:17.080
enden Stufe, dann brauche ich Gleichheit ender Stufe.

13:18.360 --> 13:20.880
In der Praxis werden wir oftmals unterscheiden zwischen der

13:20.880 --> 13:26.000
sogenannten Identität, der Gleichheit erster Stufe, wo ich zwei Dinge

13:26.000 --> 13:29.860
hernehme und sage, wenn alles gleich ist in den Attributwerten,

13:31.200 --> 13:35.320
abgesehen von Objekten, die vielleicht da noch drin stecken, dann habe

13:35.320 --> 13:38.320
ich die sogenannte Gleichheit erster Stufe, beziehungsweise auch, das

13:38.320 --> 13:40.340
nennt man auch seichte Gleichheit.

13:40.980 --> 13:44.560
Oder ich sage, was immer ich an Objekten dranhängen habe, die will ich

13:44.560 --> 13:46.420
auch noch vergleichen attributweise.

13:47.920 --> 13:50.760
Und wenn dieses ganze Netz, das von dem einzelnen Objekt her weg

13:50.760 --> 13:54.580
dranhängen kann, auch gleich ist, dann spreche ich von Gleichheit

13:54.580 --> 13:55.220
ender Stufe.

13:56.300 --> 14:01.460
Oft müssen wir solche Vernetzungen von Objekten tatsächlich auf ihre

14:01.460 --> 14:04.500
Gleichheit prüfen, nicht nur das Einzelobjekt.

14:07.480 --> 14:08.820
Gibt es dazu Fragen?

14:13.080 --> 14:13.400
Ja, bitte.

14:22.310 --> 14:23.610
Es ist ein und das gleiche Objekt.

14:27.970 --> 14:29.770
Ich spreche von einem identischen Objekt.

14:31.010 --> 14:36.010
Konkret, programmiersprachlich getroffen, Sie haben zwei Variablen, V1

14:36.010 --> 14:37.910
und V2 vom Typ Person.

14:38.370 --> 14:42.610
Die verweisen beide auf den gleichen Instanz einer Person, sagen wir

14:42.610 --> 14:43.150
den Tichy.

14:44.390 --> 14:49.410
Dann haben Sie zwei Variablen, die bezeichnen das ein und dasselbe

14:49.410 --> 14:49.770
Objekt.

14:49.970 --> 14:52.070
Das ist Identität oder Gleichheit nullter Stufe.

14:52.530 --> 14:54.270
Ja, natürlich bleibt Ihnen nichts anderes übrig.

14:55.210 --> 14:57.790
Aber es ist mehr als das, es ist genau das gleiche.

15:00.860 --> 15:03.220
Also keine Kopie, sondern identisch.

15:03.220 --> 15:06.760
Ich kann natürlich von der Person eine Kopie anlegen, eine zweite

15:06.760 --> 15:10.380
Instanz und das per Klon-Operation erzeugen, dann hätte ich Gleichheit

15:10.380 --> 15:10.980
erster Stufe.

15:15.340 --> 15:16.160
Weitere Fragen?

15:23.080 --> 15:26.380
Okay, das wäre also Gleichheit dritter Stufe, geht dann ähnlich, das

15:26.380 --> 15:29.460
wird dann langweilig, aber das rekursiert dann halt.

15:31.260 --> 15:34.200
Wie gesagt, für uns ist eben Interessant Gleichheit nullter Stufe,

15:34.300 --> 15:37.120
Gleichheit erster Stufe und Gleichheit beliebig tiefer Stufe.

15:37.120 --> 15:40.860
Wenn wir also das ganze Netz von Objekten, die von zwei Objekten aus

15:40.860 --> 15:44.180
erreichbar sind, vergleichen.

15:46.920 --> 15:50.720
Als nächstes brauchen wir, also was heute noch auf dem Plan steht, ist

15:50.720 --> 15:53.480
natürlich auch erstmal die Definition des Zustands, das ist nicht

15:53.480 --> 15:57.060
schwierig, dann die Assoziationen, die Assoziationen werden uns etwas

15:57.060 --> 15:57.820
länger beschäftigen.

16:00.680 --> 16:05.320
Häufig wird der Zustand bezeichnet als die Anzahl der Bits, also die

16:05.320 --> 16:07.560
Folge aller Bits, die einem Objekt gespeichert sind.

16:07.660 --> 16:12.100
Wenn da also 32 Bit-Ganzzahlen, zwei Stück davon sind, ist der Zustand

16:12.100 --> 16:13.840
des Objektes 64 Bit.

16:14.900 --> 16:16.480
Das ist aber die Hardware-Sicht.

16:16.620 --> 16:21.640
Wenn ich also im Geschäft wäre, Speicherchips zu verkaufen, dann würde

16:21.640 --> 16:23.400
ich das als den Zustand betrachten.

16:24.320 --> 16:29.120
Wir benutzen aber eine etwas raffiniertere Definition von Zustand.

16:30.580 --> 16:35.600
Zum Beispiel denken Sie an eine Ampel, die Sie als ein Objekt angelegt

16:35.600 --> 16:42.520
haben, die hat natürlich mehrere Zustände, Rot, Grün, Gelbrot und

16:42.520 --> 16:43.400
Gelb.

16:45.240 --> 16:49.340
Und unter Umständen noch einen Zähler, der Zähler gibt mir nur die

16:49.340 --> 16:50.280
Betriebsstunden an.

16:52.160 --> 16:57.120
Für den Zustand der Ampel, wie sie reagiert auf das Umschalten, sagen

16:57.120 --> 17:00.840
wir nach einem Zeitintervall, ist die Anzahl der Betriebsstunden

17:00.840 --> 17:01.580
unerheblich.

17:04.560 --> 17:07.960
Der Hardware-Orientierte würde sagen, die Betriebsstunden muss ich ja

17:07.960 --> 17:08.700
auch abspeichern.

17:08.840 --> 17:09.460
Stimmt natürlich.

17:10.620 --> 17:16.060
Aber wir sagen nämlich, der Zustand ist folgendes, ein Zustand ist

17:16.060 --> 17:20.660
folgendes, solange sich ein Objekt in einem Zustand befindet, reagiert

17:20.660 --> 17:23.880
es im gleichen Aufruf- und Verwendungskonzept immer gleich auf seine

17:23.880 --> 17:24.300
Umwelt.

17:25.440 --> 17:28.320
Reagieren heißt, wenn ich dem eine Botschaft schicke oder eine Methode

17:28.320 --> 17:32.520
aufrufe oder einen Wert abfrage, das ist die Reaktion.

17:33.800 --> 17:40.000
Und solange ein Objekt eben immer gleich reagiert, ist es in einem

17:40.000 --> 17:41.040
bestimmten Zustand.

17:41.980 --> 17:43.260
Denken wir an die Ampel.

17:46.960 --> 17:52.400
Wenn die Ampel im Zustand grün ist und die Grünperiode ist vorbei, der

17:52.400 --> 17:56.480
Ablauf dieser Zeitspanne verursacht ein Ereignis, das sagt jetzt

17:56.480 --> 17:59.540
umschalten, was passiert als nächstes?

17:59.680 --> 18:01.540
Das Ding geht auf gelb-rot.

18:03.180 --> 18:04.580
Und danach geht es auf rot.

18:05.340 --> 18:11.220
Und das ist völlig unabhängig davon, welche Betriebsstunden in der

18:11.220 --> 18:12.480
Zwischenzeit abgelaufen sind.

18:12.900 --> 18:21.260
Die Ampel reagiert immer gleich nach Ablauf eines Zeitintervalls, wird

18:21.260 --> 18:24.220
im grünen Zustand immer auf den nächsten gewechselt.

18:24.560 --> 18:27.100
Das ist bei der Ampel ziemlich einfach, weil es nur Zustandswechsel

18:27.100 --> 18:31.280
gibt, aber es kann auch sein, dass ich mir Programme baue, die so

18:31.280 --> 18:38.540
einen Zustand haben und dann, wenn ich Methoden aufrufe und ich bin in

18:38.540 --> 18:41.240
einem und demselben Zustand, bekomme ich immer das gleiche Ergebnis.

18:42.220 --> 18:43.700
Dann spreche ich von einem Zustand.

18:50.070 --> 18:55.350
Also hier gibt es dann noch, zum Vergleich immer so diese hanebüchenen

18:55.350 --> 18:56.150
Definitionen.

19:06.190 --> 19:11.010
Die Ampel wartet immer auf ein Ereignis, nämlich egal in welchem

19:11.010 --> 19:12.350
Zustand sie ist.

19:12.790 --> 19:16.230
Im rot-gelb oder was weiß ich, ist der Zustand immer, sie wartet

19:16.230 --> 19:16.550
immer.

19:17.110 --> 19:19.810
Mit Zustand erstmal ist das viel zu ungenau.

19:22.970 --> 19:28.850
Satisfy some condition, das könnte man noch durchgehen lassen oder

19:28.850 --> 19:30.610
eine Aktivität durchführen.

19:30.730 --> 19:34.490
Naja, das macht sie wohl, die Ampel hier nicht besonders viel, außer

19:34.490 --> 19:36.930
leuchten, aber das macht sie ja in jedem Zustand, nicht?

19:37.930 --> 19:41.470
Also wir brauchen die obere Definition, die ist die korrekte.

19:42.270 --> 19:45.430
Die Außenansicht, die sagt nicht, wie das codiert ist und wie viel Bit

19:45.430 --> 19:48.850
ich dafür brauche, sie sagt nur, ich bin in Zustand A, wenn ich immer

19:48.850 --> 19:51.670
diese Operationsergebnisse liefere, bin ich in Zustand B, wenn ich

19:51.670 --> 19:52.810
folgende Ergebnisse liefere.

19:53.610 --> 19:58.210
Wir werden später noch genauer sehen, wie man Zustände geschickt

19:58.210 --> 20:05.010
umsetzt, wir werden sogar mehrere Methoden sehen, wie man den Zustand

20:05.010 --> 20:05.790
implementiert.

20:08.810 --> 20:14.150
Wir können zunächst mal eine dedizierte Variable nehmen, bei der Ampel

20:14.150 --> 20:18.630
könnte das einfach die Farbe sein oder ein aufgezählter Typ, das wäre

20:18.630 --> 20:19.290
eine Möglichkeit.

20:20.110 --> 20:24.450
Oder aber es gibt andere Instanzvariablen, von denen Sie ablesen, was

20:24.450 --> 20:25.350
der Zustand ist.

20:25.850 --> 20:31.010
Zum Beispiel würden Sie sagen, ist diese Person wahlberechtigt oder

20:31.010 --> 20:33.050
nicht, da könnte ich natürlich ein Bit anlegen, das sagt

20:33.050 --> 20:34.530
Wahlberechtigung, ja oder nein.

20:34.970 --> 20:40.370
Oder aber Sie sagen, was ist das Alter der Person, ist sie 18 oder 21,

20:40.370 --> 20:44.190
ist sie für eine bestimmte Wahl zulässig, dann leite ich den Zustand

20:44.190 --> 20:46.410
ab aus anderen Variablenwerten.

20:46.690 --> 20:47.650
In diesem Fall ist es Alter.

20:57.570 --> 21:00.650
Das Kapselungsbezieb ist eigentlich auch nichts mehr Neues für Sie,

21:00.870 --> 21:04.430
nach dem Programmieren Vorlesungen, das sagt natürlich, dass der

21:04.430 --> 21:07.990
Zustand eines Objektes zwar von außen hin sichtbar ist, ich kann

21:07.990 --> 21:10.470
beobachten, in welchem Zustand sich das Objekt befindet,

21:11.170 --> 21:14.710
wahrscheinlich in vielerlei Art und Weise, der Zustand selbst wird im

21:14.710 --> 21:15.990
Inneren des Objektes verwaltet.

21:16.130 --> 21:20.090
Ich kann nicht hergehen und irgendwelche Bits drehen, um zu sagen,

21:20.170 --> 21:21.310
jetzt hast du den Zustand geändert.

21:28.380 --> 21:32.440
Also wenn zum Beispiel die Restzeit eines Objektes, denken wir an die

21:32.440 --> 21:37.080
Eieruhr, sich herunterzählt und sich auf Null ändert, dann ändert sich

21:37.080 --> 21:37.940
der Zustand.

21:40.480 --> 21:44.420
Also hier ist ein Beispiel der Kapselung, ein bisschen interessanter

21:44.420 --> 21:49.040
als die Eieruhr, die Fernbedienung für einen Videorekorder, sagen wir

21:49.040 --> 21:49.280
mal.

21:50.400 --> 21:53.840
Sie kämen nicht auf die Idee, den Videorekorder aufzuschrauben und

21:53.840 --> 22:00.500
drinnen auf ein paar Drähte zu verknüpfen, zu verbinden, um das Ding

22:00.500 --> 22:01.760
in Abspielmodus zu bringen.

22:01.960 --> 22:03.540
Sie wissen ja gar nicht, wie das gemacht wird.

22:03.780 --> 22:07.940
Stattdessen verlassen Sie sich darauf, dass Sie eine Fernbedienung

22:07.940 --> 22:11.280
haben, die ein Signal schickt, die diese Zustandsänderung verursacht.

22:12.000 --> 22:17.980
Und ein Teil des Zustandsdiagrammes dieses Gerätes ist natürlich, erst

22:17.980 --> 22:22.620
mal nach dem Start im Grundzustand zu sein, beim Drücken des

22:22.620 --> 22:27.360
Abspielknopfes in den Zustand abspielen zu gelangen, danach mit Pause

22:27.360 --> 22:29.940
in den Zustand warten und von warten wieder zurück in Abspielen.

22:32.680 --> 22:35.720
Das wäre also ein Automat mit drei, das sind natürlich mehr, weil man

22:35.720 --> 22:37.860
auch noch Vor- und Zurückspielen hätte.

22:45.110 --> 22:48.330
Man spricht eben oft in der objektorientierten Programmierung auch

22:48.330 --> 22:50.970
davon, an ein Objekt eine Nachricht zu schicken.

22:53.210 --> 22:57.670
Das soll also nur betonen, dass ein bestimmtes Objekt, nämlich gerade

22:57.670 --> 23:00.390
derjenige, der eine Nachricht empfängt, aufgefordert wird, seinen

23:00.390 --> 23:01.250
Zustand zu ändern.

23:02.150 --> 23:05.550
Wenn Sie also den Zustand Play schicken an den Spieler, dann heißt

23:05.550 --> 23:09.630
das, ändere deinen Zustand in den Zustand Abspielen.

23:13.990 --> 23:16.250
Der Nachrichtenaustausch und der Methodenaufruf sind also in diesem

23:16.250 --> 23:19.650
Fall an einem bestimmten Objekt synonym.

23:22.810 --> 23:24.430
Gut, also das können wir jetzt.

23:26.690 --> 23:29.130
Methoden ändern den Zustand eines Objektes.

23:33.690 --> 23:36.470
Wenn ich also einen Satz von Methoden habe, weiß ich, welche

23:36.470 --> 23:39.650
Nachrichten geschickt werden können, das sind ja die Methoden.

23:42.770 --> 23:47.030
Und es muss nicht immer der Fall sein, dass man eine Botschaft eines

23:47.030 --> 23:49.110
Objekts schicken kann in jedem Zustand.

23:50.870 --> 23:54.110
Und das spezifiziert man eben mit einem Zustandsübergangsdiagramm.

23:55.470 --> 23:56.850
Wir hatten gerade eins davon gesehen,

24:01.810 --> 24:04.690
zum Beispiel, was passiert eigentlich, wenn ich in den Zustand

24:04.690 --> 24:06.150
Abspielen nochmal Play drücke.

24:07.310 --> 24:10.870
Da müsste eigentlich ich sagen können, in diesem Zustand bin ich

24:10.870 --> 24:13.490
schon, also wenn ich jetzt nochmal Play drücke, passiert gar nichts,

24:13.610 --> 24:15.270
ich bleibe einfach in diesem Zustand.

24:15.270 --> 24:19.110
Es könnte ja auch sein, dass ich in einem Zustand bin, wo bestimmte

24:19.110 --> 24:22.830
andere Operationen nicht erlaubt sind, und das würde ich auch dann in

24:22.830 --> 24:24.470
einem Zustandsdiagramm auszeichnen.

24:31.960 --> 24:37.540
Also als Zustandsdiagramm, wenn wir jetzt an die Grundlagenvorlesung

24:37.540 --> 24:40.620
denken, ist natürlich ein endlicher Automat mit einer ähnlichen Anzahl

24:40.620 --> 24:42.580
von Zuständen und Übergängen dazwischen.

24:43.780 --> 24:48.000
Wir müssen uns, wenn wir Automaten aufstellen, immer fragen, haben wir

24:48.000 --> 24:54.000
den Automaten vollständig gebaut, das heißt, habe ich erstens alle

24:54.000 --> 24:58.320
Zustände, das ist meistens das Leichtere, aber ich muss mich in jedem

24:58.320 --> 25:03.720
Zustand auch fragen, habe ich alle möglichen Übergänge berücksichtigt.

25:04.240 --> 25:08.740
Meistens berücksichtigt man die, die einfach normal, sagen wir die

25:08.740 --> 25:12.100
fehlerfreien Übergänge sind, aber es kann sein, dass ein Übergang

25:12.100 --> 25:15.260
nicht erlaubt ist, dann muss ich sagen, was passiert jetzt.

25:16.280 --> 25:20.680
Erzeuge ich eine Ausnahme, eine Exception, erzeuge ich eine

25:20.680 --> 25:26.120
Fehlerinstanz von Java lang.error, gehe ich in einen undefinierten

25:26.120 --> 25:31.400
Zustand, ignoriere ich es oder gebe ich irgendwie eine andere

25:31.400 --> 25:32.720
Fehlermeldung heraus.

25:34.400 --> 25:39.980
Das gehört also dann zu unseren Zustandsübergangsdiagrammen dazu,

25:40.140 --> 25:42.540
insbesondere an Benutzerschnittstellen, denn da kann ich nie

25:42.540 --> 25:48.420
voraussehen, dass der Benutzer den Automaten vollständig kennt und ihn

25:48.420 --> 25:49.340
auch richtig benutzt.

25:49.480 --> 25:52.160
Das heißt, es wird Fehlbedingungen geben, Leute drücken auf den

25:52.160 --> 25:53.740
Knöpfen herum, ohne dass es Sinn ergibt.

25:54.760 --> 25:56.140
Und da muss ich aufpassen.

25:57.900 --> 25:59.640
So, jetzt werden wir noch konkreter.

26:00.200 --> 26:04.020
Wir steuern jetzt also darauf zu, diese diagrammatische Darstellung zu

26:04.020 --> 26:05.400
zeigen für Klassendiagramme.

26:06.380 --> 26:09.360
Für die Zustände brauchen wir speziell die Automaten, das sind dann

26:09.360 --> 26:11.660
sogenannte Herald-Automaten, das sind Erweiterungen von

26:11.660 --> 26:13.080
Zustandsübergangsautomaten.

26:13.940 --> 26:17.200
Das kommt noch, aber jetzt wollen wir erstmal noch die Klassennotation

26:17.200 --> 26:17.560
nehmen.

26:18.440 --> 26:22.380
Bei einer Methodensignatur, auch in UML, brauchen wir natürlich genau

26:22.380 --> 26:25.560
das Gleiche, was wir in Java auch haben, nämlich einen Namen, einen

26:25.560 --> 26:28.840
Rückgabetyp und eine Parameterliste.

26:30.340 --> 26:32.840
Die wird nur ein klein bisschen anders geschrieben.

26:33.580 --> 26:35.840
Es ist klar, dass die Parameter die Nutzerdaten enthalten.

26:37.860 --> 26:42.460
Übrigens, wenn Sie eine Methode an ein Objekt schicken, also ein

26:42.460 --> 26:48.700
Objekt, Person, P1 Punkt, ist wahlberechtigt.

26:48.700 --> 26:52.580
Sie stellen die Anfrage ist wahlberechtigt an die Person, die liefert

26:52.580 --> 26:54.280
zunächst mal anscheinend keinen Parameter.

26:54.880 --> 26:59.040
In Wirklichkeit aber doch, denn Sie können sagen, die Funktion ist

26:59.040 --> 27:01.100
wahlberechtigt, hat einen Nulltenparameter.

27:01.560 --> 27:04.160
Und das ist das Objekt, an dem es ausgeführt werden soll.

27:05.180 --> 27:11.240
In der Tat übersetzen Compiler in der Regel Methodenaufrufe der Form

27:11.240 --> 27:18.000
Objekt Punkt Methodenname in Methodenname, Klammer auf, erstes Objekt.

27:18.300 --> 27:22.180
Erster Parameter oder Nulltenparameter ist das Objekt selbst.

27:28.820 --> 27:31.980
Und in OML wird es leider ein bisschen verdreht gezeigt.

27:32.400 --> 27:35.900
Sie wissen, in Java haben Sie Methodennamen, Parameterliste und der

27:35.900 --> 27:38.900
Rückgabetyp würde hier stehen, bei OML steht es auf der anderen Seite.

27:39.620 --> 27:41.700
Das ist dann konsistent mit der Parameterliste.

27:41.800 --> 27:44.520
Die Parameterliste sagt, Attributname gefolgt vom Typ.

27:44.520 --> 27:48.940
In Java ist es gerade andersrum, kommt erst Int und dann sagen wir der

27:48.940 --> 27:49.580
Parametername.

27:51.900 --> 27:53.840
Und natürlich gibt es beliebig viele davon.

27:54.060 --> 27:56.520
Die Parameterliste kann selbstverständlich auch leer sein.

27:59.320 --> 28:00.640
Und die steht in Klammern.

28:01.160 --> 28:03.260
So, und jetzt kommen wir endlich zu den eigentlichen

28:03.260 --> 28:04.220
Klassendiagrammen.

28:05.440 --> 28:06.780
Was ist jetzt dieses OML?

28:07.000 --> 28:10.840
Das ist Kurzform für Unified Modeling Language.

28:10.840 --> 28:14.660
Wenn Sie den Standard lesen wollen, gibt es auf dem Internet.

28:15.940 --> 28:18.500
Nehmen Sie einfach nur OML ein oder Unified Modeling Language, da

28:18.500 --> 28:19.300
kommen Sie sicher hin.

28:19.400 --> 28:20.620
Das ist ein ewig langer Standard.

28:22.140 --> 28:24.000
Wir machen auch hier nur Auszüge daraus.

28:24.140 --> 28:27.900
Erfunden ist er von drei Leuten, da heißen manchmal die drei Amigos,

28:28.660 --> 28:31.820
von einem gewissen Hooch, Jacobson und Rombau.

28:31.880 --> 28:34.900
Die hatten alle drei unabhängig voneinander Notationen für

28:34.900 --> 28:38.480
Klassenhierarchien, für objektorientiertes Programmieren sich

28:38.480 --> 28:39.100
ausgedacht.

28:39.940 --> 28:46.580
Und haben sich dann irgendwann mal zusammengefunden und eine Unified,

28:46.720 --> 28:51.440
eine Vereinigungsmenge ihrer Sprachideen gebaut.

28:52.060 --> 28:52.960
Und die heißt jetzt OML.

28:56.100 --> 28:58.820
Eine Klasse wird gezeichnet als ein Kasten.

28:59.580 --> 29:03.200
Bei der NEXT, der Kasten hat drei Abteilungen, oben steht der

29:03.200 --> 29:03.760
Klassenname.

29:04.560 --> 29:05.740
Dann kommen die Attribute.

29:05.740 --> 29:09.620
Die Attribute sind so, wie ich gesagt habe, Name und gefolgt von Typ.

29:10.320 --> 29:11.440
Und dann kommen die Methoden.

29:12.020 --> 29:15.660
Methoden sind natürlich die Namen, gefolgt vom Rückgabetyp, wenn es

29:15.660 --> 29:17.740
einen gibt, oder den Parametern.

29:18.020 --> 29:22.220
Parameter, wie gesagt, umgedreht gegenüber Java, können natürlich auch

29:22.220 --> 29:25.700
keinen Parameter enthalten und auch keinen Rückgabetyp.

29:28.460 --> 29:32.620
Diese drei Blöcke, zwei davon können fehlen.

29:32.620 --> 29:35.380
Sie brauchen immer den Klassennamen, aber vielleicht gibt es keine

29:35.380 --> 29:37.240
Attribute, die nach außen sichtbar sind.

29:38.320 --> 29:41.120
Vielleicht gibt es Attribute, aber keine Methoden.

29:41.780 --> 29:43.560
Dann kann auch diese Abteilung leer sein.

29:44.200 --> 29:47.280
Oder aber beide Abteilungen sind leer, dann gibt es nur den

29:47.280 --> 29:47.900
Klassennamen.

29:48.760 --> 29:49.620
Das ist also erlaubt.

29:51.160 --> 29:54.620
Hier ist ein Beispiel für eine Objektinstanz.

29:57.560 --> 30:00.540
Nehmen wir an, wir haben diese Klasse Kreis.

30:01.320 --> 30:04.820
Die Kreise haben hier Radius, X- und Y-Koordinaten für den

30:04.820 --> 30:05.440
Mittelpunkt.

30:07.720 --> 30:11.220
Es gibt einen Initialwert, den kann man auch angeben, der wäre in

30:11.220 --> 30:11.900
diesem Fall 0.

30:12.380 --> 30:14.860
Dann gibt es Funktionen oder Methoden, die heißen Anzeigen,

30:14.940 --> 30:16.060
Verstecken, Vergrößern.

30:17.600 --> 30:19.620
Wir haben also drei Methoden, drei Attribute.

30:21.680 --> 30:24.620
Jetzt möchte man aber auch nicht nur die Klassen malen können, sondern

30:24.620 --> 30:26.300
auch die Instanzen selbst.

30:26.960 --> 30:30.000
Die werden auch als Rechtecke gezeichnet.

30:31.500 --> 30:37.320
Und da gibt man in der Tat dann nur noch an, den Typ oder den

30:37.320 --> 30:41.400
Klassennamen, mit dem Doppelpunkt davor, und den Namen des Objektes.

30:42.240 --> 30:45.740
Das könnte zum Beispiel die Variable sein, in der ein Verweis auf

30:45.740 --> 30:50.380
dieses Objekt gespeichert wird, und den Wert der Attribute.

30:51.080 --> 30:53.640
Die Methoden brauche ich natürlich nicht zu wiederholen, denn die sind

30:53.640 --> 30:54.380
für alle gleich.

30:57.060 --> 31:00.580
Ferner kann ich so einen gestrichelten Pfeil angeben, gestrichelten

31:00.580 --> 31:02.120
Pfeil mit offenem Kopf hier.

31:02.400 --> 31:05.420
Der Kopf, wenn er geschlossen ist, bedeutet wieder etwas anderes.

31:06.100 --> 31:10.840
Aber dieser gestrichelte Pfeil bedeutet, mein K1 Doppelpunktkreis ist

31:10.840 --> 31:15.240
ein Instanz oder ein Exemplar von der Klasse Kreis.

31:19.640 --> 31:20.760
Was haben wir noch?

31:21.640 --> 31:25.780
Ich kann einen Kreis auch nur so angeben, indem ich seinen Typ

31:25.780 --> 31:31.480
weglasse, dann brauche ich aber unbedingt den Verweis auf die Klasse,

31:31.800 --> 31:32.720
wenn ich das malen will.

31:35.560 --> 31:38.920
Wenn Sie sagen wollen, ich brauche überhaupt den Namen des Kreises gar

31:38.920 --> 31:41.900
nicht wissen, dann mache ich irgendwie ein Geflecht von Objekten und

31:41.900 --> 31:43.860
dann müsste ich die einzelnen Objekte nicht zuweisen, dann sage ich

31:43.860 --> 31:47.300
einfach nur, der Name ist mir egal, das ist anonym, aber ich brauche

31:47.300 --> 31:48.120
wenigstens den Typ.

31:48.120 --> 31:52.000
Und in diesem Fall habe ich sogar auch noch die Attribute weggelassen.

31:52.540 --> 31:54.540
Also alle diese Notationen sind erlaubt.

31:56.020 --> 31:59.120
Sie müssen sich nur klar sein, dass es ein Unterschied ist zwischen

31:59.120 --> 32:02.420
der Klasse und den Objekten.

32:03.400 --> 32:08.560
Die Klasse ist wie gesagt die Kategorie, die mir angibt, was alles in

32:08.560 --> 32:09.360
dieser Menge gehört.

32:10.800 --> 32:14.960
Und wie gesagt, alle Objekte, die mindestens diese drei Attribute

32:14.960 --> 32:19.820
haben und diese drei Methoden, gehören zu dieser Klasse.

32:22.200 --> 32:28.020
In der UML, wie auch in Java, wird also ganz deskriptiv gesagt, was zu

32:28.020 --> 32:28.920
einer Klasse gehört.

32:29.940 --> 32:32.240
Nämlich aufgrund der Attribute und Methoden.

32:36.300 --> 32:38.620
Vererbung hatten wir noch nicht, aber dazu kommen wir auch noch, die

32:38.620 --> 32:40.120
wird auch grafisch angezeigt.

32:42.200 --> 32:45.240
Aber zunächst kommen jetzt die sogenannten Assoziationen.

32:45.240 --> 32:50.040
Die Assoziationen sind zunächst vielleicht ein bisschen verwirrend,

32:50.160 --> 32:51.440
aber ich versuche das zu vermeiden.

32:52.560 --> 32:54.140
Angenommen, wir haben zwei Klassen.

32:55.140 --> 32:57.460
Eine Klasse Firma und eine Klasse Person.

32:58.640 --> 33:01.640
Die Firma hat einen Namen und eine Adresse und die Person hat einen

33:01.640 --> 33:01.900
Namen.

33:02.940 --> 33:05.560
Und jetzt würden wir gerne etwas über diese beiden Klassen sagen.

33:05.660 --> 33:08.680
Wohlgemerkt, das sind nicht Personen, sondern Mengen von Personen.

33:09.060 --> 33:09.760
Das ist ja eine Klasse.

33:10.620 --> 33:15.840
Wir würden gerne sagen, die Person hat einen Arbeitgeber, das ist eine

33:15.840 --> 33:16.120
Firma.

33:17.920 --> 33:23.900
Und gleichzeitig möchten wir sagen, wenn mehrere Personen in der Firma

33:23.900 --> 33:27.560
arbeiten können, dann müsste ich sowas haben wie Liste Person oder

33:27.560 --> 33:32.480
irgendwie einen Containerdatentypen, in dem ich die Angestellten

33:32.480 --> 33:33.180
speichere.

33:34.060 --> 33:36.120
Aber das will ich auf der Ebene nicht sagen.

33:36.200 --> 33:38.660
Ich will nicht entscheiden müssen, ob ich eine Liste oder ein Feld

33:38.660 --> 33:41.260
habe oder eine Menge oder ein Map oder sonst was.

33:41.700 --> 33:43.140
Das sollen die Implementiere entscheiden.

33:43.240 --> 33:49.060
Ich will nur sagen, ich brauche eine Relation zwischen Firmen und

33:49.060 --> 33:53.040
Personen, die mir die Zugehörigkeit von Personen zu Firmen angibt.

33:54.020 --> 33:57.740
Und dazu nimmt man die sogenannten Assoziationen.

33:58.680 --> 34:00.700
Dieses wie drückt man das Zusammengehören aus.

34:01.420 --> 34:06.900
Und zwar wird das im Englischen eine Association genannt und wird nur

34:06.900 --> 34:10.700
durch einen Strich zwischen diesen beiden Klassen angezeigt und mit

34:10.700 --> 34:15.960
bestimmten Annotationen an dem Strich, der uns etwas genaueres über

34:15.960 --> 34:17.140
die Relation sagt.

34:17.360 --> 34:18.760
Der sagt also jetzt folgendes.

34:19.560 --> 34:22.520
Zwischen der Firma und der Person gibt es eine Relation,

34:27.170 --> 34:28.970
die heißt arbeitet bei.

34:29.950 --> 34:31.330
Den Stern erkläre ich gleich.

34:31.470 --> 34:37.690
Der Stern sagt, die Relation arbeitet bei kann so sein, dass für eine

34:37.690 --> 34:41.630
bestimmte Firma es gar keine Angestellten gibt oder beliebig viele.

34:43.690 --> 34:47.790
Während eine Person, weil hier nichts steht, da steht eine Implizite

34:47.790 --> 34:51.410
1, die sagt, eine Person darf, jedenfalls in diesem Modell, für

34:51.410 --> 34:55.350
maximal eine Firma, Entschuldigung, genau eine Firma arbeiten.

35:00.930 --> 35:03.810
Das heißt also, wenn Sie sich jetzt ein Klassendiagramm anschauen,

35:04.290 --> 35:07.070
dann könnte man sagen, das ist natürlich ein Graph, das ist ein

35:07.070 --> 35:09.290
Knoten, das ist auch ein Knoten, das ist eine Kante.

35:10.170 --> 35:11.670
Das ist also ein Graph.

35:12.250 --> 35:16.970
Genau genommen sind UML Klassendiagramme Multigraphen, weil es erlaubt

35:16.970 --> 35:20.730
ist, mehrere Kanten hier zwischen Firma und Person einzuführen.

35:22.190 --> 35:26.630
Zum Beispiel könnte eine weitere Kante heißen, besitzt, Besitzer von,

35:27.090 --> 35:27.830
Besitzer der Firma.

35:28.230 --> 35:29.630
Das ist auch zwischen Firma und Person.

35:30.390 --> 35:31.650
Und eine zusätzliche Kante.

35:32.470 --> 35:38.530
Und wenn Sie einen Graphen haben, wenn in dem zwischen zwei gegebenen

35:38.530 --> 35:42.470
Knoten mehr als eine Kante sitzt, dann haben Sie einen sogenannten

35:42.470 --> 35:43.110
Multigraph.

35:44.830 --> 35:46.770
Hat Schäfer ja zum Beispiel auch so eine.

35:49.610 --> 35:52.970
Was ist jetzt der semantische Mehrwert der Assoziation?

35:53.070 --> 35:59.470
Die Assoziation sagt uns in einer abstrakten Art und Weise, wie sich

35:59.470 --> 36:01.030
diese Relationen ändern dürfen.

36:03.090 --> 36:10.810
Zum einen heißt es, ich fordere dieses Transaktionsprinzip für

36:10.810 --> 36:16.090
Änderungen der Relationen und das sagt, dass Änderungen entweder ganz

36:16.090 --> 36:18.050
oder gar nicht durchgeführt werden.

36:18.190 --> 36:24.430
Das heißt also, ich sollte nie den Verweis auf die Person bei der

36:24.430 --> 36:29.350
Firma als Angestellter löschen, aber bei der Person vergessen, den

36:29.350 --> 36:31.810
Rückverweis auf die Firma auch zu löschen.

36:32.750 --> 36:36.570
Sonst spreche ich hier von entweder korrigieren wir, zum Beispiel

36:36.570 --> 36:39.610
löschen wir oder fügen ein eine neue Relation ganz, vollständig und

36:39.610 --> 36:40.930
richtig oder gar nicht.

36:41.430 --> 36:42.970
Das nennt man die Atomicität.

36:45.310 --> 36:48.890
Konsistenz heißt, die Änderungsvorgänge hinterlassen einen

36:48.890 --> 36:50.070
konsistenten Zustand.

36:50.270 --> 36:57.890
Das heißt, die Firma sagt, P1 ist bei mir angestellt und P1 sagt, aber

36:57.890 --> 36:59.350
ich bin bei einer anderen Firma angestellt.

37:01.050 --> 37:06.470
Isolation, das heißt, diese Änderungen laufen vollständig ab, ohne

37:06.470 --> 37:09.610
Beeinflussung durch andere Ausführungsfäden, durch parallel laufende

37:09.610 --> 37:10.670
andere Programme.

37:11.430 --> 37:15.650
Und Durability oder Dauerhaftigkeit heißt, nach Abschluss einer

37:15.650 --> 37:25.210
automatischen Änderung, ist die Änderung für alle beteiligten

37:25.210 --> 37:27.990
Programmkomponenten dauerhaft zu beobachten.

37:29.230 --> 37:31.110
Das nennt man das ACID-Prinzip.

37:33.050 --> 37:37.090
Atomar, konsistent, isoliert voneinander und dauerhaft.

37:39.650 --> 37:43.910
Also ein Beispiel wäre, wo es nicht so richtig klappt, wir haben diese

37:43.910 --> 37:46.930
Relation zwischen zwei Objekten in diesem Fall.

37:46.930 --> 37:53.530
Das wird jetzt umgewandelt, sodass ich hier die Kante lösche und ein

37:53.530 --> 37:58.410
weiteres Objekt verknüpfe damit in der Relation und dann einen

37:58.410 --> 38:00.550
Rückverweis natürlich hier einführen muss.

38:01.190 --> 38:04.870
Aber jetzt ist die Frage, was ist eigentlich mit dem?

38:05.950 --> 38:09.170
Bleibt diese Kante bestehen oder will ich sie löschen?

38:09.170 --> 38:10.750
Natürlich müsste ich sie löschen.

38:14.410 --> 38:19.890
Ohne diese Löschung entstünde ein inkonsistenter Zustand.

38:20.770 --> 38:25.410
Und da hätten wir also das Beispiel der Konsistenz, der Atomicität,

38:25.530 --> 38:29.230
ist, dass diese Änderung in der Regel dann durchgeführt werden muss

38:29.230 --> 38:33.210
mit einer sogenannten Sperre, wenn ich parallel programmiere, sodass

38:33.210 --> 38:38.730
nicht zwei Methoden gleichzeitig hier in diesem Paar etwas ändern und

38:38.730 --> 38:44.370
damit einen seltsamen Zwischenzustand hinterlassen.

38:45.650 --> 38:48.350
Parallelprogrammiert haben sie noch nicht, aber darüber werden wir

38:48.350 --> 38:48.990
auch noch sprechen.

38:50.130 --> 38:53.770
Bis jetzt haben sie nur sequenziellen Ablauf, da ist diese Atomicität

38:53.770 --> 38:55.390
gewissermaßen automatisch gegeben.

39:01.270 --> 39:04.230
Die heute in den Rechnern stecken, die alle gleichzeitig arbeiten

39:04.230 --> 39:08.730
könnten, auszunutzen, dann kann es zu diesen sogenannten

39:08.730 --> 39:12.750
Datenwettläufen, der gleichzeitige Zugriff auf die gleichen Daten

39:12.750 --> 39:17.370
durch mehrere Fäden, Ausführungsfäden, dazu kann es dann kommen, das

39:17.370 --> 39:20.830
müssen wir vermeiden, wenn ein inkonsistenter Zustand das Ergebnis

39:20.830 --> 39:21.430
sein könnte.

39:25.050 --> 39:29.050
So, jetzt wissen wir also mit Assoziationen, da gibt es übrigens noch

39:29.050 --> 39:32.910
mehr darüber zu sagen, diese Annotationen, die hier dran kommen, die

39:32.910 --> 39:37.730
kommen gleich, aber es ist immer die Frage, wann benutze ich ein

39:37.730 --> 39:41.850
Objekt, das ich einfach irgendwo einbaue, in ein anderes Objekt

39:41.850 --> 39:45.090
einbaue, oder wann benutze ich eine Assoziation.

39:47.350 --> 39:50.670
Zum Beispiel sagen wir hier, wir haben ein Rechteck, das Rechteck habe

39:50.670 --> 39:55.590
zwei Punkte, oben links und unten rechts, für ein achsenparalleles

39:55.590 --> 39:59.330
Rechteck reicht das, natürlich für ein irgendwie gedrehtes Rechteck

39:59.330 --> 40:03.030
würde das nicht reichen, aber nehmen wir mal an, das ist alles, was

40:03.030 --> 40:08.470
wir brauchen, dann kann ich das so in UML verwirklichen, indem ich

40:08.470 --> 40:12.150
sage, das Rechteck enthält zwei Punkte und Punkt selbst ist eine

40:12.150 --> 40:15.530
Klasse, also XY-Koordinaten.

40:16.970 --> 40:20.630
Oder aber ich sage, ein Rechteck ist ein Objekt, das hat zwei

40:20.630 --> 40:23.990
Assoziationen, die heißen oben links und unten rechts, und die gehen

40:23.990 --> 40:24.890
beide zu Punkten.

40:26.190 --> 40:31.550
Wir haben also gewissermaßen vom Rechteck einen Verweis zu einem links

40:31.550 --> 40:35.390
oben Punkt, und die enthalten meine Koordinaten.

40:36.190 --> 40:37.030
Was soll ich nehmen?

40:40.650 --> 40:44.770
Wenn ich für Änderungen eine Transaktion brauche, dann würde ich

40:44.770 --> 40:46.290
sagen, nehmen Sie eine Assoziation.

40:46.910 --> 40:50.390
Wenn Sie mehrere gegenüber haben, wie zum Beispiel hier, dann nehmen

40:50.390 --> 40:51.430
Sie eine Assoziation.

40:51.570 --> 40:54.430
Wenn Sie nur ein einzelnes Objekt brauchen, dann können Sie es stehen

40:54.430 --> 40:54.710
lassen.

40:56.210 --> 40:58.790
Muss ich vom Gegenüber zurück navigieren können?

40:59.310 --> 41:01.330
Dann würden Sie auch eine Assoziation nehmen.

41:01.330 --> 41:03.010
Das muss ich jetzt noch erklären.

41:03.770 --> 41:06.830
Angenommen, Sie haben diese Wahl getroffen.

41:09.530 --> 41:13.470
Sie sagen also gewissermaßen, ich habe ein Rechteck, das sind zwei

41:13.470 --> 41:15.130
Punktobjekte mit eingebettet.

41:15.690 --> 41:19.370
Wenn Sie jetzt dieses Punktobjekt für sich genommen bearbeitet haben,

41:20.910 --> 41:25.730
also sich den Punkt zum Beispiel verschoben haben, und Sie sagen X

41:25.730 --> 41:29.310
oder Y Richtung, und Sie wollen jetzt aus irgendeinem Grunde wissen,

41:29.310 --> 41:32.950
und zu welchem Objekt gehöre ich, dann wäre das eine Navigation zurück

41:32.950 --> 41:35.070
zu dem umfassenden Objekt.

41:35.730 --> 41:40.630
In diesem Objektpunkt ist aber keinerlei Vaterschaftszeiger nach oben,

41:40.690 --> 41:42.930
gewissermaßen, wo gehöre ich dazu, vorhanden.

41:43.490 --> 41:45.450
Das heißt, Sie können nicht navigieren normalerweise.

41:47.170 --> 41:50.410
Man kann sich zwar behelfen und diese Information anderweitig sich

41:50.410 --> 41:55.330
merken, in Hilfsvariablen, aber zunächst mal ist in keinem Punkt eine

41:55.330 --> 41:57.870
Information darüber vorhanden, wo er hingehört.

41:58.030 --> 42:01.410
Ob er jetzt zu einem Rechteck gehört oder zu einem Kreis oder zu einer

42:01.410 --> 42:03.930
Ellipse oder was weiß ich, oder zu einem Dreieck.

42:06.210 --> 42:09.970
Wenn Sie aber die Rückwärtsnavigation haben wollen, dann brauchen Sie

42:09.970 --> 42:10.890
die Assoziation.

42:11.210 --> 42:13.770
Die sorgt nämlich dafür, dass Sie natürlich vom Punkt auch sagen

42:13.770 --> 42:17.670
können, ich gehöre zu diesem Rechteck, zu einem ganz bestimmten

42:17.670 --> 42:18.070
Rechteck.

42:19.970 --> 42:21.730
Sonst haben Sie eigentlich freie Wahl.

42:21.730 --> 42:27.870
Ein guter Stil und eigentlich der Stil, der von Java sowieso immer

42:27.870 --> 42:29.270
erzwungen ist.

42:29.390 --> 42:32.090
Sie können diese Einbetten in Java eigentlich nicht machen.

42:32.210 --> 42:33.810
Sie können nur mit Verweisen arbeiten.

42:34.630 --> 42:36.690
Aber in UML gibt es zumindest diese Möglichkeit.

42:36.870 --> 42:38.550
Und in anderen Programmiersprachen gibt es die auch.

42:39.350 --> 42:40.370
Das sagen wir einfach sonst.

42:40.650 --> 42:44.610
Sonst haben Sie eigentlich freie Wahl, aber am besten ist es, die

42:44.610 --> 42:47.970
Objekte, die Sie hier einpassen oder die Attribute, die Sie hier in

42:47.970 --> 42:52.150
ein Objekt einsetzen, direkt, sind nur die primitiven Typen, Int,

42:52.170 --> 42:53.430
Float, String, Bool und so weiter.

42:55.510 --> 43:00.770
Und alles andere, was größer ist, das nehmen Sie per Assoziation mit

43:00.770 --> 43:01.010
dazu.

43:03.250 --> 43:06.210
Das ist eine einfache Regel, mit der kann man eigentlich ganz gut

43:06.210 --> 43:06.490
leben.

43:08.690 --> 43:13.950
So, das war also eine der Überlegungen, wie man modelliert.

43:14.130 --> 43:17.050
Wir sind ja jetzt in der UML-Welt, wir denken zwar immer darüber nach,

43:17.050 --> 43:21.610
wie wir das eigentlich in Java implementieren müssten, aber UML

43:21.610 --> 43:23.910
zunächst einmal kann ich auch dazu benutzen, andere

43:23.910 --> 43:28.910
Programmiersprachen als Zielsprache vorzusehen.

43:29.590 --> 43:33.830
Das darf durchaus Ithon oder C++ oder C Sharp oder sonst was sein.

43:34.330 --> 43:35.650
Oder auch sogar reines C.

43:38.830 --> 43:40.130
So, jetzt.

43:40.330 --> 43:42.910
Ich sagte vorhin so schnell, eine Assoziation beschreibt eine

43:42.910 --> 43:43.410
Relation.

43:43.410 --> 43:47.230
Wir erklären jetzt genau, was man sich mit einer Relation meint.

43:48.930 --> 43:54.550
Eine Relation ist einfach nur, sagen wir eine binäre Relation, ist das

43:54.550 --> 43:57.830
kathesische Produkt der beiden Mengen, die durch die Klassen

43:57.830 --> 43:58.470
beschrieben werden.

43:58.890 --> 44:02.610
Also Sie haben Firma, das ist eine Klasse.

44:02.930 --> 44:05.670
Sie haben Personen, das ist Person, das ist auch eine Klasse.

44:05.870 --> 44:09.930
Und nehmen wir an, wir haben drei Instanzen Firma, F1, F2, F3 und fünf

44:09.930 --> 44:11.390
Personen P1 bis P5.

44:11.390 --> 44:13.250
Das sind die beiden Mengen.

44:14.550 --> 44:19.590
Eine Relation sagt jetzt etwas darüber aus, was erlaubt ist im

44:19.590 --> 44:22.590
Kreuzprodukt dieser beiden Mengen.

44:22.690 --> 44:26.190
Das heißt, Sie gehen jetzt her und kombinieren F1, F2, F3 potenziell

44:26.190 --> 44:28.990
mit allen P1, P2, P3, P4 und P5.

44:30.310 --> 44:33.970
Eine mögliche Relation ist die, die mit den Häkchen angezeichnet ist.

44:33.970 --> 44:38.990
Das heißt jetzt also, zur Firma F1 gehören P1, P2 und P3, zur Firma F2

44:38.990 --> 44:43.050
gehören P4, P5 und zur Firma F3 gehören P1 und P5.

44:44.330 --> 44:48.250
Das heißt also, P5 und P1 arbeiten in zwei Firmen.

44:49.850 --> 44:51.370
Das ist eine mögliche Relation.

44:52.410 --> 44:55.490
Ich kann natürlich auch überall Häkchen hinsetzen, dann arbeitet jeder

44:55.490 --> 44:55.930
überall.

44:56.630 --> 44:57.430
Nicht sehr sinnvoll.

44:59.170 --> 45:03.130
Aber ich kann diese Relation jetzt so angeben, als Kreuzprodukt

45:03.130 --> 45:05.030
gewissermaßen als Tabelle mit den Häkchen.

45:05.610 --> 45:07.710
Ich kann es auch als Paare angeben.

45:08.810 --> 45:12.690
Ich kann also sagen, F1, P1, F1, P2 und F1, P3, das sind diese drei

45:12.690 --> 45:13.030
Paare.

45:13.450 --> 45:18.290
F2 kombiniert mit P5, F2 mit P4, das sind die nächsten beiden und dann

45:18.290 --> 45:18.930
hier diese zwei.

45:19.070 --> 45:20.890
F3 mit P1 und F3 mit P5.

45:20.890 --> 45:26.470
Ich kann die Relation, wie gesagt, als Matrize oder als Tupel angeben

45:26.470 --> 45:28.610
oder als Graph.

45:30.010 --> 45:33.790
Wieder mal, das wäre jetzt ein Objektgraph, kein Klassengraph, sondern

45:33.790 --> 45:34.650
ein Objektgraph.

45:34.750 --> 45:39.110
Ich habe Person F1, F2 und F3, das sind Instanzen von der Klasse

45:39.110 --> 45:39.450
Firma.

45:40.030 --> 45:45.310
Ich habe P1, P2, P3, P4, P5, Doppelpunkt Person, klar, ist ein Objekt,

45:45.470 --> 45:46.150
keine Klasse.

45:47.950 --> 45:55.090
Und die gleiche Relation hätte ich jetzt, indem ich diese Kanten

45:55.090 --> 45:57.870
einzeichne, F1 zu P1 und P2 und P3 und so weiter.

45:58.710 --> 46:03.130
Also Sie merken sich, Relation kann ich auf mindestens drei Arten

46:03.130 --> 46:07.750
darstellen, als Matrize, als Graph und als Tupelmenge.

46:12.290 --> 46:14.630
Relationen haben ja etwas mit Funktionen zu tun.

46:15.030 --> 46:17.830
Funktionen sind ebenfalls Relationen, aber Relationen einer

46:17.830 --> 46:18.590
bestandenen Art.

46:19.170 --> 46:22.110
Jetzt kann man bestimmte Eigenschaften von Relationen abgeben.

46:22.830 --> 46:28.210
Diese Relation hier ist linkstotal, das heißt auf der linken Seite

46:28.210 --> 46:33.130
gibt es für alle eine Abbildung, ist rechtstotal oder subjektiv.

46:33.130 --> 46:37.810
Die andere Seite der Abbildung ist auch vollständig, da ist kein F,

46:38.210 --> 46:40.090
das keine Angestellten hätte.

46:41.630 --> 46:49.790
Weder rechts noch links eindeutig, denn F3 hat zwei, P1 hat ebenfalls

46:49.790 --> 46:52.270
zwei Abbilder, ist also keine Funktion.

46:52.890 --> 46:54.650
Funktion würde ich sagen, die ist eindeutig.

46:56.310 --> 46:59.370
Nicht injektiv, nicht bijektiv, nicht funktional.

47:01.990 --> 47:07.590
Und ein einzelnes Tupel, eine einzelne Kante oder ein einzelnes

47:07.590 --> 47:09.850
Rechteck hier drin nennt man einfach eine Verknüpfung.

47:11.690 --> 47:16.010
Okay, jetzt gehen wir nochmal die Folie zurück, wo ich sagte, Zur

47:16.010 --> 47:19.510
Erinnerung, eine binäre Relation ist eine Teilmenge des kathesischen

47:19.510 --> 47:20.110
Produktes.

47:20.330 --> 47:22.210
Das kathesische Produkt ist alles mit allem kombinieren.

47:23.230 --> 47:26.030
Einfach vorzustellen für binäre Relationen wird schon etwas

47:26.030 --> 47:29.830
komplizierter für dreiwertige Relationen, aber die gibt es auch,

47:29.910 --> 47:33.050
ternäre, quaternäre, n-nähere Relationen sind auch möglich.

47:33.370 --> 47:36.990
Da gibt es eben das Kreuzprodukt von drei, vier oder noch mehr Mengen.

47:38.390 --> 47:42.290
Dann gibt es also dreidimensionale Matrizen, kommt aber selten vor.

47:44.710 --> 47:47.470
Relationen lassen sich also, das sagte ich schon, Verknüpfung ist ein

47:47.470 --> 47:49.990
einzelnes Element, das Kreuzprodukt ist ein einzelnes Tupel oder eine

47:49.990 --> 47:50.330
Kante.

47:51.170 --> 47:56.630
Eine Kante hat in einer ternären Relation mehr als zwei Enden.

47:57.890 --> 47:59.650
Das ist eine Verknüpfung von dreien.

48:00.990 --> 48:02.330
Da werden wir auch gleich ein Beispiel sehen.

48:02.810 --> 48:03.970
So, das hatten wir jetzt gesagt.

48:07.390 --> 48:10.330
Also das erstmal zur Assoziation.

48:10.990 --> 48:14.510
Die Assoziation beschreibt Eigenschaften von Relationen.

48:15.250 --> 48:19.270
Relationen sind konkret, sie sind so ähnlich wie Objekte, konkrete

48:19.270 --> 48:22.970
Instanzen von Klassen sind, sind eine gegebene Relation, also eine

48:22.970 --> 48:27.470
gegebene Verknüpfung, eine Instanz könnte man sagen, der Relation, die

48:27.470 --> 48:29.430
durch die Assoziation beschrieben ist.

48:30.170 --> 48:32.430
Was kann ich denn mit dieser Assoziation alles sagen?

48:33.150 --> 48:36.410
Also zum einen sagen wir, die Mengen werden als Klassen angegeben.

48:36.630 --> 48:39.750
Die Assoziation besteht zwischen Klassen, also was anderes kenne ich

48:39.750 --> 48:40.070
nicht.

48:40.070 --> 48:45.750
Ich kann also nicht primitive Datentypen in Assoziationen stecken.

48:45.990 --> 48:52.590
Es geht nur mit Klassen, beziehungsweise deren Instanzen.

48:53.650 --> 48:56.370
Multiplizitäten oder Vielfaches geben an, in wie vielen Typen die

48:56.370 --> 48:57.790
Relation ein Element eingibt.

49:02.090 --> 49:05.390
Dann würde ich zum Beispiel sagen, eine Person darf nur zu einer Firma

49:05.390 --> 49:10.270
gehören, dann wäre diese Relation auf dieser einen Seite eindeutig.

49:10.270 --> 49:13.530
Sie kann mehrdeutig sein, das ist natürlich so, dass ich sagen will,

49:14.050 --> 49:17.190
zu einer Firma gehören mehr als ein Angestellter.

49:18.110 --> 49:21.210
Mehrdeutig wäre 1 zu N oder auch 0 zu N, oder Stern.

49:22.030 --> 49:23.590
Oder sogar M zu N.

49:24.870 --> 49:31.730
So wie Totalität, wo ich dem sage, alle sind enthalten in der

49:31.730 --> 49:32.130
Relation.

49:33.070 --> 49:34.830
Die Klassen brauchen nicht, das Jung zu sein.

49:35.150 --> 49:37.750
Es ist also erlaubt, dass eine Person zum Beispiel auf sich selbst

49:37.750 --> 49:40.550
bezieht oder eine Firma sich auf sich selbst bezieht.

49:41.030 --> 49:44.210
Bei der Person wäre das ziemlich klar, wenn sie zum Beispiel sagen

49:44.210 --> 49:50.790
wollen, eine Relation verheiratet mit, die geht natürlich von Person

49:50.790 --> 49:51.410
zu Person.

49:52.430 --> 49:55.610
So eine Relation würde so aussehen, Person aus Kasten und eine

49:55.610 --> 49:57.350
Schleife dran, das sagt verheiratet mit.

49:59.120 --> 50:02.370
Das ist also erlaubt, Selbstreferenz.

50:03.790 --> 50:06.290
Tupel, eine Relation heißt Verknüpfung, das sagten wir schon.

50:08.710 --> 50:11.830
Duplikate von Tupeln sind ebenfalls erlaubt, das heißt, die Relationen

50:11.830 --> 50:13.350
sind eigentlich Mehrfachmengen.

50:15.410 --> 50:18.810
Also hier wäre eine dreifache Relation.

50:19.250 --> 50:24.510
Ich sagte also folgendes, in einem gegebenen Jahr spielt eine Person

50:24.510 --> 50:26.190
in einer bestimmten Mannschaft.

50:28.490 --> 50:31.470
Das ist eine mehrstellige Assoziation, denn Sie wissen, die Person

50:31.470 --> 50:34.990
kann in einem Jahr in mehreren Mannschaften spielen, sie kann über

50:34.990 --> 50:37.810
Jahre hinweg in verschiedenen Mannschaften spielen.

50:39.290 --> 50:43.630
Eine Mannschaft kann unterschiedliche Personen enthalten für jedes

50:43.630 --> 50:47.110
Jahr, man möchte fast schon meinen wöchentlich, anders sein.

50:50.930 --> 50:52.910
Das heißt, wir brauchen dieses Trippel,

50:57.030 --> 50:58.950
ein binäres Tupel reicht mir nicht aus.

51:01.890 --> 51:04.630
Gezeichnet wird das hier mit dieser Raute, das ist also gewissermaßen

51:04.630 --> 51:08.250
die Kante mit drei Enden in diesem Graphen.

51:13.920 --> 51:17.680
So, und jetzt kommen wir zu den Dingen, wie ich das an der Assoziation

51:17.680 --> 51:20.040
sage, das male ich alles hier an diese Kante.

51:20.220 --> 51:24.080
Ich habe also wieder das Beispiel Firma, Person, Assoziation, der

51:24.080 --> 51:26.100
nämlich, gebe ich jetzt an der Arbeit einen anderen Namen, der heißt

51:26.100 --> 51:30.360
beschäftigt, und die hat jetzt ein kleines Pfeilchen hin, das nennt

51:30.360 --> 51:31.220
man die Leserichtung.

51:31.560 --> 51:35.980
Die sagt also, Firma beschäftigt Personen, in erster Näherung.

51:37.080 --> 51:40.120
Oder umgekehrt, wenn ich in umgekehrter Leserichtung arbeite, sage

51:40.120 --> 51:44.660
ich, Personen sind beschäftigt von Firmen, passiv.

51:45.480 --> 51:48.220
In aktiver Form lese ich das in der Leserichtung.

51:49.180 --> 51:54.740
Dann stehen hier Arbeitgeber und Angestellter, das nennt man eine

51:54.740 --> 51:55.040
Rolle.

51:57.100 --> 52:04.940
Die Rolle sagt mir etwas darüber aus, welche Eigenschaft die Person in

52:04.940 --> 52:05.600
der Firma hat.

52:05.600 --> 52:13.980
Also ich sage hier, von der Person ausgegeben gesehen, ist die Firma

52:13.980 --> 52:14.980
mein Arbeitgeber.

52:16.140 --> 52:19.500
Von der Firma ausgesehen, ist die Person mein Angestellter.

52:21.060 --> 52:22.500
Man bezeichnet das als Rollen.

52:24.580 --> 52:32.060
Dann gibt es hier diese spezielle Notation unique, das ist eine

52:32.060 --> 52:37.360
Restriktion an der Relation, die sagt nämlich, eine Person darf nur

52:37.360 --> 52:40.200
einmal bei einer bestimmten Firma in Relation stehen.

52:41.380 --> 52:45.180
Das würde also sagen, nur in einer Firma arbeiten.

52:45.560 --> 52:47.400
Wenn ich das nicht will, muss ich das weglassen.

52:50.790 --> 52:55.550
So, wir haben die Rollen, wir haben diese Relation, wir müssen jetzt

52:55.550 --> 52:57.890
noch über die sogenannten Multiplizitäten reden.

53:02.170 --> 53:05.290
Multiplizitäten sind manchmal schwierig zu interpretieren, aber wir

53:05.290 --> 53:06.030
versuchen es mal.

53:07.290 --> 53:10.030
Bei der Multiplizität muss man immer am anderen Ende beginnen.

53:10.810 --> 53:17.810
Das sagt also jetzt folgendes, eine Firma beschäftigt null oder

53:17.810 --> 53:19.090
beliebig viele Personen.

53:20.290 --> 53:25.070
Also eine Firma beschäftigt, das ist die Bezeichnung der Assoziation,

53:25.070 --> 53:27.490
null oder beliebig viele Personen.

53:28.350 --> 53:31.070
Ihr könnt ja auch einfach nur einen Stern hinsetzen, das hätte die

53:31.070 --> 53:31.910
gleiche Bedeutung.

53:33.630 --> 53:35.230
Was bedeutet denn das hier?

53:36.290 --> 53:39.290
Das heißt nicht, es gibt nur null oder eins Firmen, sondern das

53:39.290 --> 53:44.590
bedeutet, von Person aus gesehen kann eine Person bei einer Firma

53:44.590 --> 53:46.550
beschäftigt sein oder bei keiner.

53:50.370 --> 53:51.210
Nur einer.

53:56.980 --> 53:57.600
So.

54:01.860 --> 54:06.360
Diese Etiketten hier, bis auf die Bezeichnung, den Namen der

54:06.360 --> 54:10.860
Assoziation, haben keine weitere tiefergehende Bedeutung, außer dass

54:10.860 --> 54:13.900
sie uns helfen, das Diagramm besser zu verstehen.

54:15.200 --> 54:20.160
Man kann die Dinge auch weglassen, den Assoziationsnamen sollte man

54:20.160 --> 54:20.840
immer hinschreiben.

54:20.840 --> 54:24.460
Und die Multiplizitäten auch, aber die Rollen kann man weglassen, wenn

54:24.460 --> 54:26.080
man keine gute Bezeichnung dafür hat.

54:28.820 --> 54:32.820
Also, jetzt nochmal zur Unterscheidung zwischen Assoziation und

54:32.820 --> 54:33.360
Relation.

54:33.900 --> 54:40.400
Die Assoziation beschreibt die Eigenschaft von einer noch zu

54:40.400 --> 54:44.280
bestimmenden Relation, in diesem Falle jede Person nur einmal

54:44.280 --> 54:47.780
angestellt und eine Firma kann mehr als eine Person oder auch gar

54:47.780 --> 54:48.620
keine Person haben.

54:49.880 --> 54:54.640
Die Assoziation beschreibt man nur Personen

55:03.310 --> 55:05.190
P1 bis P3 hat und die Firma F.

55:05.590 --> 55:07.470
Diese Firma hier, die Person P4.

55:13.440 --> 55:14.520
Fragen soweit?

55:15.240 --> 55:18.380
Da sind wir mit dem Teil ausführlich besprochen.

55:19.860 --> 55:21.780
Wichtig, dass Sie damit zurechtfinden.

55:24.160 --> 55:28.920
Zum einen geht es darum, die Diagramme richtig zu schreiben mit allen

55:28.920 --> 55:29.440
Details.

55:29.980 --> 55:34.160
Zum anderen natürlich auch, diese Diagramme erstmal zu finden.

55:34.660 --> 55:37.480
Was sind denn eigentlich, wenn Sie eine Beschreibung eines Problems

55:37.480 --> 55:42.840
haben, zum Beispiel ein Lastenheft, und Sie sollen es umwandeln in ein

55:42.840 --> 55:46.540
UML -Klassendiagramm, dann ist die Frage natürlich, wie finde ich denn

55:46.540 --> 55:48.240
jetzt diese Klassen aus dem Text heraus.

55:48.720 --> 55:50.180
Das werden wir dann auch noch besprechen.

55:50.600 --> 55:52.980
Also jetzt besprechen wir gewissermaßen nur die UML-Syntax.

55:53.620 --> 55:56.220
Wenn Sie ein Diagramm haben, was bedeutet das?

56:01.260 --> 56:04.380
Zum Schluss, jetzt wo wir alles besprochen haben, was ich an der

56:04.380 --> 56:09.260
Assoziation hinschreiben kann, zeige ich Ihnen nochmal, wie man das

56:09.260 --> 56:10.300
Ganze interpretiert.

56:11.920 --> 56:15.420
Also wir interpretieren jetzt die Assoziation beschäftigt.

56:15.680 --> 56:19.960
Und es sagt jetzt, eine Firma, eine Firma ist eine Instanz einer

56:19.960 --> 56:25.480
Klasse, beschäftigt null bis beliebig viele, das ist die

56:25.480 --> 56:30.800
Multiplizität, verschiedene Personen, nie die gleiche zweimal.

56:33.160 --> 56:36.700
Also unique und 0 zu 1 bedeuten unterschiedliche Dinge.

56:37.740 --> 56:41.500
0 zu 1 heißt, eine Person darf nur bei einer Firma angestellt sein.

56:42.200 --> 56:46.640
Unique bedeutet, die Person darf nicht zweimal oder mehrmals bei einer

56:46.640 --> 56:47.600
Firma angestellt sein.

56:48.300 --> 56:51.860
Es gibt also keine Tupel, die heißen F1P1 und dann ein zweites, das

56:51.860 --> 56:52.940
heißt F1P1.

56:52.940 --> 56:56.160
Das würde ja trotzdem 0 zu 1 erfüllen.

56:57.900 --> 56:58.720
Das ist ein feiner Unterschied.

56:59.180 --> 57:03.920
Also verschiedene Personen, die zweite Klasse oder das Einzige, was

57:03.920 --> 57:07.360
wir jetzt nicht gesagt haben, ist das hier, 0 zu 1 und Arbeitgeber,

57:08.060 --> 57:11.420
das können wir dann im Passiv ausdrücken, da wechsle ich jetzt eins

57:11.420 --> 57:11.820
weiter.

57:12.400 --> 57:14.480
Achso, als Angestellte, die Rolle hatte ich noch vergessen.

57:16.240 --> 57:18.540
Eine Firma beschäftigt null bis beliebig viele verschiedene Personen

57:18.540 --> 57:19.260
als Angestellte.

57:19.320 --> 57:20.140
Das lese ich hier ab.

57:22.000 --> 57:25.980
Kann es auch anders sehen, sage ich, eine Person, vorhin hatte ich mit

57:25.980 --> 57:28.840
Firma begonnen, jetzt beginne ich mit der anderen Seite, eine Person

57:28.840 --> 57:33.820
ist bei, das ist gegen die Lesenrichtung, das muss ich dann im Passiv

57:33.820 --> 57:37.660
ausdrücken, null oder eine Firma beschäftigt.

57:39.600 --> 57:42.180
Das ist das, was die Assoziation aussagt.

57:44.800 --> 57:49.160
Und ich sage Ihnen das deswegen, weil wenn Sie solche Sätze finden, in

57:49.160 --> 57:52.640
einem Lastenheft oder einem Pflichtenheft, dann wissen Sie, was Sie zu

57:52.640 --> 57:53.040
tun haben.

57:55.080 --> 57:57.480
Eine Person ist beschäftigt bei, das heißt, Sie brauchen eine

57:57.480 --> 58:00.040
Assoziation beschäftigt, Sie brauchen eine Klasse Person und Sie

58:00.040 --> 58:00.880
brauchen eine Klasse Firma.

58:02.000 --> 58:02.720
So einfach geht das.

58:04.740 --> 58:08.280
So, jetzt gehen wir nochmal zurück zu den Kardinalitäten, die werden

58:08.280 --> 58:11.040
so ausgedrückt, das haben wir jetzt im Beispiel schon gesehen, 0 zu 1

58:11.040 --> 58:15.920
heißt 0 oder 1, 0 bis Stern oder auch einfach nur Stern heißt beliebig

58:15.920 --> 58:20.660
viele, auch 0, auch gar keine, 1 heißt immer genau 1, 1 bis Stern

58:20.660 --> 58:25.100
heißt beliebig viele, aber mindestens einer, 17 heißt immer genau 17

58:26.080 --> 58:29.280
und wenn nichts hingeschrieben wird, dann heißt es eigentlich immer

58:29.280 --> 58:29.920
genau 1.

58:35.160 --> 58:36.580
Jetzt wird es schwierig.

58:39.380 --> 58:40.600
Interpretation der Multiplizität.

58:41.380 --> 58:44.460
Ich gehe zum Beispiel, ich lasse Ihnen das in einer ruhigen Stunde

58:44.460 --> 58:49.660
selbst durcharbeiten, diese allgemeine Vorschrift, wie man

58:49.660 --> 58:52.900
Multiplizität interpretiert, da macht man oft Fehler.

58:54.220 --> 58:55.600
Ich mache es jetzt wieder an dem Beispiel.

58:56.360 --> 59:02.420
Wir geben also die Assoziation beschäftigt, die ist jetzt binär, eine

59:02.420 --> 59:11.500
binäre Relation oder binäre Assoziation, wähle einen Angestellten, das

59:11.500 --> 59:17.600
wäre also eine Person, dann ist also K die Person, wähle das andere

59:17.600 --> 59:23.120
Ende zu einer Relation, sagen wir das wäre EnBW, irgendeine Firma,

59:26.200 --> 59:29.900
sei V die Menge der Verknüpfungen, die von einer solchen Firma

59:29.900 --> 59:38.760
ausgehen, zu Elementen des Typs Person, das ist also die Menge V, zum

59:38.760 --> 59:45.240
Beispiel sind das die drei, das ist die Menge M, und dann beschränkt

59:45.240 --> 59:48.000
die beiden Angestellten hingeschrieben, also die hier beim

59:48.000 --> 59:53.360
Angestellten hingeschriebene Multiplizität, die zugelässige

59:53.360 --> 59:55.180
Kardinalität dieser Menge M.

59:57.160 --> 01:00:00.380
Also hier steht ja eigentlich gar keine Restriktion, der sagt beliebig

01:00:00.380 --> 01:00:05.800
viele, das ist nicht besonders interessant, aber wenn hier zum

01:00:05.800 --> 01:00:08.000
Beispiel 1 stünde, wäre das hier nicht erlaubt.

01:00:09.140 --> 01:00:10.680
Und hier zum Beispiel steht 0 zu 1.

01:00:11.000 --> 01:00:15.980
Da gehen Sie immer von diesem Ende aus, sagen also ich will den

01:00:15.980 --> 01:00:20.980
Arbeitgeber, das ist eine Firma, und ich denke mir aus einer Instanz

01:00:20.980 --> 01:00:25.800
der gegenüberliegenden Seite, betrachte die Anzahl Verknüpfungen

01:00:25.800 --> 01:00:28.820
heraus, in diesem Fall mache ich es gerade umgekehrt, von der Person,

01:00:29.640 --> 01:00:33.380
und die Menge dieser Verknüpfungen darf nicht mehr als 0 oder 1 sein.

01:00:34.180 --> 01:00:39.900
Und das geht dann auch für die katernären Relationen.

01:00:45.180 --> 01:00:49.500
Das dürfen Sie dann auch selbst interpretieren, was bedeutet das,

01:00:49.500 --> 01:00:54.020
mithilfe der Regeln, die ich mir mühsam aufgeschrieben habe.

01:00:54.700 --> 01:00:58.160
Es geht einfach, er sagt, ein Ende festhalten, das andere Ende nehmen,

01:00:58.440 --> 01:01:00.020
sehen, welche Kardinalitäten vorkommen.

01:01:00.840 --> 01:01:07.680
Und dann kann man auch die Verknüpfungen, diese Zahlen, für die

01:01:07.680 --> 01:01:12.820
katernären Assoziationen verstehen.

01:01:16.410 --> 01:01:20.490
Also in einer Relation von Jahr, Mannschaft und Person kann es zu

01:01:20.490 --> 01:01:23.690
einem Jahr oder einer Mannschaft mehrere Personen geben, das ist klar.

01:01:24.690 --> 01:01:28.810
Aber in einem gegebenen Tupel, wo eine Person vorkommt, darf nur eine

01:01:28.810 --> 01:01:31.830
Mannschaft und ein Jahr vorkommen, in einem einzelnen Tupel.

01:01:34.930 --> 01:01:37.650
Jeweils für ein Jahr nur zu einer Mannschaft.

01:01:38.070 --> 01:01:39.450
Das wäre das, was wir hier sagen.

01:01:40.190 --> 01:01:42.610
Wenn wir das monatsweise ändern wollten, dann müssten wir das

01:01:42.610 --> 01:01:45.030
natürlich ummodellieren, hier im Monat hinschreiben.

01:01:51.810 --> 01:01:53.610
Jetzt noch ein paar Beispiele.

01:01:53.950 --> 01:01:59.290
Angenommen, wir wollen Relationen zwischen Personen und Terminen

01:01:59.290 --> 01:01:59.830
beschreiben.

01:02:01.270 --> 01:02:06.350
Das heißt, die zulässigen Relationen, das sagen wir jetzt zum

01:02:06.350 --> 01:02:11.410
Beispiel, ein Termin, da kann ein Teilnehmer sein, eine Person.

01:02:11.870 --> 01:02:14.570
Eine Person nimmt an dem Termin nur einmal teil.

01:02:15.550 --> 01:02:22.690
Aber insgesamt gesehen würde das zum Beispiel heißen, dass eine Person

01:02:22.690 --> 01:02:25.250
an beliebig vielen Terminen und einen Termin mit beliebig vielen

01:02:25.250 --> 01:02:26.390
Teilnehmern haben kann.

01:02:29.030 --> 01:02:33.850
Ich kann weitere Restriktionen anlegen, die sagen geordnet.

01:02:35.110 --> 01:02:39.810
Ich sage, das Liste der Elemente in einer Liste müssen geordnet sein.

01:02:41.150 --> 01:02:44.110
Das machen wir mit dem Ding ordered, da gibt es das unique, das hatten

01:02:44.110 --> 01:02:44.630
wir bereits.

01:02:49.630 --> 01:02:53.590
UML sagt jetzt, Sie können an Objekte nur dann Nachrichten schicken,

01:02:53.710 --> 01:02:54.350
wenn Sie sie kennen.

01:02:54.610 --> 01:02:56.730
Das heißt, Sie müssen immer von einem anderen Objekt ausgehen.

01:02:59.410 --> 01:03:02.690
Aber diese Assoziation hat noch eine Eigenschaft, die heißt

01:03:02.690 --> 01:03:04.810
Navigierbarkeit.

01:03:05.370 --> 01:03:09.010
Wenn Sie nichts hinschreiben, dann heißt das, dass Sie eigentlich in

01:03:09.010 --> 01:03:10.350
beiden Richtungen navigieren können.

01:03:10.350 --> 01:03:14.630
Sie können also vom Rechteck zu den Punkten und von den Punkten zurück

01:03:14.630 --> 01:03:15.370
zum Rechteck gehen.

01:03:15.830 --> 01:03:19.050
Ein Pfeil heißt, von A nach B navigierbar, aber nicht umgekehrt.

01:03:20.070 --> 01:03:21.930
Das ist eigentlich undefiniert.

01:03:22.930 --> 01:03:25.490
Und das, er sagt, Sie können von A nach B nicht gelangen.

01:03:26.350 --> 01:03:30.450
Das heißt also, es gibt zwar eine Assoziation, aber A muss sich nicht

01:03:30.450 --> 01:03:31.770
merken, seine Partner.

01:03:32.530 --> 01:03:34.370
Damit können Sie von A nicht nach B kommen.

01:03:35.630 --> 01:03:39.370
Das mache ich mit diesem X oder Kreuz.

01:03:41.590 --> 01:03:43.370
Das ist ganz schön viel, was man sagen kann.

01:03:47.550 --> 01:03:50.130
Manchmal möchte man weitere Eigenschaften angeben, das hatten wir

01:03:50.130 --> 01:03:50.690
vorhin schon.

01:03:52.230 --> 01:03:56.650
Sagen wir mal, ein Teilnehmer möchte sich einen Alarmzeitpunkt

01:03:56.650 --> 01:03:57.270
eintragen.

01:03:58.070 --> 01:04:00.090
Jetzt ist die Frage, wann kriege ich den Alarm?

01:04:01.150 --> 01:04:05.790
Also 15 Minuten vor der Vorlesung ist Ihr Terminkalender so gebaut,

01:04:05.930 --> 01:04:07.410
dass er einen Alarm ausgibt.

01:04:08.270 --> 01:04:13.950
Sollte ich das jetzt so modellieren, dass der Termin den

01:04:13.950 --> 01:04:15.430
Alarmzeitpunkt festhält?

01:04:17.130 --> 01:04:20.990
Das wäre nicht so gut, weil vielleicht wollen andere Personen früher

01:04:20.990 --> 01:04:22.370
oder später alarmiert werden.

01:04:22.470 --> 01:04:24.830
Sie könnten vielleicht nur 10 Minuten vorher alarmiert werden oder

01:04:24.830 --> 01:04:26.570
gerade 5 oder eine halbe Stunde vorher.

01:04:27.410 --> 01:04:30.190
Und das ist abhängig von der Person, die an dem Termin teilnimmt.

01:04:30.550 --> 01:04:33.990
Das heißt, am Termin ist der Alarmzeitpunkt einzutragen nicht eine

01:04:33.990 --> 01:04:34.470
gute Idee.

01:04:37.410 --> 01:04:45.690
Sollte ich stattdessen die Alarmzeit bei der Person eintragen?

01:04:47.150 --> 01:04:51.670
Das ist noch blöder, denn das heißt, ich kann ja nur einen Zeitpunkt

01:04:51.670 --> 01:04:53.630
eintragen, habe aber vielleicht viele Vorlesungen.

01:04:54.070 --> 01:04:59.410
Sagen Sie, 11.15 Uhr kriegen Sie einen Alarm für jeden Termin.

01:04:59.490 --> 01:05:01.790
Das ist immer um 11.15 Uhr, der Alarm, das ist natürlich völlig

01:05:01.790 --> 01:05:02.270
sinnlos.

01:05:03.030 --> 01:05:05.790
Ich kann also den Alarmzeitpunkt weder hier noch hier eintragen.

01:05:06.690 --> 01:05:10.710
Der Alarmzeitpunkt gehört eigentlich zur Relation zum Tupel selbst.

01:05:12.390 --> 01:05:19.490
Daher gibt es in UML sogenannte Assoziationsklassen.

01:05:20.550 --> 01:05:24.110
Assoziationsklassen gehören also zu einer Assoziation.

01:05:24.730 --> 01:05:29.150
Wir sitzen also, Daten hängen mit an den Tupeln dran oder an den

01:05:29.150 --> 01:05:30.090
Kanten, wenn Sie so wollen.

01:05:31.010 --> 01:05:34.550
Und da könnte ich die Teilnahme angeben, einen Alarmzeitpunkt.

01:05:34.550 --> 01:05:37.570
Jetzt bin ich fein raus, kann ich sagen, also für die Vorlesung

01:05:37.570 --> 01:05:40.830
Softwaretechnik will ich um 11.15 Uhr alarmiert werden,

01:05:47.220 --> 01:05:50.180
vielleicht nur zwei Minuten vorher.

01:05:52.960 --> 01:05:56.080
Das heißt, es sieht plötzlich so aus, als hätten wir eine zusätzliche

01:05:56.080 --> 01:05:56.440
Klasse.

01:05:56.820 --> 01:06:00.320
In der Tat, das ist eine sogenannte Assoziationsklasse, die ist jetzt

01:06:00.320 --> 01:06:03.920
aber mit der Kante verbunden.

01:06:05.540 --> 01:06:09.760
Wie könnte ich das eigentlich durch eine normale Klasse simulieren?

01:06:10.420 --> 01:06:13.500
In Java haben wir leider keine Assoziationsklassen.

01:06:15.120 --> 01:06:19.260
Ich muss das irgendwie mit einer normalen Klasse simulieren, das geht.

01:06:19.780 --> 01:06:23.720
Ich nehme einen Termin, eine Person und eine Teilnahme als Klasse und

01:06:23.720 --> 01:06:25.540
mache jetzt zwei Verknüpfungen.

01:06:26.160 --> 01:06:30.480
Eine, die geht von Termin zur Teilnahme und von Person zur Teilnahme.

01:06:30.480 --> 01:06:36.660
Dann also eine Person kann viele Teilnahmen haben, ein Termin kann

01:06:36.660 --> 01:06:37.740
viele Teilnahmen haben.

01:06:39.100 --> 01:06:42.700
Aber jede Teilnahme besteht nur aus einem Termin und einer Person.

01:06:46.460 --> 01:06:51.640
Das heißt, der Stern, der hier war, wandert jetzt an die Teilnahme

01:06:51.640 --> 01:06:52.060
heran.

01:06:54.180 --> 01:06:58.300
Allerdings ist diese Simulation so, dass sie nicht hundertprozentig

01:06:58.300 --> 01:07:03.300
alles genau richtig wiedergibt, nämlich nach diesem Diagramm ist auch

01:07:03.300 --> 01:07:03.880
das erlaubt.

01:07:04.540 --> 01:07:09.600
Termin, eine Teilnahme T1 und T2 mit jeweils der gleichen Person.

01:07:10.660 --> 01:07:16.380
Das heißt also, hier gäbe es plötzlich über diesen Umweg zwei

01:07:16.380 --> 01:07:20.300
Verknüpfungen mit einem Termin, obwohl das hier in diesem Diagramm

01:07:20.300 --> 01:07:21.080
nicht erlaubt war.

01:07:23.060 --> 01:07:24.140
Da steht nämlich unique.

01:07:25.620 --> 01:07:28.220
Und das kann ich in diesem Diagramm nicht mehr wiedergeben.

01:07:28.780 --> 01:07:29.840
Die Information ist verloren.

01:07:32.800 --> 01:07:33.660
Haben wir das verstanden?

01:07:35.300 --> 01:07:39.600
Ansonsten bleibt uns vielleicht in Java nichts anderes übrig.

01:07:40.420 --> 01:07:41.460
Wie spät haben wir jetzt?

01:07:46.380 --> 01:07:51.140
Natürlich ist es so, dass die Existenz einer Instanz, einer

01:07:51.140 --> 01:07:54.300
Assoziationsklasse natürlich von der Existenz der Verknüpfung abhängt.

01:07:54.820 --> 01:08:00.360
Wenn wir nochmal zurückdenken, angenommen es gibt einen Termin T1 und

01:08:00.360 --> 01:08:06.120
Person P1 und an der Kante, also eine Person, die an einem Termin

01:08:06.120 --> 01:08:08.460
teilnimmt, wir wissen den Zeitpunkt, wir wissen die Alarmzeit.

01:08:10.860 --> 01:08:15.380
Und diese Instanz der Assoziationsklasse gibt es natürlich nur, wenn

01:08:15.380 --> 01:08:16.460
auch die Verknüpfung besteht.

01:08:17.560 --> 01:08:19.240
Sonst kann es die gar nicht geben.

01:08:19.680 --> 01:08:22.220
Das heißt also, wenn eine Verknüpfung gelöscht wird, wird auch die

01:08:22.220 --> 01:08:25.820
entsprechende Instanz der Assoziationsklasse gelöscht.

01:08:26.560 --> 01:08:29.940
Und wenn eine Verknüpfungspartner gelöscht wird, muss nicht nur die

01:08:29.940 --> 01:08:34.020
Verknüpfung gelöscht werden, sondern auch die Instanz der

01:08:34.020 --> 01:08:34.820
Assoziationsklasse.

01:08:36.520 --> 01:08:38.480
Das ist Bereinigung, Konsistenzerhaltung.

01:08:39.300 --> 01:08:42.000
Sie sehen, auch hier brauchen wir wieder Transaktionsdenken, das

01:08:42.000 --> 01:08:48.160
heißt, alle Operationen, die notwendig sind, durchführen, bevor das

01:08:48.160 --> 01:08:49.740
Ergebnis sichtbar wird.

01:08:50.780 --> 01:08:52.680
Ganz oder gar nicht atomar.

01:08:54.480 --> 01:08:59.160
Also nicht wie eine normale Klasse, sondern beachten, wenn ich an den

01:08:59.160 --> 01:09:01.920
Verknüpfungen etwas ändere mit der Assoziationsklasse, dann muss ich

01:09:01.920 --> 01:09:05.300
vielleicht noch mehr tun, als zunächst erscheint.

01:09:08.140 --> 01:09:11.500
Okay, noch sind wir immer nicht fertig mit Assoziationen, jetzt gibt

01:09:11.500 --> 01:09:12.620
es noch zwei Details.

01:09:16.100 --> 01:09:20.700
Und zwar gibt es eine spezielle Assoziation, die nennt man die

01:09:20.700 --> 01:09:21.440
Aggregation.

01:09:24.080 --> 01:09:28.040
Die sagt etwas darüber aus, über ein Teil-Ganzes-Beziehung.

01:09:28.280 --> 01:09:30.820
Teil-Ganzes-Beziehung braucht man eigentlich sehr, sehr oft.

01:09:31.220 --> 01:09:35.480
Wir können zum Beispiel sagen, dass ein PKW vier Räder hat.

01:09:36.460 --> 01:09:40.380
Ein PKW hat vier Räder und das drücke ich aus, also zu dem PKW gehören

01:09:40.380 --> 01:09:42.420
vier Räder, das drücke ich auch mit aus mit dieser Raute.

01:09:43.400 --> 01:09:47.340
Wenn ich also auch noch sagen will, PKW hat auch noch einen Motor, was

01:09:47.340 --> 01:09:50.080
es wahrscheinlich tut, dann brauche ich eine zweite Assoziation mit

01:09:50.080 --> 01:09:50.520
der Raute.

01:09:51.780 --> 01:09:54.960
Und eine Tür, ein Lenkrad, ein Sitz und so weiter und so weiter, ein

01:09:54.960 --> 01:09:58.300
Getriebe, ein Auspuff, ein Fenster und so weiter.

01:09:58.700 --> 01:10:00.960
Das würde man immer mit dieser Raute ausdrücken.

01:10:01.680 --> 01:10:05.380
Wenn ich zum Beispiel jetzt sagen möchte, und ein Rad besteht aus

01:10:05.380 --> 01:10:08.540
einer Felge, einem Reifen und einem Ventil, dann würde ich hier eine

01:10:08.540 --> 01:10:12.380
weitere Assoziation anschließen, oder drei sogar, jeweils mit der

01:10:12.380 --> 01:10:12.660
Raute.

01:10:12.900 --> 01:10:16.560
Diese Raute hat eine Teil-Ganzes-Beziehung, drückt die aus.

01:10:17.760 --> 01:10:21.520
Um die Verwirrung komplett zu machen, gibt es noch eine Sonderform der

01:10:21.520 --> 01:10:25.960
Aggregation, das nennt man jetzt Komposition, da wird die Raute

01:10:25.960 --> 01:10:27.100
schwarz ausgefüllt.

01:10:29.140 --> 01:10:32.640
Und ich kann mir das auch nicht merken, aber ich sage Ihnen, meine

01:10:32.640 --> 01:10:37.420
Eselsbrücke können Sie annehmen oder nicht, also die schwarze Raute

01:10:37.420 --> 01:10:44.820
bedeutet, wenn ich ein Tupel zwischen Rechnung und Posten hier lösche,

01:10:45.500 --> 01:10:47.960
dann verschwindet auch der entsprechende Posten.

01:10:49.120 --> 01:10:52.680
Also der Posten hier hat keine eigene Existenzberechtigung, im

01:10:52.680 --> 01:10:53.820
Gegensatz zum Rad.

01:10:53.820 --> 01:10:57.360
Wenn Sie das Rad vom Auto abmontieren, wollen Sie wahrscheinlich

01:10:57.360 --> 01:10:59.480
modellieren, dass es das Rad noch gibt, vielleicht ist es der

01:10:59.480 --> 01:11:01.760
Winterreifen, den Sie in die Garage tun wollen oder so etwas.

01:11:02.300 --> 01:11:06.100
Also nehmen Sie hier die durchsichtige Raute, die ist jetzt in

01:11:06.100 --> 01:11:10.740
Beziehung, aber wenn die Beziehung gelöscht wird, dann existiert die

01:11:10.740 --> 01:11:11.600
Instanz immer noch.

01:11:12.180 --> 01:11:15.180
Bei der Rechnung ist es nicht so, Rechnungen bestehen aus einzelnen

01:11:15.180 --> 01:11:19.280
Posten, das sagt also, was weiß ich, brauchen Sie sich eine CD und

01:11:19.280 --> 01:11:22.340
irgendwas anderes und ein Buch dazu und dann haben Sie also zwei, drei

01:11:22.340 --> 01:11:23.180
Rechnungsposten.

01:11:25.620 --> 01:11:29.560
Wenn Sie sagen, der Posten gehört jetzt nicht mehr auf die Rechnung,

01:11:29.620 --> 01:11:33.260
Sie haben also gewissermaßen storniert und eine CD abbestellt, dann

01:11:33.260 --> 01:11:35.160
gibt es auch den Rechnungsposten nicht mehr.

01:11:36.500 --> 01:11:38.560
Also, wie kann ich mir das jetzt merken?

01:11:39.340 --> 01:11:40.360
Schwarz ist der Tod.

01:11:42.080 --> 01:11:46.560
Schwarz ist der Tod, das heißt, wenn Sie da eine Verknüpfung löschen,

01:11:46.660 --> 01:11:47.840
dann verschwindet das andere.

01:11:48.240 --> 01:11:53.760
Okay, manchmal braucht man so Blödsinn, aber es hilft einem, sich das

01:11:53.760 --> 01:11:54.100
zu merken.

01:11:54.340 --> 01:11:57.000
Aggregation ist also die allgemeine Form, kommt als erster im

01:11:57.000 --> 01:11:59.240
Alphabet, das kennen Sie schon, so eine Eselsbrücke und die

01:11:59.240 --> 01:12:01.320
Komposition kommt später mal, die ist speziell.

01:12:03.180 --> 01:12:05.100
Okay, so können wir uns das auch noch merken.

01:12:09.580 --> 01:12:13.500
Also die Aggregation beziehungsweise Komposition kommen sehr häufig

01:12:13.500 --> 01:12:18.680
vor, wenn Sie zum Beispiel modellieren wollten, Ihr Dateiverzeichnis

01:12:18.680 --> 01:12:21.020
auf Ihrem Rechner.

01:12:21.220 --> 01:12:25.860
Sie starten mit einem Verzeichnis auf einer Platte, das ist das

01:12:25.860 --> 01:12:28.900
Wurzelverzeichnis, das enthält Verzeichnisse für jeden Benutzer,

01:12:29.400 --> 01:12:31.660
enthält Verzeichnisse für Software, enthält Verzeichnisse für dies und

01:12:31.660 --> 01:12:35.640
das, die Verzeichnisse selbst enthalten andere Verzeichnisse, brauchen

01:12:35.640 --> 01:12:38.740
Sie schon wieder die Komposition beziehungsweise Aggregation, in

01:12:38.740 --> 01:12:42.620
diesem Fall die Aggregation, nein, nehmen Sie zurück, in diesem Fall

01:12:42.620 --> 01:12:46.980
brauchen wir Komposition, denn wenn Sie sagen, die Datei gehört nicht

01:12:46.980 --> 01:12:50.220
mehr dazu, zu einem bestimmten Verzeichnis, dann gibt sie sie auch

01:12:50.220 --> 01:12:50.600
nicht mehr.

01:12:53.520 --> 01:12:55.940
Okay, gibt es Fragen dazu?

01:13:03.720 --> 01:13:07.200
Gleich alles mitmerken, wenn es geht, also nicht warten, mal schauen,

01:13:07.280 --> 01:13:12.900
was er so macht, gut, versuch es gleich einzusprechen, Aggregation,

01:13:13.080 --> 01:13:17.420
Komposition, durchsichtige Rauchte, schwarze Rauchte, ah ja, hat er

01:13:17.420 --> 01:13:19.520
gesagt, schwarz ist was weiß ich.

01:13:20.080 --> 01:13:24.860
So, noch eine speziale Form, das ist aber jetzt die letzte, ich

01:13:24.860 --> 01:13:25.360
verspreche es.

01:13:27.740 --> 01:13:31.100
Und zwar gibt es die sogenannten Qualifizierer.

01:13:32.340 --> 01:13:39.720
Die Qualifizierer sind das eigentlich, ja, braucht man es ziemlich

01:13:39.720 --> 01:13:41.940
selten, aber ich erkläre es trotzdem.

01:13:42.460 --> 01:13:46.300
Also Sie sagen jetzt, Sie haben eine Bank, und bei der Bank führen

01:13:46.300 --> 01:13:47.740
Personen Konten.

01:13:49.560 --> 01:13:55.120
Und sagen Sie, also eine Person in diesem Falle kann eine Person bei

01:13:55.120 --> 01:13:59.020
der Bank entweder null oder ein Konto haben.

01:13:59.220 --> 01:14:01.420
Also es gibt auch Leute, die haben kein Konto bei der Bank.

01:14:02.960 --> 01:14:06.140
Eine Person kann bei der Bank eine oder mehrere Konten haben.

01:14:08.580 --> 01:14:12.500
So, aber was Sie jetzt sagen mit diesem komischen Ding hier, mit

01:14:12.500 --> 01:14:18.420
dieser Qualifizierung, dass Sie jetzt damit die Personen, die

01:14:18.420 --> 01:14:21.900
Bankkonten bei der Bank führen, unterscheiden können.

01:14:22.820 --> 01:14:26.060
Es gibt gewissermaßen einen Schlüssel für diese Person, und das ist

01:14:26.060 --> 01:14:28.380
natürlich bei der Bank ganz einfach, die Kontonummer, die ist sogar

01:14:28.380 --> 01:14:29.320
eindeutig.

01:14:29.320 --> 01:14:35.560
Ich sage also, geben Sie die Nummer 2232085, dann ist das Person XYZ.

01:14:36.420 --> 01:14:39.940
Es gibt zu dieser Kontonummer nur eine Person, muss aber gar nicht

01:14:39.940 --> 01:14:43.680
eindeutig sein, es muss lediglich notwendig sein, eine Attribute, die

01:14:43.680 --> 01:14:45.320
eine Partitionierung erlaubt.

01:14:46.780 --> 01:14:47.960
Und zwar helfen oder mehr.

01:14:50.060 --> 01:14:53.160
Oder Sie nehmen das Schachbrett, Schachbrett besteht natürlich aus

01:14:53.160 --> 01:14:57.080
Quadraten, siehe da, hier ist die schwarze Raute, das Quadrat für sich

01:14:57.080 --> 01:14:58.460
alleine kann ich wohl kaum brauchen.

01:15:00.720 --> 01:15:04.060
Aber darauf kommt es jetzt nicht an, sondern es kommt darauf an, dass

01:15:04.060 --> 01:15:11.160
ich vom Schachbrett aus gesehen eines der 64 Quadrate eindeutig

01:15:11.160 --> 01:15:13.440
identifizieren kann über seine Zeile und die Spalte.

01:15:15.640 --> 01:15:17.000
Das ist die Idee dahinter.

01:15:23.560 --> 01:15:27.760
So, und eine qualifizierte Assoziation ist dann eine, die halt einen

01:15:27.760 --> 01:15:28.700
Qualifizierer dran.

01:15:31.840 --> 01:15:35.040
Wir werden dann später sehen, wie man das implementiert, ist aber auch

01:15:35.040 --> 01:15:39.580
gar nicht schwierig zu implementieren, denn für diese, kann ich Ihnen

01:15:39.580 --> 01:15:42.960
auch gleich sagen, den Qualifizierer implementieren Sie über ein

01:15:42.960 --> 01:15:43.500
Hashmap.

01:15:45.000 --> 01:15:48.820
Der Hashmap sagt Ihnen zu einem Schlüssel, wer die Person ist.

01:15:48.940 --> 01:15:50.080
Der Schlüssel ist die Kontonummer.

01:15:51.460 --> 01:15:52.200
Ganz einfach.

01:15:56.200 --> 01:15:57.780
So, was haben wir jetzt noch?

01:15:58.900 --> 01:16:02.300
Okay, das haben wir eigentlich schon besprochen.

01:16:03.840 --> 01:16:09.300
Das sind jetzt ein paar Details über diese Assoziationsdinger, die

01:16:09.300 --> 01:16:12.620
dürfen Sie aber selber sich durchdenken.

01:16:15.740 --> 01:16:21.260
Das ist nämlich immer ein 1 zu 1 oder M zu N Assoziation, aber da

01:16:21.260 --> 01:16:22.780
müssen Sie eigentlich was anderes schreiben.

01:16:24.320 --> 01:16:29.360
Denn hier geben Sie die Partitionsgröße an und nicht Stern, sondern

01:16:29.360 --> 01:16:30.800
geben hier die Partitionsgröße an.

01:16:30.920 --> 01:16:32.540
Es sind Partitionsgröße 0 oder 1.

01:16:33.220 --> 01:16:34.400
Im Fall der Bank nur.

01:16:35.180 --> 01:16:40.320
Das ist die Zahl, die Sie dort hinschreiben.

01:16:40.700 --> 01:16:43.220
Normalerweise würden Sie ohne Qualifizierung eben 0 bis Stern oder

01:16:43.220 --> 01:16:44.140
einfach nur Stern haben.

01:16:44.800 --> 01:16:47.600
Wenn Sie partitionieren, dann sagen Sie hier 0 oder 1, ich habe eine

01:16:47.600 --> 01:16:50.320
Kontonummer, sie ist entweder einer Person zugeordnet oder gar nicht.

01:16:51.700 --> 01:16:52.380
Noch frei.

01:16:56.300 --> 01:16:57.780
So, wie lese ich das jetzt eigentlich?

01:16:57.780 --> 01:17:01.760
Da sind immer wieder die gleichen Assoziationen anders ausgedrückt.

01:17:02.600 --> 01:17:03.940
Wie kann ich das jetzt lesen?

01:17:04.080 --> 01:17:08.060
Also wir haben hier Bank, Kontonummer, Qualifizierung und Person.

01:17:08.760 --> 01:17:13.800
Bei der Bank X sind keine oder maximal eine Person der Kontonummer Y

01:17:13.800 --> 01:17:14.600
zugeordnet.

01:17:14.920 --> 01:17:16.660
Das bedeutet es 0 zu 1.

01:17:17.240 --> 01:17:22.320
Nicht nur eine einzelne Person, sondern pro Kontonummer eine Person

01:17:22.320 --> 01:17:22.960
maximal.

01:17:23.660 --> 01:17:27.040
Niemand oder maximal eine Person besitzt das Konto mit der Nummer Y

01:17:27.040 --> 01:17:28.440
bei der Bank X.

01:17:28.720 --> 01:17:30.360
Das ist die gleiche Nummer anders ausgedrückt.

01:17:30.840 --> 01:17:33.820
Eine Person muss mindestens eine Kontonummer bei mindestens einer Bank

01:17:33.820 --> 01:17:34.600
zugeordnet sein.

01:17:34.680 --> 01:17:35.320
Das kommt hier her.

01:17:36.220 --> 01:17:38.960
Eine Person darf beliebig viele Kontonummer bei einer Bank, eine

01:17:38.960 --> 01:17:42.520
Kontonummer bei beliebig vielen Banken oder beliebig viele Kontonummer

01:17:42.520 --> 01:17:44.000
bei beliebig vielen Banken haben.

01:17:44.500 --> 01:17:45.740
Das ist alles erlaubt.

01:17:48.540 --> 01:17:52.740
Okay, das überspringen wir jetzt auch.

01:17:56.640 --> 01:17:58.340
Das können Sie sich auch überlegen.

01:17:58.480 --> 01:18:01.240
Wozu kann ich dieses Zeug eigentlich mit den Assoziationen benutzen?

01:18:01.700 --> 01:18:02.940
Vielleicht fällt Ihnen nochmal mehr ein.

01:18:04.260 --> 01:18:07.140
Aber wir haben jetzt noch ein bisschen Aufräumerarbeit zu machen.

01:18:08.200 --> 01:18:11.560
Sie wissen ja, in Java haben Sie auch noch statische Attribute.

01:18:12.120 --> 01:18:13.340
Die gibt es in UML auch.

01:18:13.760 --> 01:18:14.640
Die heißen nur anders.

01:18:14.640 --> 01:18:18.080
Die heißen Klassenattribute und Klassenmethoden.

01:18:19.040 --> 01:18:21.920
Die Klasse als Menge der Exemplare eines Typs wird selbst auch als

01:18:21.920 --> 01:18:24.960
Objekt aufgefasst, die Klasse selbst als Objekt aufgefasst.

01:18:25.440 --> 01:18:29.520
Da kann sie selbst eigene Attribute und Methoden besitzen, unabhängig

01:18:29.520 --> 01:18:31.960
von den Attributen und Methoden der Exemplare.

01:18:34.880 --> 01:18:39.160
Diese Bezeichnung als Klassenattribute oder Klassenmethoden, in Java

01:18:39.160 --> 01:18:42.780
eben als Static Methods, als statische Methoden.

01:18:44.260 --> 01:18:45.620
Wie werden die angegeben?

01:18:45.700 --> 01:18:46.540
Durch unterstreichen.

01:18:49.520 --> 01:18:51.480
Das heißt also, diese Attribute bzw.

01:18:51.480 --> 01:18:54.140
Methode gibt es immer, ob Sie eine Instanz haben oder nicht.

01:18:54.340 --> 01:18:59.460
Das kennen wir zum Beispiel aus der Mathematikklasse in Java.

01:18:59.800 --> 01:19:04.880
Da gibt es Pi und Sinus und Kosinus, und die gibt es, die können Sie

01:19:04.880 --> 01:19:07.660
aufrufen, selbst wenn Sie keine Instanz davon gebildet haben.

01:19:09.060 --> 01:19:13.380
Ah ja, da haben wir das Beispiel, E und Pi zum Beispiel, unterstrichen

01:19:13.380 --> 01:19:16.160
heißt bei den Attributen statisch, bzw.

01:19:17.100 --> 01:19:19.000
Klassenattribut und Klassenmethode.

01:19:21.800 --> 01:19:24.060
Das ist einfach wieder unterstreichen erledigt.

01:19:25.260 --> 01:19:26.740
Java mit Static, das ist klar.

01:19:27.180 --> 01:19:30.740
Wenn Sie aber auf eine Instanz zugreifen, haben Sie auch Zugriff auf

01:19:30.740 --> 01:19:33.660
die Klassenattribute und Klassenmethoden.

01:19:34.700 --> 01:19:37.780
Sie können sie also ganz normal mit der Punktnotation zum Beispiel

01:19:37.780 --> 01:19:38.260
aufrufen.

01:19:39.120 --> 01:19:43.160
Sie werden gewissermaßen eingeblendet, so als wären sie vorhanden.

01:19:45.740 --> 01:19:49.560
So, jetzt haben wir also behandelt, was sind Klassen, was sind

01:19:49.560 --> 01:19:53.160
Attribute, was ist Gleichheit, was ist Assoziation.

01:19:53.300 --> 01:19:54.760
Da haben wir ziemlich viel zu sagen gehabt.

01:19:56.420 --> 01:19:58.500
Was wir jetzt vermieden haben, ist noch Vererbung.

01:19:58.820 --> 01:20:00.960
Die Vererbung schauen wir uns auch noch an.

01:20:02.020 --> 01:20:05.660
Aber das kennen Sie natürlich schon, da kann ich mich kurz darüber

01:20:05.660 --> 01:20:06.460
unterhalten.

01:20:06.620 --> 01:20:09.640
Angenommen, wir haben eine Klasse Bandlaufwerk, die hat die Methoden

01:20:09.640 --> 01:20:15.220
Play, Record, Magnetkopf kalibrieren oder so, was glaube ich heißt

01:20:15.220 --> 01:20:15.400
das.

01:20:17.080 --> 01:20:20.600
Und die hat jetzt Unterklassen, ein Bandlaufwerk, gibt es einen Dat

01:20:20.600 --> 01:20:23.540
-Rekorder, einen Kassettendeck, gibt es glaube ich noch einen

01:20:23.540 --> 01:20:24.300
Videorekorder.

01:20:25.540 --> 01:20:27.920
MP3 -Spieler ist es nicht, der hat normalerweise kein Band.

01:20:28.840 --> 01:20:33.700
Das sind unterschiedliche Arten von Bandlaufwerken und wir wissen,

01:20:33.920 --> 01:20:37.220
dass wir das hier natürlich die Unterklassen nennen oder auch

01:20:37.220 --> 01:20:39.340
Subklasse oder auch Spezialisierung.

01:20:40.360 --> 01:20:44.800
Das Kassettendeck hat sicher ein anderes Lesegerät als ein digitaler

01:20:44.800 --> 01:20:47.040
Rekorder, ein digitales Bandlist.

01:20:48.960 --> 01:20:52.580
Und das hier nennt man die Oberklasse, manchmal auch Basisklasse,

01:20:53.120 --> 01:20:57.340
Superklasse oder Generalisierung dieser Klassen.

01:20:58.780 --> 01:20:59.420
Ja.

01:21:06.510 --> 01:21:07.850
Ich gehe nochmal zurück.

01:21:07.950 --> 01:21:11.250
Im Wesentlichen, wenn wir zurückgehen auf unsere Definition, da sagten

01:21:11.250 --> 01:21:17.030
wir ja, eine Klasse ist eigentlich nichts anderes als eine Menge, eine

01:21:17.030 --> 01:21:21.650
mehr oder weniger beliebige Kategorie, also eine Untermenge der Menge

01:21:21.650 --> 01:21:22.430
aller Objekte.

01:21:24.110 --> 01:21:29.370
Diese Unterklassen teilen diese Klassen nochmal auf in andere

01:21:29.370 --> 01:21:32.610
Untermengen, die natürlich in dieser Menge enthalten sind.

01:21:32.950 --> 01:21:36.770
Es ist klar, dass alle Videorekorder in meinem System oder in meiner

01:21:36.770 --> 01:21:40.370
Welt zur Menge der Bandlaufwerke gehören.

01:21:42.930 --> 01:21:47.050
Man muss dabei noch unterscheiden, ob diese Klassen disjunkt sind,

01:21:47.170 --> 01:21:48.410
diese Subklassen disjunkt sind.

01:21:48.490 --> 01:21:49.810
In unserem Fall sind sie das.

01:21:53.310 --> 01:21:55.810
Der Videorekorder, Daterekorder und Kassettendeck, das sind

01:21:55.810 --> 01:21:56.990
tatsächlich andere Geräte.

01:21:57.230 --> 01:21:59.090
Die arbeiten mit anderen Prinzipien.

01:22:00.270 --> 01:22:03.430
Aber es gibt so Spezialfälle, wo diese Klassen nicht unbedingt

01:22:03.430 --> 01:22:04.150
disjunkt sind.

01:22:04.510 --> 01:22:07.750
Man würde versuchen, das immer möglichst zu erreichen, aber manchmal

01:22:07.750 --> 01:22:08.690
gibt es es halt nicht.

01:22:11.650 --> 01:22:15.090
Zum Beispiel gibt es da das Tier, das heißt der Platypus.

01:22:15.530 --> 01:22:16.710
Haben Sie schonmal was davon gehört?

01:22:17.550 --> 01:22:24.730
Platypus, das sieht so ähnlich aus wie ein Biber, hat einen flachen

01:22:24.730 --> 01:22:29.610
Schwanz, aber es legt Eier und säugt seine Jungen.

01:22:31.310 --> 01:22:32.970
Legt Eier und säugt seine Jungen.

01:22:33.490 --> 01:22:35.830
Das heißt also Säugetiere, ich weiß nicht, wie heißt die andere

01:22:35.830 --> 01:22:40.570
Klasse, Eierlegende, nicht die Wollmilchsau, sondern Vögel hätte ich

01:22:40.570 --> 01:22:41.850
fast gesagt, aber das stimmt ja auch nicht.

01:22:41.850 --> 01:22:49.170
Also es gibt gelegentlich solche Probleme, dass die Unterklassen nicht

01:22:49.170 --> 01:22:50.410
unbedingt disjunkt sind.

01:22:53.030 --> 01:22:57.390
Aber das sind Spezialisierungen, zum Beispiel ist es dann so, dass

01:22:57.390 --> 01:23:01.510
gerade beim Programmieren dann Attributmengen oder Attributwerte sind,

01:23:02.230 --> 01:23:03.850
für die ich Teilmengen bilden kann,

01:23:07.470 --> 01:23:10.290
sodass ich diese Untermengen bilde.

01:23:10.290 --> 01:23:15.990
Zum Beispiel könnt ihr sagen, hier Typ des Bandes, dann wäre das ein

01:23:15.990 --> 01:23:22.770
digitales Band und das hier wäre jeweils Analogbänder.

01:23:26.190 --> 01:23:30.810
Da könnte ich also jetzt nochmal diese beiden zusammenfassen, als

01:23:30.810 --> 01:23:35.070
Audioabspielgeräte, noch eine Unterklasse dazwischen schieben,

01:23:35.650 --> 01:23:38.550
Audioabspielgeräte, dann Videoabspielgeräte, und dann sagen, das ist

01:23:38.550 --> 01:23:41.510
aber ein analoges Band mit analoger Speicherung.

01:23:43.690 --> 01:23:46.370
Also ich fasse diese Unterklassen dann immer zusammen, weil sie

01:23:46.370 --> 01:23:50.410
zusätzliche Eigenschaften haben, die sie gemeinsam besitzen, aber

01:23:50.410 --> 01:23:52.490
nicht alle der Oberklasse besitzen.

01:23:54.610 --> 01:23:55.910
Damit kriege ich diese Untermengen.

01:24:01.390 --> 01:24:04.310
Wenn ich also so eine Situation habe, dass ich diese Untermengen

01:24:04.310 --> 01:24:08.290
bilden kann, die ich für sich betrachtet behandeln möchte, dann

01:24:08.290 --> 01:24:13.910
vermeide ich Redundanz, weil ich nicht alle Attribute liefern muss,

01:24:14.030 --> 01:24:14.490
zum Beispiel.

01:24:16.890 --> 01:24:22.630
So, und jetzt kommt ein wichtiges Prinzip, das sogenannte

01:24:22.630 --> 01:24:23.830
Substitutionsprinzip.

01:24:24.410 --> 01:24:32.970
Das Substitutionsprinzip sagt folgendes, Jedes Exemplar einer Klasse

01:24:32.970 --> 01:24:36.670
hat die gleichen Eigenschaften wie ein Exemplar seiner Oberklasse.

01:24:37.610 --> 01:24:41.170
Hat also alle Eigenschaften, das heißt also alle Attribute, alle

01:24:41.170 --> 01:24:46.090
Methoden, das kann ich Ihnen erklären, wie ein Exemplar seiner

01:24:46.090 --> 01:24:46.570
Oberklasse.

01:24:46.810 --> 01:24:49.090
Wenn es kein Exemplar der Oberklasse gibt, dann ist es egal.

01:24:49.990 --> 01:24:53.570
Es lässt sich daher genauso wie ein Oberklassenelement verwenden.

01:24:54.250 --> 01:24:58.190
Das heißt, wenn Sie ein Programm haben, das mit einem

01:24:58.190 --> 01:25:02.530
Oberklassenelement richtig arbeitet, und Sie geben diesem Programm

01:25:02.530 --> 01:25:06.270
jetzt irgendwo an der Stelle als Parameter ein Unterklassenelement,

01:25:07.610 --> 01:25:09.110
dann läuft es ebenso.

01:25:10.170 --> 01:25:13.690
Weil alles, was das Programm, das auf das Oberklassenelement

01:25:13.690 --> 01:25:18.570
abgestimmt ist, an Methoden abfragt, muss ja die Unterklasse auch

01:25:18.570 --> 01:25:18.850
haben.

01:25:19.590 --> 01:25:21.530
Das nenne ich also das Substitutionsprinzip.

01:25:21.530 --> 01:25:24.830
Sie können an jeder Stelle in einem Programm, wo ein

01:25:24.830 --> 01:25:28.370
Oberklassenelement benutzt wird, korrekt als Oberklassenelement und

01:25:28.370 --> 01:25:31.370
nur aufgrund der Eigenschaften des Oberklassenelements benutzt wird,

01:25:31.650 --> 01:25:33.170
ein Unterklassenelement reinschieben.

01:25:35.290 --> 01:25:38.890
Ich kann das natürlich kaputt machen, indem ich dumm programmiere,

01:25:38.990 --> 01:25:41.170
indem ich dieses Substitutionsprinzip verletze.

01:25:41.450 --> 01:25:42.310
Das ist durchaus möglich.

01:25:43.130 --> 01:25:47.070
Aber genau das sollten wir vermeiden, denn sonst funktioniert die

01:25:47.070 --> 01:25:48.330
ganze Vererbung nicht mehr richtig.

01:25:49.130 --> 01:25:52.570
Denn dieses Substitutionsprinzip wird an vielen Stellen benutzt.

01:25:54.410 --> 01:25:57.690
Das heißt also, alle Eigenschaften der Oberklasse muss sich auch in

01:25:57.690 --> 01:26:00.030
der Unterklasse zur Verfügung stellen, alle Methoden, ich kann die

01:26:00.030 --> 01:26:04.630
nicht einfach beliebig weglassen, oder den Namen mit einer anderen

01:26:04.630 --> 01:26:05.830
Funktion unterlegen.

01:26:11.750 --> 01:26:14.230
Substitutionsprinzip, jetzt mal erst ein Gegenbeispiel.

01:26:16.530 --> 01:26:20.590
Angenommen, ich habe einen Punkt und ich gehe her und sage, naja, ich

01:26:20.590 --> 01:26:23.590
brauche eine Linie, eine Linie hat zwei Punkte, also mache ich das

01:26:23.590 --> 01:26:26.030
Ding, faul wie ich bin, als eine Unterklasse.

01:26:27.750 --> 01:26:31.250
Ich bin gleich soweit, können Sie noch warten, entquatschen?

01:26:32.310 --> 01:26:33.410
Ist das eine gute Idee?

01:26:35.270 --> 01:26:37.170
Linie als Unterklasse von Punkt.

01:26:38.190 --> 01:26:39.930
Nein, Sie schütteln schon den Kopf, ich sehe es.

01:26:40.950 --> 01:26:43.310
Denn eine Linie ist kein Sonderfall eines Punktes.

01:26:44.510 --> 01:26:46.970
Sondern diese Modellierung ist einfach nur faul, faul in zwei

01:26:46.970 --> 01:26:49.990
Leistungen, Sie waren faul beim Programmieren, und die Modellierung

01:26:49.990 --> 01:26:52.470
selbst ist faul, da ist was faul dran.

01:26:53.270 --> 01:26:56.010
Sie wollen nämlich nicht sagen, hier ist eine Linie, behandeln Sie sie

01:26:56.010 --> 01:26:57.230
wie einen Punkt an irgendeiner Stelle.

01:26:58.150 --> 01:26:59.150
Das wird schief gehen.

01:27:03.510 --> 01:27:06.590
So, vererbte Eigenschaften stehen in der Unterklasse so zur Verfügung

01:27:06.590 --> 01:27:09.870
wie in der Oberklasse, allerdings kann ich die Unterklasse

01:27:09.870 --> 01:27:12.170
spezialisieren, ist ja eine kleinere Menge.

01:27:12.170 --> 01:27:15.810
Das heißt, ich kann zusätzliche Attribute hinzufügen, zusätzliche

01:27:15.810 --> 01:27:18.210
Methoden hinzufügen, die sich spezieller machen.

01:27:19.950 --> 01:27:21.430
Sie kann nichts weglassen.

01:27:27.270 --> 01:27:30.850
Wenn Sie stattdessen etwas weglassen wollten, dann nehmen Sie es auch

01:27:30.850 --> 01:27:34.070
aus der Oberklasse heraus und benutzen die Delegation dorthin.

01:27:34.890 --> 01:27:38.010
Das heißt, Sie haben ein anderes Objekt und sagen, die Operation kommt

01:27:38.010 --> 01:27:39.150
von einem anderen Objekt her.

01:27:40.910 --> 01:27:43.430
Dann kann ich auch Implementierungsredundanz vermeiden.

01:27:44.850 --> 01:27:46.810
Also, meine letzte Folie für heute.

01:27:48.430 --> 01:27:52.250
Angenommen, wir haben diese Vererbungshierarchie, Hund, Canis,

01:27:52.350 --> 01:27:58.410
Subklasse Wolf, Canis Lupus, Subklasse Polarwolf, Canis Lupus Arctos,

01:27:58.550 --> 01:27:59.410
ist tatsächlich so.

01:28:00.470 --> 01:28:04.030
Also, Wolf ist tatsächlich eine Unterklasse von Hund.

01:28:06.470 --> 01:28:08.010
Und nicht umgekehrt.

01:28:08.470 --> 01:28:09.930
Obwohl der Hund vom Wolf abstammt.

01:28:09.990 --> 01:28:10.570
Aber so ist es.

01:28:11.730 --> 01:28:14.910
Also, der Hund kann heulen.

01:28:19.130 --> 01:28:20.290
Der Wolf ist ein Hund.

01:28:20.750 --> 01:28:23.150
Der Wolf erbt die Methode heulen vom Hund, so heißt es.

01:28:23.790 --> 01:28:25.530
Ich kann sie überschreiben, aber er braucht sie.

01:28:26.730 --> 01:28:29.490
Der Polarwolf erbt alle Methoden vom Wolf, inklusive heulen.

01:28:29.810 --> 01:28:31.770
Das heißt, der Polarwolf kann ebenfalls heulen.

01:28:33.230 --> 01:28:34.430
So, das war es.

01:28:35.050 --> 01:28:35.470
Vielen Dank.

