Zugriff auf die Attribute

Experimente mit Kartenhaufen-Objekten

Wir betrachten hier noch einmal die Simulation von Kartenhaufen.

Kartenhaufen

Im letzten Abschnitt wurde eine Klasse Kartenhaufen entwickelt, mit der man Softwareobjekte zur Simulation realer Kartenhaufen erzeugen kann.

Klassendiagramm Kartenhaufen

Hier eine Implementierung zu dieser Klasse Kartenhaufen in Python:

class Kartenhaufen(object):
    def __init__(self):
        self.kartenListe = []
        self.wert = 0

    def hinzufuegen(self, karte):
        self.kartenListe = self.kartenListe + [karte]
        if karte[2] == 'A':
            kartenwert = 11
        elif karte[2] == 'K':
            kartenwert = 4
        elif karte[2] == 'D':
            kartenwert = 3
        elif karte[2] == 'B':
            kartenwert = 2
        elif karte[2] == '1':
            kartenwert = 10
        elif karte[2] == '9':
            kartenwert = 9
        elif karte[2] == '8':
            kartenwert = 8
        elif karte[2] == '7':
            kartenwert = 7
        self.wert = self.wert + kartenwert

Wir verwenden jetzt die gezeigte Implementierung wie folgt:

>>> 
>>> meinKartenhaufen = Kartenhaufen()
>>> meinKartenhaufen.hinzufuegen('K-B')
>>> meinKartenhaufen.hinzufuegen('X-9')
>>> meinKartenhaufen.kartenListe = meinKartenhaufen.kartenListe + ['H-K']
>>> meinKartenhaufen.kartenListe
['K-B', 'X-9', 'H-K']
>>> meinKartenhaufen.wert
11

Aufgabe 1

(a) Welcher reale Vorgang wird hier simuliert?

(b) Stimmt der angegebene Gesamtwert der Karten? Warum ist hier etwas schiefgelaufen?

Kapselung der Daten

Objekte nutzen Attribute, um die Daten, für die sie zuständig sind, zu verwalten. Ein leichtfertiger Zugriff auf die Attribute kann leicht zu unerwünschten Objektzuständen führen. Es ist daher eine gute Strategie, solche Zugriffe zu unterlassen oder sogar zu verbieten.

Wir setzen diese Strategie im Folgenden um, indem wir nicht mehr direkt auf Objektattribute zugreifen. Es sollen also keine direkten Zugriffe der Form objekt.attribut mehr erfolgen.

Ein Zugriff auf die Daten eines Objekts soll ab jetzt nur noch mit Hilfe geeigneter Methoden durchgeführt werden. Damit das möglich wird, erweitern wir zuerst die Klassendeklaration.

class Kartenhaufen(object):
    def __init__(self):
        self.kartenListe = []
        self.wert = 0

    def kartenwert(self, karte):
        if karte[2] == 'A':
            ergebnis = 11
        elif karte[2] == 'K':
            ergebnis = 4
        elif karte[2] == 'D':
            ergebnis = 3
        elif karte[2] == 'B':
            ergebnis = 2
        elif karte[2] == '1':
            ergebnis = 10
        elif karte[2] == '9':
            ergebnis = 9
        elif karte[2] == '8':
            ergebnis = 8
        elif karte[2] == '7':
            ergebnis = 7
        return ergebnis
        
    def hinzufuegen(self, karte):
        self.kartenListe = self.kartenListe + [karte]
        self.wert = self.wert + self.kartenwert(karte)

    def getKartenListe(self):
        return self.kartenListe

    def getWert(self):
        return self.wert

    def setKartenListe(self, vorgegebeneKarten):
        self.kartenListe = vorgegebeneKarten
        gesamtwert = 0
        for karte in self.kartenListe:
            gesamtwert = gesamtwert + self.kartenwert(karte)
        self.wert = gesamtwert

Mit den hinzugefügten Methoden lässt sich der oben gezeigte Vorgang jetzt so simulieren:

>>> 
>>> meinKartenhaufen = Kartenhaufen()
>>> meinKartenhaufen.hinzufuegen('K-B')
>>> meinKartenhaufen.hinzufuegen('X-9')
>>> meinKartenhaufen.hinzufuegen('H-K')
>>> meinKartenhaufen.getKartenListe()
['K-B', 'X-9', 'H-K']
>>> meinKartenhaufen.getWert()
15

Aufgabe 2

(a) Überzeuge dich, dass hier kein direkter Zugriff auf die Daten erfolgt. Auf welche Weise kann man sich dennoch die Daten verschaffen?

(b) Analysiere die Klassendeklaration. Welche Ergebnisse werden wohl an Stelle der Fragezeichen ausgegeben? Überprüfe deine Vermutung.

>>> 
>>> meinKartenhaufen = Kartenhaufen()
>>> meinKartenhaufen.setKartenListe(['K-B', 'H-D'])
>>> meinKartenhaufen.getKartenListe()
?
>>> meinKartenhaufen.getWert()
?
>>> meinKartenhaufen.hinzufuegen('X-7')
>>> meinKartenhaufen.hinzufuegen('H-K')
>>> meinKartenhaufen.getKartenListe()
?
>>> meinKartenhaufen.getWert()
?

(c) Worin liegen die Vorteile, wenn nur die von einem Objekt bereitgestellten Methoden benutzt werden?

X

Fehler melden

X

Suche