dedlfix: Konfiguration, OOP² oder doch nur Rad² ?

Beitrag lesen

Tach!

Für mich sind Eigenschaften jedoch etwas privates. Methoden dagegen sind Schnittstellen. Deshalb möchte ich nur über Schnittstellen kommunizieren.

Jow!!!! Das unterstreiche ich ganz dick! Der Grund: Wenn erforderlich (oft erlebt) kann das Objekt komplett umgebaut werden, wobei Attribute intern eine andere Referenz oder auch einen anderen Namen bekommen. Die Methoden jedoch bleiben namentlich als Schnittstellt nach draußen, da ist also nichts zu ändern.

Warum sollten sich ausgerechnet nur bei Eigenschaften Änderungswünsche ergeben, bei Methoden aber nie? Mögliche Namensänderungen sind jedenfalls nicht der Grund, warum man die Innereien nicht veröffentlichen will. Es geht im Wesentlichen darum, zusätzliche Funktionalität beim lesenden und schreibenden Zugriff hinzufügen zu können, ohne dass die Verwendungsstellen angepasst werden müssen. Vielleicht mag man aufgrund nicht vorhandener syntaktischer Möglichkeiten in bestimmten Sprachen Eigenschaften nicht veröffentlichen, weil beim Hinzufügen von Zugriffsfunktionalität auf eine Methode ausgewichen werden muss. In C# (und VB ab .NET) würde vermutlich keiner ernsthaft aus diesem Grund öffentliche Eigenschaften meiden, denn da hat man die Möglichkeit, gekapselten Zugriff transparent zu integrieren (Java-C#-Vergleich).

Außerdem hab ich da mal einen Artikel über "method chain" gelesen der mich aufhorchen hat lassen.
Nicht machen. Scroll mal nach oben... im Prinzip werden Interna damit nach draußen gereicht und das ist schlecht.

Nein, dabei wird nichts verwendet, was nicht sowieso schon public ist. Mich deucht, du hast Method Chaining nicht verstanden. Das ist mehr oder weniger nur eine komfortable Erweiterung der normalen benötigten Funktionalität.

Statt

$element = new HtmlElement();
  $element->attribut('foo', 'bar');
  $element->attribut('baz', 'qux');
  $element->content('blafasel');
  $html = $element->render();

kann man beim Method-Chaining schreiben:

$element = new HtmlElement();
  $html = $element->attribut('foo', 'bar')->attribut('baz', 'qux')->content('blafasel')->render();

(oder auch mit Zeilenumbruch vor den ->) Ähnlich komfortabel ($element nicht dauernd wiederholen zu müssen) ginge das mit with (wenn es zur Verfügung stünde (und nicht solche Nebenwirkungen wie in Javascript hat))

$element = new HtmlElement();
  with ($element) {
    ->attribut('foo', 'bar');
    ->attribut('baz', 'qux');
    ->content('blafasel');
    $html = ->render();
  }

Ob die letzte Zeile wirklich so geht oder nur Eigenschaften und rückgabelose Methoden mit with verwendet werden können, sei mal dahingestellt.

dedlfix.