Tomas: Fragen zur Objektgestaltung

Hallo,

Vor einiger Zeit habe ich eine Einführung in OOP gelesen, darin wurden bestimmte Objekte wie "Apfel" und "Mensch" genannt. Das Objekt "Apfel" die Methode "essen" hatte.

Meine Frage dazu ist: Wäre es wegen dem OOP-Prinzip nicht besser, wenn der Apfel die Methode "werde gegessen" hätte? Oder müsste nicht der Mensch (zusätzlich) die Methode "iss Apfel" besitzen (welche dann Apfel's "werde gegessen" Methode auruft)?

Verkompliziert das nicht alles?

mfg, Tomas

  1. Hi,

    Das Objekt "Apfel" die Methode "essen" hatte.

    das klingt halt besser als Apfel.gegessenWerden().

    Meine Frage dazu ist: Wäre es wegen dem OOP-Prinzip nicht besser, wenn der Apfel die Methode "werde gegessen" hätte? Oder müsste nicht der Mensch (zusätzlich) die Methode "iss Apfel" besitzen (welche dann Apfel's "werde gegessen" Methode auruft)?

    Das ist eine Frage des Design-Patterns. "Apfel.essen(Mensch)" ist eine gültige Philosophie, ebenso wie "Mensch.essen(Apfel)". Ich stimme Dir aber zu, dass die Namenswahl nicht optimal ist. Andererseits:

    Auf den Apfel wird die Methode "essen" angewendet. Der Apfel wird also gegessen. Passt doch ;-)

    Verkompliziert das nicht alles?

    Nur scheinbar. In der Praxis wirst Du auf Namenskonventionen stoßen, nach denen das Problem schlicht und ergreifend keines ist - und Dir auch nicht mehr als solches erscheint.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Tomas,

    Wirklich natürliche Vorgänge zu modellieren ist schwierig und meiner Meinung nach auch nicht wirklich sinnvoll, da man so etwas in echten Programmen normalerweise nicht hat. Dort geht es meist um Verwaltung oder Technisches.

    Nun zurück zum Apfel: Was passiert beim Essen eines Apfels: Der Mensch nimmt irgendwie Nahrung zu sich, der Apfel ist hinterher im wesentlichen weg, evtl. kann man noch den nicht gegessenen Rest berücksichtigen, die Teile, die aber tatsächlich gegessen wurden, dürften nicht mehr interessant in ihrer rolle als Apfelbestantteile sein ;)

    Wenn man den Apfel nach dem Essen einfach als verschwunden betrachtet, ist die Situation einfach. Die Methode "essen" gehört zum Menschen, ändert dessen Zustand und hinterher löscht man einfach die Referenz auf das Objekt Apfel.

    Wenn man den Zustand "gegessen" / "teilweise gegessen" mit berücksichtigen will, wird der Fall schwieriger, da sich an beiden Objekten etwas ändert.

    Ich würde das so modellieren:

      
    class Apfel {  
      double getGegessenerAnteil();  
      void esseAnteil(double anteil);  
    }  
      
    class Mensch {  
      void essse(Apfel apfel);  
    }  
    
    

    Der Mensch würde also den Apfel essen, in dem er einen Teil von ihm entfernt. Das Essen des Apfels würde zudem vom Menschen koordiniert, wärend der Apfel nicht wüsste, von wem er da eigentlich gegessen wird. Es wäre z.B. auch möglich "Mensch" so zu erweitern, dass mehrere Menschen der Reihe nach von dem Apfel abbeißen könnten.
    Diese Modellierung entspricht denke ich ganz gut der üblichen Vorstellung vom Essen eines Apfels ;)

    Schwierig an solchen Operationen die mehre Objekte gleichzeitig betreffen, ist oft, die Operation richtig auf beide Objekte aufzuteilen. In diesem Fall geht das noch recht intuitiv, aber nicht immer ist so klar, welches Objekt den Ablauf eigentlich koordinieren sollte.

    Grüße

    Daniel

    1. Hi!

      Warum wurde der Beitrag von Hoppybär gelöscht? Der erinnerte mich gerade an das Spiel Rogue.

      MFG
      Frank Schirrmacher