<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Kommentare zu: Undefinierte Attribute</title>
	<atom:link href="http://www.phphatesme.com/blog/wtf/undefinierte-attribute/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/</link>
	<description>PhpHatesMe, but that&#039;s ok!</description>
	<lastBuildDate>Thu, 16 May 2013 18:42:06 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>Von: Nils Langner</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34889</link>
		<dc:creator>Nils Langner</dc:creator>
		<pubDate>Fri, 28 Aug 2009 09:06:09 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34889</guid>
		<description>@Don: Da muss ich dir recht geben :) Viel zu vielschichtig. Aber ich glaube, dass wir gar nicht weit mit unseren Meinungen auseinander liegen, ich würde zumindest fast alles unterschreiben, was du geschrieben hast. 
Falls du Interesse hast, was über böse Setter zu schreiben, dann veröffentliche ich das gerne.</description>
		<content:encoded><![CDATA[<p>@Don: Da muss ich dir recht geben <img src='http://www.phphatesme.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Viel zu vielschichtig. Aber ich glaube, dass wir gar nicht weit mit unseren Meinungen auseinander liegen, ich würde zumindest fast alles unterschreiben, was du geschrieben hast.<br />
Falls du Interesse hast, was über böse Setter zu schreiben, dann veröffentliche ich das gerne.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Don</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34888</link>
		<dc:creator>Don</dc:creator>
		<pubDate>Fri, 28 Aug 2009 08:59:05 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34888</guid>
		<description>@Nils
Es ist ein Kreuz mit simplifizierten Beispielen, da kannst du bestimmt ein Lied davon singen ;-)
Manche Dinge lassen sich halt eben nicht in ein paar Worten erklären. (Und wir beide sollten preferred richtig schreiben lernen...)

Aber zum Thema:
In deinem Beispiel ist beides äquivalent, das sagte Markus ja auch schon und (widerwillig) stimme ich dem auch zu. 
Abgesehen davon, dass ich mit PreferredCustomer oder so arbeiten würde.

Preferred ist aber ein Status des Objekts. Und wir erinnern uns: Objects are all about state and behaviour.

Und wenn dieser änderbar sein soll, dann kann er nur vom Objekt selbst geändert werden oder von einem anderen Objekt, dass dazu befähigt ist. Ein Kunde macht sich ja nur selten selbst zum Premiumkunden, nicht wahr? 

Deshalb sind die meisten der in Beispielen gezeigten Setter böse. Nicht vom technischen Standpunkt aus, sondern vom konzeptionellen; und Letztere entscheidet in einer Geschäftsanwendung. 
Im Kommentar zu Timo habe ich ein Beispiel dazu.

Analog zu preferred wäre ein Beispiel, dass dem Kunden ein Punktewert zugewiesen wird und es daraufhin zu einer Aufwertung zum Premiumkunden kommt.
Oder aber ich habe eine explizite Methode z.B. in der Anwendung des Kundenservice, der beliebige Kunden zu Premiumkunden machen kann (z.B. weil es mein Vetter ist).

Es ist in beiden Fällen eine Kapselung der Informationen, die nicht bloß Werte sind, sondern eine explizite Bedeutung haben und oft einiges entweder nach sich ziehen oder Vorbedingungen erfüllt sein müssen.

Ich merke aber langsam auch, dass dies ein viel zu vielschichtiges Thema für einen Blogkommentar ist.</description>
		<content:encoded><![CDATA[<p>@Nils<br />
Es ist ein Kreuz mit simplifizierten Beispielen, da kannst du bestimmt ein Lied davon singen <img src='http://www.phphatesme.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Manche Dinge lassen sich halt eben nicht in ein paar Worten erklären. (Und wir beide sollten preferred richtig schreiben lernen&#8230;)</p>
<p>Aber zum Thema:<br />
In deinem Beispiel ist beides äquivalent, das sagte Markus ja auch schon und (widerwillig) stimme ich dem auch zu.<br />
Abgesehen davon, dass ich mit PreferredCustomer oder so arbeiten würde.</p>
<p>Preferred ist aber ein Status des Objekts. Und wir erinnern uns: Objects are all about state and behaviour.</p>
<p>Und wenn dieser änderbar sein soll, dann kann er nur vom Objekt selbst geändert werden oder von einem anderen Objekt, dass dazu befähigt ist. Ein Kunde macht sich ja nur selten selbst zum Premiumkunden, nicht wahr? </p>
<p>Deshalb sind die meisten der in Beispielen gezeigten Setter böse. Nicht vom technischen Standpunkt aus, sondern vom konzeptionellen; und Letztere entscheidet in einer Geschäftsanwendung.<br />
Im Kommentar zu Timo habe ich ein Beispiel dazu.</p>
<p>Analog zu preferred wäre ein Beispiel, dass dem Kunden ein Punktewert zugewiesen wird und es daraufhin zu einer Aufwertung zum Premiumkunden kommt.<br />
Oder aber ich habe eine explizite Methode z.B. in der Anwendung des Kundenservice, der beliebige Kunden zu Premiumkunden machen kann (z.B. weil es mein Vetter ist).</p>
<p>Es ist in beiden Fällen eine Kapselung der Informationen, die nicht bloß Werte sind, sondern eine explizite Bedeutung haben und oft einiges entweder nach sich ziehen oder Vorbedingungen erfüllt sein müssen.</p>
<p>Ich merke aber langsam auch, dass dies ein viel zu vielschichtiges Thema für einen Blogkommentar ist.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Don Zampano</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34887</link>
		<dc:creator>Don Zampano</dc:creator>
		<pubDate>Fri, 28 Aug 2009 08:26:52 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34887</guid>
		<description>@Timo

Um z.B. einen Adresse zu ändern, könnte man nur eine neue Straße angeben.
$c-&gt;setStreet(...);

Aber man kann auch etwas machen:
$c-&gt;changeAddress(...);

Damit kriegst du auf Methodenebene einen in sich abgeschlossenen Vorgang.
Und musst nicht wissen, das man bei einer Adressänderung noch weitere 5 Methoden aufrufen muss, die vielleicht auch noch mehr machen.

Ziehst du von Hausnummer 15 in 17 ändert sich nicht nur deine Hausnummer, sondern es ändert sich deine Adresse! 
Weil das &quot;Konzept&quot; Adresse in den meisten Anwendungen (nicht nur Software) als Ganzes betrachtet wird.

Das ist die angesprochene Kapselung von Informationen.</description>
		<content:encoded><![CDATA[<p>@Timo</p>
<p>Um z.B. einen Adresse zu ändern, könnte man nur eine neue Straße angeben.<br />
$c-&gt;setStreet(&#8230;);</p>
<p>Aber man kann auch etwas machen:<br />
$c-&gt;changeAddress(&#8230;);</p>
<p>Damit kriegst du auf Methodenebene einen in sich abgeschlossenen Vorgang.<br />
Und musst nicht wissen, das man bei einer Adressänderung noch weitere 5 Methoden aufrufen muss, die vielleicht auch noch mehr machen.</p>
<p>Ziehst du von Hausnummer 15 in 17 ändert sich nicht nur deine Hausnummer, sondern es ändert sich deine Adresse!<br />
Weil das &#8220;Konzept&#8221; Adresse in den meisten Anwendungen (nicht nur Software) als Ganzes betrachtet wird.</p>
<p>Das ist die angesprochene Kapselung von Informationen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Nils Langner</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34886</link>
		<dc:creator>Nils Langner</dc:creator>
		<pubDate>Fri, 28 Aug 2009 08:22:24 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34886</guid>
		<description>@Don: So ganz verstehe ich nicht, worauf du mit deinem Bsp. hin willst. Es geht doch darum, ob man den Nachnamen im Konstruktor oder schon in der Definition setzen (egal ob es hier Sinn mach oder nicht). Das verhalten deines Beispieles, wäre bei beiden Versionen gleich, oder?
Es wäre also eher sowas wie:
class Customer
{
  private $isPreffered = false;
  // ...
}

gegen

class Customer
{
  private $isPreferred;

  public function __construct( )
  {
    $this-&gt;isPreferred = false;
  }
}

Oder verstehe ich da was falsch? Dass alle &quot;Pflichtfelder&quot; mit der Initialisierung gefüllt sein sollen, da stimme ich dir voll und ganz zu.

PS: Sorry falls die Beispiele ein wenig hinken.</description>
		<content:encoded><![CDATA[<p>@Don: So ganz verstehe ich nicht, worauf du mit deinem Bsp. hin willst. Es geht doch darum, ob man den Nachnamen im Konstruktor oder schon in der Definition setzen (egal ob es hier Sinn mach oder nicht). Das verhalten deines Beispieles, wäre bei beiden Versionen gleich, oder?<br />
Es wäre also eher sowas wie:<br />
class Customer<br />
{<br />
  private $isPreffered = false;<br />
  // &#8230;<br />
}</p>
<p>gegen</p>
<p>class Customer<br />
{<br />
  private $isPreferred;</p>
<p>  public function __construct( )<br />
  {<br />
    $this->isPreferred = false;<br />
  }<br />
}</p>
<p>Oder verstehe ich da was falsch? Dass alle &#8220;Pflichtfelder&#8221; mit der Initialisierung gefüllt sein sollen, da stimme ich dir voll und ganz zu.</p>
<p>PS: Sorry falls die Beispiele ein wenig hinken.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Don Zampano</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34885</link>
		<dc:creator>Don Zampano</dc:creator>
		<pubDate>Fri, 28 Aug 2009 08:15:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34885</guid>
		<description>@Markus
Na, so einfach ist es dann doch nicht. Es spielt keine Rolle, welche Sprache ich benutze und wie die damit umgeht. 

Das weiß ich schon, das man sich nicht sklavisch daran halten sollte. Allerdings kann man einige Prinzipien zwar umgehen oder als akademisches Zeug abstempeln, nur macht man dann eben kein wirkliches OOP mehr, eher COP (Class Oriented P.), was leider oft die Regel ist. 

Und nur weil es in PHP geht, heiß das doch nicht, das man es machen sollte. Nicht alles was machbar ist, ist auch sinnvoll.
Abgesehen davon kann sich das noch ändern, und dann schreibe ich alles um?

Ähm, und wieso sollte das Besprochene in PHP nicht sinnvoll anwendbar sein?
Guckst du...

Wenn es irrelevant ist, ob ein Attribut im Constructor oder bei der Deklaration initialisiert wird, dann ist dieser Wert ebenso irrelevant. Und von denen rede ich nicht.

Vor allem geht um dies hier:

$c = new Customer();
$c-&gt;setFirstname(&#039;John&#039;);
$c-&gt;setPreffered(1);
$c-&gt;doSomething();
$orm-&gt;save($c);

So, was ist das für ein Customer? Einer ohne Nachnamen und Adresse, in welchem Status ist er und warum darf er ein Premiumkunde sein? Hat er alle Eigenschaften bekommen um ihn als Customer im weiteren Verlauf ansprechen und auf seine Eigenschaften zugreifen zu können? Und wieso darf ich ihn speichern in dem Zustand??

Wieso erzeugt man ein Objekt, das noch nicht &quot;fertig&quot; ist?
Will man ernsthaft damit im weiteren Verlauf arbeiten?

Die Umgehung solcher Prinzipien macht vielleicht weniger Mühe, führt aber zu fehleranfälligen und unverständlichem Code und jede Menge Seiteneffekten bei komplexeren Anwendungen.
Die Beispiele hier waren ja Pipifax, mach das aber mal bei einer komplexen Anwendung. Die haut dir das Zeug später um die Ohren, wenn du nicht kapselst, Informationen versteckst und  Kernkonzepte und Verhalten nicht explizit gestaltest.</description>
		<content:encoded><![CDATA[<p>@Markus<br />
Na, so einfach ist es dann doch nicht. Es spielt keine Rolle, welche Sprache ich benutze und wie die damit umgeht. </p>
<p>Das weiß ich schon, das man sich nicht sklavisch daran halten sollte. Allerdings kann man einige Prinzipien zwar umgehen oder als akademisches Zeug abstempeln, nur macht man dann eben kein wirkliches OOP mehr, eher COP (Class Oriented P.), was leider oft die Regel ist. </p>
<p>Und nur weil es in PHP geht, heiß das doch nicht, das man es machen sollte. Nicht alles was machbar ist, ist auch sinnvoll.<br />
Abgesehen davon kann sich das noch ändern, und dann schreibe ich alles um?</p>
<p>Ähm, und wieso sollte das Besprochene in PHP nicht sinnvoll anwendbar sein?<br />
Guckst du&#8230;</p>
<p>Wenn es irrelevant ist, ob ein Attribut im Constructor oder bei der Deklaration initialisiert wird, dann ist dieser Wert ebenso irrelevant. Und von denen rede ich nicht.</p>
<p>Vor allem geht um dies hier:</p>
<p>$c = new Customer();<br />
$c-&gt;setFirstname(&#8216;John&#8217;);<br />
$c-&gt;setPreffered(1);<br />
$c-&gt;doSomething();<br />
$orm-&gt;save($c);</p>
<p>So, was ist das für ein Customer? Einer ohne Nachnamen und Adresse, in welchem Status ist er und warum darf er ein Premiumkunde sein? Hat er alle Eigenschaften bekommen um ihn als Customer im weiteren Verlauf ansprechen und auf seine Eigenschaften zugreifen zu können? Und wieso darf ich ihn speichern in dem Zustand??</p>
<p>Wieso erzeugt man ein Objekt, das noch nicht &#8220;fertig&#8221; ist?<br />
Will man ernsthaft damit im weiteren Verlauf arbeiten?</p>
<p>Die Umgehung solcher Prinzipien macht vielleicht weniger Mühe, führt aber zu fehleranfälligen und unverständlichem Code und jede Menge Seiteneffekten bei komplexeren Anwendungen.<br />
Die Beispiele hier waren ja Pipifax, mach das aber mal bei einer komplexen Anwendung. Die haut dir das Zeug später um die Ohren, wenn du nicht kapselst, Informationen versteckst und  Kernkonzepte und Verhalten nicht explizit gestaltest.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Timo</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34884</link>
		<dc:creator>Timo</dc:creator>
		<pubDate>Fri, 28 Aug 2009 08:03:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34884</guid>
		<description>@juhu: Deswegen sagte ich Setter-Methoden sind sinnvoll wenn die Werte geprüft werden müssen. 
Nehmen wir mal die Klasse PHPMailer. Dort gibt es die Eigenschaft &quot;CharSet&quot;.
Klar kann man als Benutzer der Klasse reinschreiben was man will, aber bekommt man dann keine Anständige bzw. eine E-Mail mit falschem Codierung.
Da ist man dann selber Schuld.

Vielleicht sollte an dieser Stelle das Konzept von C# übernommen werden. Das finde ich immer noch am besten.</description>
		<content:encoded><![CDATA[<p>@juhu: Deswegen sagte ich Setter-Methoden sind sinnvoll wenn die Werte geprüft werden müssen.<br />
Nehmen wir mal die Klasse PHPMailer. Dort gibt es die Eigenschaft &#8220;CharSet&#8221;.<br />
Klar kann man als Benutzer der Klasse reinschreiben was man will, aber bekommt man dann keine Anständige bzw. eine E-Mail mit falschem Codierung.<br />
Da ist man dann selber Schuld.</p>
<p>Vielleicht sollte an dieser Stelle das Konzept von C# übernommen werden. Das finde ich immer noch am besten.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Von: Nils Langner</title>
		<link>http://www.phphatesme.com/blog/wtf/undefinierte-attribute/comment-page-1/#comment-34883</link>
		<dc:creator>Nils Langner</dc:creator>
		<pubDate>Fri, 28 Aug 2009 07:57:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.phphatesme.com/?p=3786#comment-34883</guid>
		<description>@Markus: Da muss ich dir vollkommen zustimmen, hätte es aber nicht so schön erklären können ;)</description>
		<content:encoded><![CDATA[<p>@Markus: Da muss ich dir vollkommen zustimmen, hätte es aber nicht so schön erklären können <img src='http://www.phphatesme.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
</channel>
</rss>
