Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/16 13:35] – msuter | modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/23 09:11] (aktuell) – msuter | ||
---|---|---|---|
Zeile 10: | Zeile 10: | ||
//Abb: 1:n Beziehung// | //Abb: 1:n Beziehung// | ||
- | {{: | ||
- | |||
- | //Abb: n:n Beziehung// | ||
=== Kardinalität === | === Kardinalität === | ||
Zeile 26: | Zeile 23: | ||
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 der Liste (Anzahl der gespeicherten Objekte) | + | Die Methode '' |
- | * dem **Abrufen** einer Referenz über einen Index. Dieser muss abger gegen den size der Liste geprüft | + | Dazu prüfen wir zunächst, ob das '' |
- | * dem **Entfernen** einer Referenz aus der Liste | + | |
<code python> | <code python> | ||
- | | + | ... |
- | def size(self): | + | 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 der Liste. | ||
+ | <code python> | ||
+ | | ||
+ | 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 '' | ||
+ | </ | ||
---- | ---- |