MB: UML direktionen

moin comunity,

ich kenn den theroetischen teil aber die praxis nicht. Mir fehlen unzureichende Praxisbeispiele 😕. Ich kenne mich mit der min-max-Notation durch ERM ganz gut aus. Ich habe mit der allgemeinen Symbolik in UML Klassendiagram Probleme. Ich beziehe mich auf Agregation und Komposition. Sind das nur konzeptionelle Begriffe der unidirektionalen Verbindung oder schon feste Code-Strukturen? Beispiel Aregation

class Foo {
  private $bar; // vorbereitung
  function something() {
    $this->bar = new Bar(); // ausführung
  }

...oder so...

class Foo {
  function something() {
    $bar = new Bar(); // die Verbindung
  }

...und in abhängigkeit so...

abstract class Bar {}

und ist Komosition das gleichen ahne abstract in der Bar-Klasse?

vlg MB

akzeptierte Antworten

  1. Tach!

    Ich habe mit der allgemeinen Symbolik in UML Klassendiagram Probleme. Ich beziehe mich auf Agregation und Komposition. Sind das nur konzeptionelle Begriffe der unidirektionalen Verbindung oder schon feste Code-Strukturen?

    Natürlich sind das nur konzeptionelle Begriffe, da UML sich auf keine konkrete Programmiersprache bezieht. Wie das am Ende in Code abgebildet wird, steht auf einem anderen Blatt, dem des jeweiligen Systems.

    Beispiel Aregation

    [...]

    ...oder so...

    class Foo {
      function something() {
        $bar = new Bar(); // die Verbindung
      }
    

    Na so nicht, denn $bar ist kein Bestandteil der Klasse sondern nur eine lokale Variable. Somit ist keine Beziehung zur Klasse gegeben.

    ...und in abhängigkeit so...

    abstract class Bar {}
    

    und ist Komosition das gleichen ahne abstract in der Bar-Klasse?

    Der Teil der Fragestellung ist für mich unverständlich.

    Komposition ist, wenn der eine Teil nicht ohne den anderen auskommt. Ein Mensch braucht unbedingt einen Kopf. Der Kopf muss also zwingender Bestandteil sein und darf nicht auf null verweisen, beispielsweise. Ob du den Kopf nun als Pflichtparameter im Konstruktor übernimmst oder ihn im Konstruktur selbst erstellst, ist für das Muster unerheblich.

    dedlfix.

    1. moin,

      ups, meine ich doch. Sorry, ich hab die Begriffe vertauscht. Danke für die Richtigstellung! Und Danke für die AW. Ich meine sowas, das die Komposition beschreiben soll.

      class Foo {
      
        private _bar : Bar;
      
        public something() :void {
          this._bar = new Bar();
        }
      }
      
      abstract class Bar {}
      

      vlg MB

      1. Tach!

        ups, meine ich doch. Sorry, ich hab die Begriffe vertauscht. Danke für die Richtigstellung! Und Danke für die AW. Ich meine sowas, das die Komposition beschreiben soll.

        class Foo {
        
          private _bar : Bar;
        
          public something() :void {
            this._bar = new Bar();
          }
        }
        

        this._bar ist null solange du nicht this.something() aufrufst. Und das darf bei einer Komposition nicht sein.

        abstract class Bar {}
        

        Abstrakte Klassen kann man nicht instantiieren. Dein Code funktioniert also nicht, egal was das Muster sagt.

        dedlfix.

        1. ach mist, ja, bitte entschuldige. Ich hatte da was anderes im Kopf Inheritance und habs dann verwechselt. Also meinst du sowas …

          class Foo {
            private bar : Bar = new Bar();
          }
          
          clas Bar {}
          

          also Komposition als Properety der Klasse Foo zu Klasse Bar?

          1. Tach!

            Also meinst du sowas …

            class Foo {
              private bar : Bar = new Bar();
            }
            
            class Bar {}
            

            also Komposition als Properety der Klasse Foo zu Klasse Bar?

            Ja, das ist die eine Variante, die ist aber nur verwendbar, wenn gemäß Aufgabenstellung Bar von Foo instantiiert werden kann. Ansonsten müsste man es als Pflichtparameter im Constructor anfordern.

            class Foo {
              private bar : Bar;
            
              function __construct(Bar $bar) {
                $this->bar = $bar;
              }
            }
            
            class Bar {}
            

            dedlfix.