Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/10 15:12] – angelegt msuter | modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/23 09:11] (aktuell) – msuter | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== LU09a - Mehrfachbeziehung ====== | ====== LU09a - Mehrfachbeziehung ====== | ||
- | Aus der realen Welt sind Mehrfachbeziehungen bestens bekannt. So weist eine Schulklasse viele Lernende auf, eine Feriendestination kann von vielen Personen gebucht werden und umgekehrt kann eine Person viele Destinationen besuchen.\\ | + | Aus der realen Welt sind Mehrfachbeziehungen bestens bekannt. |
- | Diese beiden Fälle können wie folgt in UML dargestellt werden.\\ | + | So weist eine Schulklasse viele Lernende auf, eine Feriendestination kann von vielen Personen gebucht werden und umgekehrt kann eine Person viele Destinationen besuchen. |
- | {{:modul:m320: | + | |
- | //Abb 5.9 : //1:n Beziehung\\ | + | Diese beiden Fälle können wie folgt in UML dargestellt werden. |
- | \\ | + | |
- | {{: | + | {{:modul:m320_2024: |
- | //Abb 5.10 : //n:n Beziehung\\ | + | |
+ | //Abb: 1:n Beziehung// | ||
=== Kardinalität === | === Kardinalität === | ||
- | Die Kardinalität gibt an, wie mengenmässig eine Beziehung aussieht.\\ | + | Die Kardinalität gibt an, wie mengenmässig eine Beziehung aussieht. |
Vereinfacht kann man von | Vereinfacht kann man von | ||
* 1:1 Beziehung (ein Objekt kennt genau ein anderes Objekt) | * 1:1 Beziehung (ein Objekt kennt genau ein anderes Objekt) | ||
* 1:n Beziehung (ein Objekt kenntviele andere Objekte) | * 1:n Beziehung (ein Objekt kenntviele andere Objekte) | ||
* n:n Beziehung (ein Objekt kennt viele andere Objekte und umgekehrt) | * n:n Beziehung (ein Objekt kennt viele andere Objekte und umgekehrt) | ||
- | sprechen. Dabei steht **n** für den Begriff ' | + | |
+ | sprechen. | ||
+ | Dabei steht **n** für den Begriff ' | ||
Dies wird in der UML mit einem Stern (** * **) wiedergegeben. | Dies wird in der UML mit einem Stern (** * **) wiedergegeben. | ||
Der Stern steht für **0 bis unendliche viele** Beziehungen. | Der Stern steht für **0 bis unendliche viele** Beziehungen. | ||
In der UML ist es aber auch möglich, die Kardinalität ganz genau zu spezifizieren. | In der UML ist es aber auch möglich, die Kardinalität ganz genau zu spezifizieren. | ||
- | So ist in der Abbildung | + | So ist in der Abbildung klar erkennbar, dass eine Schulklasse mindesten 15 aber maximal 24 Studenten haben kann. |
- | === Umsetzung in Python === | + | ===== Umsetzung in Python |
Kennt ein Objekt viele andere, gleichartige Objekte, werden die Referenzen in einer Liste festgehalten. | Kennt ein Objekt viele andere, gleichartige Objekte, werden die Referenzen in einer Liste festgehalten. | ||
- | In der Regel wird die Methode für das **Zufügen** als **add**-Methode bezeichnet. | + | Ein einheitlicher Prefix bei den Methodennamen hilft bei der Orientierung. |
- | Gegenüber dem Begriff **set** signalisiert **add**, dass eben mehrere Werte gesetzt werden können.\\ | + | * Die Methode für das **Zufügen** |
+ | * Die Methode für das **Zählen** der Listeneinträge wird als **count**-Methode bezeichnet. | ||
+ | * Die Methode um ein Element **abzufragen** wird als **take**-Methode bezeichnet. | ||
+ | * Die Methode für das **Löschen** wird als **remove**-Methode bezeichnet. | ||
Für die oben dargestellte Klasse '' | Für die oben dargestellte Klasse '' | ||
+ | ==== Beziehungen hinzufügen (**add**)==== | ||
<code python> | <code python> | ||
class SchoolClass: | class SchoolClass: | ||
- | + | | |
- | | + | |
- | | + | |
- | | + | |
| | ||
- | | + | |
- | | + | if len(self._students) < 24: |
- | self._students.append(a_student) | + | self._students.append(a_student) |
</ | </ | ||
- | Weitere wichtige Methoden dienen | + | === Duplikate vermeiden === |
- | * dem **Abfragen** der Grösse | + | Die Methode '' |
- | * dem **Abrufen** einer Referenz über einen Index. Dieser muss abger gegen den size der Liste geprüft werden, damit kein unerlaubter Zugriff erfolgt! | + | Dazu prüfen wir zunächst, ob das '' |
- | * dem **Entfernen** einer Referenz aus der Liste | + | |
+ | <code python> | ||
+ | ... | ||
+ | def add_student(a_student): | ||
+ | if not a_student in self._students: | ||
+ | if len(self._students) < 24: | ||
+ | self._students.append(a_student) | ||
+ | </ | ||
+ | |||
+ | ==== Anzahl Listeneinträge abfragen (**count**) ==== | ||
+ | Diese Property liefert die Grösse | ||
<code python> | <code python> | ||
- | @proprty | + | @property |
- | def size(self): | + | def count_students(self): |
| | ||
- | + | </ | |
- | def take_student(self, | + | |
+ | ==== Lesen eines Objekts (**take**) ==== | ||
+ | Diese Methode dient dazu, ein bestimmtes Element aus der Liste zu lesen. | ||
+ | Dies erfolgt entweder ... | ||
+ | * ... über den Index des Listenelements | ||
+ | * ... einen eindeutigen Wert (Key) | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | def take_student(self, | ||
+ | if index is not None: # Index wurde angegeben | ||
if index < len(self._students): | if index < len(self._students): | ||
- | return self._students[index] | + | |
else: | else: | ||
- | raise StudentIndexError(' | + | |
- | | + | |
- | def remove_student(self, | + | for student in self._students: |
+ | if student.name == key: | ||
+ | return student | ||
+ | return None | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Löschen einer Beziehung (**remove**) ==== | ||
+ | Diese Methode dient dazu, ein bestimmtes Element aus der Liste zu löschen. | ||
+ | Dies erfolgt entweder ... | ||
+ | * ... über den Index des Listenelements | ||
+ | * ... einen eindeutigen Wert (Key) | ||
+ | |||
+ | <code python> | ||
+ | def remove_student(self, | ||
+ | if index is not None: # Index wurde angegeben | ||
if index < len(self._students): | if index < len(self._students): | ||
- | self._students.remove(index) | + | |
else: | else: | ||
raise StudentIndexError(' | raise StudentIndexError(' | ||
+ | else: # kein Index angegeben, wir suchen nach dem Namen | ||
+ | for idx, student in enumerate(self._students): | ||
+ | if student.name == key: | ||
+ | self._students.remove(idx) | ||
</ | </ | ||
+ | <WRAP center round tip 60%> | ||
+ | Je nach Entwurf der Applikation können die **take**- und **remove**-Methoden auch nur einen der Parameter '' | ||
+ | </ | ||
---- | ---- |