[gelöst] (OOP) Dynamischer Wert Teil der Klasse (Attribut) oder nicht?



  • Hallo,

    ich bin mir nicht ganz sicher, ob ein bestimmtes Attribut noch Teil der Klasse oder ob es nicht eher an anderer Stelle (Teil einer anderen Klasse?) zu verankern ist und ersuche daher hier Rat. 🙂

    Nehmen wir mal einen Kühlschrank als Beispiel. Der hat eine Größe, Fassungsvermögen, Anzahl an verschiedenen Kühlstufen, Stromverbrauch, etc. Wenn man sich im Handel einen kauft, wird auch mit der Energieeffizienzklasse geworben, z.B. A-Trippelsternchenklingelingelingeling. Dieses Attribut (Energieeffizienz) ist aber
    a.) nur eine Momentaufnahme, da
    b.) ein relativer Wert im Vergleich zu anderen Kühlschränken.

    Ist die Energieeffizienzklasse nun trotzdem ein Attribut der Klasse "Kühlschrank"? Oder gibt es eine Art darüberstehende Klasse "KühlschrankVergleicher", der z.B. eine Liste (Vector) von Kühlschrank-Objekten besitzt und hierin die einzelnen Objekte entsprechend ihres Stromverbrauchs vergleicht und dabei die Energieeffizienzklasse (schlimmstenfalls jedes Mal erneut) ermittelt?

    Was die Einordnung für mich gerade so schwierig erscheinen lässt, ist die Dynamik des Attributs, da sich der tatsächliche Wert zum Zeitpunkt X nur aus dem Vergleich mit anderen zu diesem Zeitpunkt bestehenden Objekten ergibt.

    Bei Glühlampen ist es beispielsweise so, dass sie vor vielen Jahren noch in der E-Klasse A oder B geführt wurden, durch Halogen- und LED-Lampen mittlerweile aber so ineffizient erscheinen (relativ gesehen), dass sie größtenteils vom Markt genommen wurden.

    Nunja, meine Frage müsste klar sein (siehe Topic 😉 ): Ist der dynamische Wert Teil der Klasse oder nicht?

    Viele Grüße
    gelignite



  • Wenn es eine Momentaufnahme ist die sich Jederzeit ändern kann, ist es kein Attribut. Dann hast du dafür eine Berechnungsfunktion. Die kann dann entweder als Member der Klasse existieren oder als freie Funktion.

    zB eine is_sorted Funktion die ausgibt ob eine Collection momentan sortiert ist oder nicht. Oder ein is_uppercase auf einen String die überprüft ob alle Zeichen Großbuchstaben sind. Ich denke dein "Energieffizienz" könnte genau so eine Funktion sein.

    Kompliziert ist es natürlich wenn du sagst, dass das nur in relation zu anderen Kühlschränken Sinn macht. Dann wäre es eine Berechnungsfunktion als Teil einer Collection von Kühlschränken.

    Das ganze ist natürlich abstrakt und nicht ernst zu nehmen. Denn in der modellierung wäre die Energieeffizienz nichts was das Programm live berechnent sondern ein Attribut des Kühlschranks das immer gleich bleibt (außer alle heiligen Zeiten mal stößt jemand ein neu gewichten der Effizienzen an) - bzw. würde man die Daten eh in einer Datenbank haben und dort die Daten korrekt verwalten.



  • Hallo,

    ich verstehe. Vielen Dank.

    Nur noch mal zur Erläuterung: Nehmen wir stattdessen mal den Preis und es heißt: "Kaufe das günstigste Radio im Geschäft!" (Kühlschrank ist so lang zum Tippen)
    Der Kaufpreis wäre natürlich ein Attribut der Klasse Radio. Der boolsche Wert istGünstigstesRadioImGeschäft hingehen hängt davon ab, welche Radios es noch gibt und was diese im Vergleich kosten. Das *jetzt* günstigste Radio könnte in wenigen Minuten bereits ausverkauft sein, und dann ist ein anderes, vorher noch teureres Radio, plötzlich das günstigste. Kurz gesagt: Person A und Person B kaufen im selben Geschäft zu zwei unterschiedlichen Zeitpunkten und zu zwei unterschiedlichen Preisen zwei unterschiedliche Radios und haben am Ende doch das jeweils günstigste Radio gekauft.

    Meine gedankliche Sackgasse war die Vermischung von Zeitpunkt und Zeitraum. In dem Moment meiner Betrachtung habe ich ja nur die Menge M und innerhalb dieser sind die Werte statisch. Ich darf die Zeitpunkte (Kauf durch Person A und Person 😎 nicht miteinander mischen, da es zwei verschiedene Zeitpunkte (eben Zeitraum) und damit zwei verschiedene Betrachtungen sind. (Jeder für sich kauft aber eben das günstigste Gerät, obwohl sie - miteinander verglichen - unterschiedlich viel gekostet haben.)

    Ich werde es als (ungefähr) so machen:
    Die Klasse bekommt das Attribut XY. Dann brauche ich also nur die von Dir erwähnte Berechnungsfunktion, mit deren Hilfe ich die zum Zeitpunkt Z vorhandenen Objekte miteinander in Beziehung setze und ihre entsprechenden Werte berechne. Die jeweiligen Resultate weise ich dann dem Attribut XY eines jeden Objekts zu und danach kann ich alle weiteren gewünschten Operationen ausführen, da alle notwendigen Werte vorliegen. Ja, das klingt doch nach einem Plan. Mir gefällt's.

    Schönen Abend. Viele Grüße
    gelignite



  • Das günstigste Radio ist zB ein gutes Beispiel für eine Funktion. C++ würde da zB sogar etwas fertiges anbieten: std::min_element

    Ich denke der Ansatz ist etwas zu kompliziert. Wenn es zB darum geht Geräte zu haben die ihren Preis ändern, so ist das alles simpel in einer Datenbank abgelegt und lässt sich mit einer Sprache wie SQL super einfach auslesen.

    Wenn wir aber mal von einer Objektmodellierung ausgehen, dann wären die Preise zu ihren Zeitpunkten im Objekt gespeichert mit Preis und Zeitpunkt.

    Wenn ich nun das billigste Objekt am Tag X haben will, rufe ich wieder ein min_element() auf, nur dass dieses eben zusätzlich den Zeitpunkt beachtet.

    Viele solche Sachen muss man garnicht bzw. soll man garnicht in das Objekt legen. Im idealfall ist das Objekt nur eine Sammlung an Daten auf denen man operiert.


Log in to reply