Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m320_2024:learningunits:lu09:mehrfachbeziehung [2024/09/10 15:12] – angelegt msutermodul: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:learningunits:lu05:theorie:lu05-abb5.9_beziehung-1-n.png?575|}}\\ + 
-//Abb 5.9 //1:n Beziehung\\ +Diese beiden Fälle können wie folgt in UML dargestellt werden. 
-\\ + 
-{{:modul:m320:learningunits:lu05:theorie:lu05-abb5.10_beziehung-n-n.png?600|}}\\ +{{:modul:m320_2024:learningunits:lu09:klasseschool.png?600|}} 
-//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 'viele'+ 
 +sprechen.  
 +Dabei steht **n** für den Begriff 'viele'
 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 5.9 klar erkennbar, dass eine Schulklasse mindesten 15 aber maximal 24 Studenten haben kann.+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** wird als **add**-Methode bezeichnet. Gegenüber dem Begriff **set** signalisiert **add**, dass eben mehrere Werte gesetzt werden können. 
 +  * 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 ''SchoolClass'' würde das dann wie folgt aussehen (unter Einhaltung der maximalen Grösse der Klasse) Für die oben dargestellte Klasse ''SchoolClass'' würde das dann wie folgt aussehen (unter Einhaltung der maximalen Grösse der Klasse)
  
 +==== Beziehungen hinzufügen (**add**)====
 <code python> <code python>
 class SchoolClass: class SchoolClass:
- +  def __init__(self, designation): 
-    def __init__(self, designation): +   self._designation = designation 
-       self._designation = designation +   self._students = []  # hier wird eine leere Liste bereitgestellt, die dann die Referenzen der Lernenden hält.
-       self._students = []  # hier wird eine leere Liste bereitgestellt, die dann die Refeenzen der Lernenden hält.+
      
-    def add_student(a_student): +  def add_student(a_student): 
-       if len(self._students) < 24: +    if len(self._students) < 24: 
-          self._students.append(a_student)+      self._students.append(a_student)
 </code> </code>
  
-Weitere wichtige Methoden dienen +=== Duplikate vermeiden === 
-  * dem **Abfragen** der Grösse der Liste (Anzahl der gespeicherten Objekte+Die Methode ''add_student'' kann erweitert werden, um doppelte Einträge zu vermeiden. 
-  * dem **Abrufen** einer Referenz über einen IndexDieser muss abger gegen den size der Liste geprüft werden, damit kein unerlaubter Zugriff erfolgt! +Dazu prüfen wir zunächst, ob das ''student''-Objekt schon in der Liste vorhanden ist. 
-  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) 
 +</code> 
 + 
 +==== Anzahl Listeneinträge abfragen (**count**) ==== 
 +Diese Property liefert die Grösse der Liste.
 <code python> <code python>
-  @proprty +  @property 
-  def size(self):+  def count_students(self):
      return len(self._students)      return len(self._students)
-      +</code> 
-  def take_student(self, index):+ 
 +==== 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, index=None, key=None): 
 +  if index is not None:   # Index wurde angegeben
     if index < len(self._students):     if index < len(self._students):
-       return self._students[index]+      return self._students[index]
     else:     else:
-       raise StudentIndexError('search'+      raise StudentIndexError('search'
-        +  else:   # kein Index angegeben, wir suchen nach dem Namen 
-  def remove_student(self, index):+    for student in self._students:  # Loop über alle student-objekte 
 +      if student.name == key: 
 +        return student 
 +    return None 
 +</code> 
 + 
 + 
 +==== 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, index=None, key=None): 
 +  if index is not None:   # Index wurde angegeben
     if index < len(self._students):     if index < len(self._students):
-       self._students.remove(index)+      self._students.remove(idx)
     else:     else:
       raise StudentIndexError('remove')       raise StudentIndexError('remove')
 +  else:   # kein Index angegeben, wir suchen nach dem Namen
 +    for idx, student in enumerate(self._students):  # Loop über alle student-objekte
 +      if student.name == key:
 +        self._students.remove(idx)
 </code> </code>
  
 +<WRAP center round tip 60%>
 +Je nach Entwurf der Applikation können die **take**- und **remove**-Methoden auch nur einen der Parameter ''index'' bzw. ''key'' anbieten.
 +</WRAP>
  
 ---- ----
  • modul/m320_2024/learningunits/lu09/mehrfachbeziehung.1725973962.txt.gz
  • Zuletzt geändert: 2024/09/10 15:12
  • von msuter