UML + Python Frage(n)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Assemblage23
User
Beiträge: 4
Registriert: Sonntag 25. April 2010, 13:52

Hi,

kann mir bitte jemand ein paar Fragen zu einem UML Klassendiagramm beantworten?

Zunächst die Frage
1) Wenn ich eine Klasse A und eine Klasse B habe. Klasse A besitzt eine Methode getIrgendwas() diese liefert ein Objekt der Klasse B zurück. In welcher Beziehung stehen diese 2 Klassen nun? Oder ist das gar keine Beziehung ?


2) Wenn Klasse A als Attribut eine Referenz auf ein Objekt von Klasse B hat und Klasse B eine Referenz auf ein Objekt der Klasse A. Was ist das für eine Beziehung, bzw gibts sowas überhaupt oder macht das Sinn ?

3) Kapselung in Python. Ich bin mir hier mit der Doku nicht ganz im klaren ( oder mein Englisch ist zu schlecht )

Code: Alles auswählen

class Test:
  def __init__(self):
    pass
  def mytest1(self):
    print "mytest1"
  def _mytest2(self):
    print "mytest2"
  def __mytest3(self):
    print "mytest3"
  def privateTest(self):
    self.__mytest3()

t = Test()
t.mytest1()
t._mytest2()
t.__mytest3()
t.privateTest()

Warum funktioniert t._mytest2() ? Ich dachte das wäre auch private genauso wie __

Danke für eure Antworten !
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ad 3) Kapselung gibt es nicht. Zumindest keine die vom Compiler oder Interpreter erzwungen wird, sowohl `_`, als auch `__` stehen nicht fuer `private`.

http://tutorial.pocoo.org/classes.html# ... -variablen
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Zu 1 und 2:

Was meinst du mit "was für Beziehungen" das sind? So etwas wie Komposition oder Aggregation? Diese existieren ja nur auf dem Papier bzw. bei der Modellierung. Einer Referenz auf eine Klasse siehst du im Code so direkt nicht an, was für eine Beziehung das ist.

Gegenseitige Referenzierung geht schon, ob es Sinn macht hängt natürlich immer vom Fall ab, einen speziellen Namen gibt es mMn dafür nicht.

Gruß,
r.
BlackJack

@Assemblage23: Bei 2) bin ich mir nicht sicher was Du da meinst, bzw. habe ich den Verdacht Du hast nicht das geschrieben was Du eigentlich wissen wolltest. Soll das wirklich "Klasse A [hat] als Attribut eine Referenz auf ein Objekt von Klasse B" heissen oder meintest Du da "Ein Objekt von Klasse A…"!? Deine Frage könnte man nämlich so verstehen:

Code: Alles auswählen

class A(object):
    pass

class B(object):
    a = A()

A.b = B()
Zu 3) Ich gehöre zu den Leuten die Kapselung und Zugriffschutz als zwei unterschiedliche Sachen ansehen. Kapselung kann man mit Python machen: Einfach nicht auf die "Innereien" von Objekten zugreifen. Erzwungen wird's halt nur nicht.
Assemblage23
User
Beiträge: 4
Registriert: Sonntag 25. April 2010, 13:52

Danke erstmal für alle antworten

@ BlackJack Ja, das bin ich mir selber auch nicht mehr ....


Ich versuche es hier nochmal deutlich zu machen.

Code: Alles auswählen



def main():
	class Aggregat:
		def __init__(self):
			self.refVonObjektDerKlasseKomponente1 = Komponente1()
			self.refVonObjektDerKlasseKomponente2 = Komponente2()
			self.name = "Aggregat"
	
	class Komponente1:
		def __init__(self):
			self.name = "Komponente1"
	class Komponente2:
		def __init__(self):
			self.name = "Komponente2"
			
	agg = Aggregat()
	print agg.name
	print agg.refVonObjektDerKlasseKomponente1.name
	print agg.refVonObjektDerKlasseKomponente2.name
	
if __name__ == "__main__":
	main()

So habe ich es jetzt ( vereinfacht ) gebaut.
Die Aufgaben wurden in der Schulklasse verteilt und ich habe diese 3 Klassen bekommen. Meine Klasse Aggregat ( heißt natürlich anders ) wird aus einer anderen Klasse abgeleitet ( das muss jemand anders machen ).

Der Code funktioniert soweit auch. Meine Frage ist jetzt aber ob das UML dazu passt. Ich habe es mal hier reingestellt.

Außerdem würde ich gerne wissen ob ich ( falls es mit der Komposition passt ) die Raute 2 mal machen muss oder wie in dem Beispiel zusammgeführt werden kann.

Bild
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Morgen.

Das passt jetzt ja mal nicht zu deinen Fragen!

Das ist jetzt eine ganz normale Komposition, was hat das mit den Fragen 1 und 2 zu tun?

Bei dem Diagramm solltest du übrigens die Verbindungen nicht zusammen legen.

Und noch was: zieh die class-Definitionen aus der main() Funktion raus:

Code: Alles auswählen

class Aggregat:
    def __init__(self):
        self.refVonObjektDerKlasseKomponente1 = Komponente1()
        self.refVonObjektDerKlasseKomponente2 = Komponente2()
        self.name = "Aggregat"
   
class Komponente1:
    def __init__(self):
        self.name = "Komponente1"
class Komponente2:
    def __init__(self):
        self.name = "Komponente2"

def main():
               
    agg = Aggregat()
    print agg.name
    print agg.refVonObjektDerKlasseKomponente1.name
    print agg.refVonObjektDerKlasseKomponente2.name
   
if __name__ == "__main__":
    main()
Assemblage23
User
Beiträge: 4
Registriert: Sonntag 25. April 2010, 13:52

Vielen Dank habe mein UML entsprechend geändert, kannst du mir noch Frage 1) beantworten?

Ich denke es ist eine Assoziation ?
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Assemblage23 hat geschrieben:Ich denke es ist eine Assoziation ?
Warum?
Assemblage23
User
Beiträge: 4
Registriert: Sonntag 25. April 2010, 13:52

1) Sie stehen in Verbindung und Assoziation ist laut Wikipedia die geringste Form der Abhängigkeit?

Wie gesagt nur ne Vermutung wir haben in der Schule noch fast kein Material bekommen nur den Hinweis auf wikipedia zu schauen....
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Assemblage23 hat geschrieben:1) Sie stehen in Verbindung und Assoziation ist laut Wikipedia die geringste Form der Abhängigkeit?

Wie gesagt nur ne Vermutung wir haben in der Schule noch fast kein Material bekommen nur den Hinweis auf wikipedia zu schauen....
AFAIK ist Assoziation und Aggregation nicht wirklich klar definiert und die Verwendung liegt im Ermessen des Designers.

Edit: Ja, Wikipedia sieht das genauso: "Eine exakte Definition wird in der UML2 nicht gegeben, vielmehr wird darauf verwiesen, dass eine Aggregation je nach Anwendung und Modellierer variiert. "
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
BlackJack

Und den Unterschied zwischen Aggregation und Komposition kann man aus den Klassen auch nicht ersehen, weil der in der Bedeutung liegt. Es gibt da die Faustregel, dass es davon abhängt ob ein Objekt ohne die Einzelteile auskommt. Aber das ist halt in vielen Fällen auch wieder Ansichtssache. Ist das Gehirn unverzichtbarer Bestandteil? Eigentlich ja, aber es gibt ja 'n Haufen Bild-Leser -- also vielleicht doch nicht. ;-)
Antworten