<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Builder%3AMotivation</id>
	<title>Builder:Motivation - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Builder%3AMotivation"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Motivation&amp;action=history"/>
	<updated>2026-05-06T12:43:20Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Builder:Motivation&amp;diff=211&amp;oldid=prev</id>
		<title>Ullrich: /* Fluent Interfaces */</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Motivation&amp;diff=211&amp;oldid=prev"/>
		<updated>2025-02-26T07:28:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Fluent Interfaces&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Februar 2025, 07:28 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l76&quot;&gt;Zeile 76:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 76:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{java|code=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{java|code=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Statement s = new select();&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Statement s = new select();&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Fields f = new Fields(&amp;quot;x, y, z&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Fields f = new Fields&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;();&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;f.setList(List.of&lt;/ins&gt;(&amp;quot;x&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;y&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;z&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;s.setFields(f);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;s.setFields(f);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tables &lt;/del&gt;t = new &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Tables&lt;/del&gt;(&amp;quot;t&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Table &lt;/ins&gt;t = new &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Table&lt;/ins&gt;(&amp;quot;t&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;s.setTables(t);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;s.setTables(t);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Condition c = new Condition(&amp;quot;x = z&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Condition c = new Condition(&amp;quot;x = z&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Builder:Motivation&amp;diff=210&amp;oldid=prev</id>
		<title>Ullrich: /* Fluent Interfaces */</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Motivation&amp;diff=210&amp;oldid=prev"/>
		<updated>2025-02-26T07:26:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Fluent Interfaces&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Februar 2025, 07:26 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l91&quot;&gt;Zeile 91:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 91:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{java|code=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{java|code=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Statement s = new Select() //&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Statement s = new Select() //&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   .fields(&amp;quot;x, y, z&amp;quot;) //&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   .fields(&amp;quot;x&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;y&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;&lt;/ins&gt;z&amp;quot;) //&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   .from(&amp;quot;t&amp;quot;) //&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   .from&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(new Table&lt;/ins&gt;(&amp;quot;t&amp;quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&lt;/ins&gt;) //&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   .where(&amp;quot;x &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;= &lt;/del&gt;z&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;                   .where&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(Condition.equals&lt;/ins&gt;(&amp;quot;x&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;quot;, &amp;quot;&lt;/ins&gt;z&amp;quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Anstelle der von einander unabhängigen Setter definiert die {{java|Select}}-Klasse Methoden, die immer wieder das gleiche&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Anstelle der von einander unabhängigen Setter definiert die {{java|Select}}-Klasse Methoden, die immer wieder das gleiche&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Builder:Motivation&amp;diff=204&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Kategorie:Java Kategorie:Builder = Motivation =  Ber Begriff &quot;Builder&quot; tritt wohl zum ersten Mal im &quot;Design Patterns&quot;-Buch der Gang of Four auf. Die Absicht des Builder Pattern wird dort definiert durch: :Separate the construction of a complex object from its representation&lt;br&gt; :so that the same construction process can create different representations  Es geht dort also um die Trennung von Konstruktion und Repräsentation. Ein wesentlicher Aspekt…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Builder:Motivation&amp;diff=204&amp;oldid=prev"/>
		<updated>2025-02-24T16:08:08Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Kategorie:Java&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kategorie:Java (Seite nicht vorhanden)&quot;&gt;Kategorie:Java&lt;/a&gt; &lt;a href=&quot;/index.php?title=Kategorie:Builder&quot; title=&quot;Kategorie:Builder&quot;&gt;Kategorie:Builder&lt;/a&gt; = Motivation =  Ber Begriff &amp;quot;Builder&amp;quot; tritt wohl zum ersten Mal im &amp;quot;Design Patterns&amp;quot;-Buch der Gang of Four auf. Die Absicht des Builder Pattern wird dort definiert durch: :Separate the construction of a complex object from its representation&amp;lt;br&amp;gt; :so that the same construction process can create different representations  Es geht dort also um die Trennung von Konstruktion und Repräsentation. Ein wesentlicher Aspekt…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Builder]]&lt;br /&gt;
= Motivation =&lt;br /&gt;
&lt;br /&gt;
Ber Begriff &amp;quot;Builder&amp;quot; tritt wohl zum ersten Mal im &amp;quot;Design Patterns&amp;quot;-Buch der Gang of Four auf.&lt;br /&gt;
Die Absicht des Builder Pattern wird dort definiert durch:&lt;br /&gt;
:Separate the construction of a complex object from its representation&amp;lt;br&amp;gt;&lt;br /&gt;
:so that the same construction process can create different representations&lt;br /&gt;
&lt;br /&gt;
Es geht dort also um die Trennung von Konstruktion und Repräsentation. Ein wesentlicher Aspekt&lt;br /&gt;
dabei ist die Anforderung &amp;#039;&amp;#039;verschiedene&amp;#039;&amp;#039; Repräsentationen aus dem Ergebnis des selben&lt;br /&gt;
Konstruktionsprozesses zu erzeugen. Als Beispiel führt das Buch die Konstruktion eines Textes an,&lt;br /&gt;
der dann in unterschiedliehen Formaten ausgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
Auch wenn solche Probleme in der Praxis durchaus vorkommen, hat sich der Builder-Begriff davon mittlerweile losgelöst.&lt;br /&gt;
Die meisten Beschreibungen verzichten auf den zweiten Aspekt -- die Erzeugung der Repräsentationen --&lt;br /&gt;
und beschränken sich auf die Konstruktion. In diesem Sinne solle der Builder auch in diesem Pamphlet verstanden&lt;br /&gt;
werden. Es geht also um die Trennung der Konstruktion von der Verarbeitung des erzeugten Objekts.&lt;br /&gt;
Dem Builder geht es dabei ausschließlich um die Konstruktion und die Manipulation der Objekt;&lt;br /&gt;
was -- insbesondere fachlich -- weiter mit dem Objektgeschieht, interessiert den Builder nicht.&lt;br /&gt;
&lt;br /&gt;
== Paradigmen ==&lt;br /&gt;
Sucht man im Web nach dem Begriff &amp;quot;objektorientiert&amp;quot; so findet man allerhand, nur keine Definition;&lt;br /&gt;
nicht einmal ein Konsens darüber was OO eigentlich sein soll findet man.&lt;br /&gt;
Eine der ersten Sprachen die &amp;quot;Objekte&amp;quot; eingeführt hat, war [https://en.wikipedia.org/wiki/Simula SIMULA-67].&lt;br /&gt;
Wie der Name suggeriert, ist SIMULA im Umfeld von software-gestützten Simulationen entstanden in denen mehr oder weniger&lt;br /&gt;
selbständige &amp;quot;Dinge&amp;quot; mit einander interagieren. Die Definition von Grady Booth für das objektorienterte Design enstammt&lt;br /&gt;
der realen Welt, nicht der Programmierung; die Eigenschaften treffen jedoch auch beide zu. Demnach hat eine Objekt&lt;br /&gt;
* eine Identität&lt;br /&gt;
* einen (inneren) Zustand&lt;br /&gt;
* eine definiertes Verhalten&lt;br /&gt;
Das Objekt tackert damit Daten und Funktionen die damit arbeiten zusammen. Objekte &amp;quot;leben&amp;quot; über einen längeren Zeitraum&lt;br /&gt;
und verändern sich dabei. Seit dem Aufkommen in den 1990ern ist &amp;quot;Objektorientierung&amp;quot; das führende Paradigma,&lt;br /&gt;
tatsächlich zeichnet sich seit einiger Zeit eine Änderung des Trends ab. Massive Parallelität in allen Bereichen -- vom&lt;br /&gt;
Prozessor bis zum globalen Web führen immer wieder zu Problemen, weil die Daten im Objekt nicht für den parallelen Zugriff&lt;br /&gt;
vorgesehen sind. Auch wenn SOA kein moderner Begriff mehr ist, ist der Service zum Mantra der Gegenwart geworden.&lt;br /&gt;
Die Vorstellung eines Ablaufs, der gestartet und beendet wird, Eingaben aufnimmt und daraus ein Ergebnis berechnet;&lt;br /&gt;
unabhängig vom Rest der Welt, mit einer Lebensdauer von Millisekunden -- das ist das Gegenteil eines Objekts.&lt;br /&gt;
&lt;br /&gt;
Auch der Builder bricht mit dem OO-Paradigma indem er die Daten von ihrer Manipulation trennt.&lt;br /&gt;
Im Grunde genommen läßt sich die Verarbeitung von Daten nicht zufriedenstellend in der OO-Welt abbilden.&lt;br /&gt;
Eine Überweisung führt sich nicht selbst aus. Sie ist ein Auftrag, der im Rahmen eines Prozesses ausgeführt wird.&lt;br /&gt;
Die Überweisungs-Daten müssen also vom inneren Zustand der Überweisungsmaschine gertrennt werden. Die Maschine&lt;br /&gt;
mag ein Objekt sein, die Überweisungsdaten bilden keines; für sie ist das Datenstruktur- oder Datentyp-Modell angemessener.&lt;br /&gt;
&lt;br /&gt;
Folgt man diesem Gedankenm, führt das zum Konzept das typisierten funktionalen Programmiersprachen zugrunde liegt.&lt;br /&gt;
&lt;br /&gt;
== Die integrierte Factory ==&lt;br /&gt;
Im Pattern-Buch taucht &amp;#039;&amp;#039;die&amp;#039;&amp;#039; Factory als Pattern nicht auf. Statt dessen giebt es zwei speziellere Pattern&lt;br /&gt;
&amp;quot;Abstract Factory&amp;quot; und &amp;quot;Factory Method&amp;quot; deren Definition hier nicht wiederholt weren soll.&lt;br /&gt;
Stellen wir uns statt dessen die Frage: Was möchten wir unter einer &amp;#039;&amp;#039;Factory&amp;#039;&amp;#039; verstehen?&lt;br /&gt;
&lt;br /&gt;
Die kürzestmögliche Definition ist:&lt;br /&gt;
:Eine Factory ist ein Ding, das Objekte erzeugt.&lt;br /&gt;
Meistens handelt es sich da um ein Objekt, es kann aber auch eine Funktion oder eine Methode sein.&lt;br /&gt;
&lt;br /&gt;
Die Parametrisierung bzw. Konfigurierbarkeit zur Erzeugung von Objekten &amp;#039;&amp;#039;unterschiedlicher&amp;#039;&amp;#039; Klassen&lt;br /&gt;
ist zwar möglich, aber nicht wesentlich. Dieser Factory-Begriff kann also getrost auf den Builder angewandt&lt;br /&gt;
werden: Ein Builder erzeugt Objekte. Die Klasse des Generats kann für einen&lt;br /&gt;
Builder variieren, muß -- und tut es im allgemeinen -- aber nicht.&lt;br /&gt;
&lt;br /&gt;
Was den Builder von der landläufigen Vorstellung der Factory -- und der Gof&amp;#039;schen factory method -- unterscheidet,&lt;br /&gt;
ist die Tatsache daß beim Builder zur Erzeugung von Objekten mehrere Methoden aufgerufen werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Fluent Interfaces ==&lt;br /&gt;
Geprägt wurde der Begriff wohl von Eric Evens; Martin Fowler schreibt darüber 2005 in seinem&lt;br /&gt;
[https://martinfowler.com/bliki/FluentInterface.html Blog].&lt;br /&gt;
Die Idee dahinter ist, Folgen von Methoden-Aufrufen auf Objekte -- die so typisch sind für imperative Sprachen wie Java -- zu ersetzen durch verkettete Methoden-Aufrufe, die die Struktur einer domain specific languange aufweisen.&lt;br /&gt;
Fowlers Beispiel ähnelt nicht zufällig den Buildern wie sie hier beschrieben werden. Im folgenden soll nicht der Artikel nacherzählt werden, vielmehr geht es darum einen Eindruck vom &amp;quot;fluent interface&amp;quot;-Konzept zu geben.&lt;br /&gt;
&lt;br /&gt;
Manchmal werden fluent interfaces auch als Pattern bezeichnet. Das ist -- im ursprünglichen Sinne -- nicht korrekt.&lt;br /&gt;
Ihnen liegt keine fachliche Motivation zugrunde und sie dienen nicht der Lösung irgendeiner Problem-Kategorie.&lt;br /&gt;
Sie sind ein Design-Konzept für Programmier-Interfaces.  &lt;br /&gt;
&lt;br /&gt;
In Java könnte man sich folgenden Code vorstellen:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Statement s = new select();&lt;br /&gt;
Fields f = new Fields(&amp;quot;x, y, z&amp;quot;);&lt;br /&gt;
s.setFields(f);&lt;br /&gt;
Tables t = new Tables(&amp;quot;t&amp;quot;);&lt;br /&gt;
s.setTables(t);&lt;br /&gt;
Condition c = new Condition(&amp;quot;x = z&amp;quot;);&lt;br /&gt;
s.setConditions(c)&lt;br /&gt;
}}&lt;br /&gt;
Man kann -- anstelle der Verwendung lokaler Variablen -- die Objekt-Erzeugung inline durchführen,&lt;br /&gt;
aber das macht den Code nicht schöner. Man kommt beim Lesen nicht umhin, den Code sequentiell zu analysieren:&lt;br /&gt;
Erzeugt wird ein Statement, dann wird ein &amp;quot;Field&amp;quot;-Objekt erzeugt, das wird dem Statement&lt;br /&gt;
hinzugefügt, und so fort. Der Eingeweihte erkennt schnell das SQL-Statement das hier konstruiert wird.&lt;br /&gt;
&lt;br /&gt;
Man kann das -- anlehnend an die SQL-Syntax -- auch in Java anders formulieren:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Statement s = new Select() //&lt;br /&gt;
                  .fields(&amp;quot;x, y, z&amp;quot;) //&lt;br /&gt;
                  .from(&amp;quot;t&amp;quot;) //&lt;br /&gt;
                  .where(&amp;quot;x = z&amp;quot;);&lt;br /&gt;
}}&lt;br /&gt;
Anstelle der von einander unabhängigen Setter definiert die {{java|Select}}-Klasse Methoden, die immer wieder das gleiche&lt;br /&gt;
{{java|Select}}-Objekt als Ergebnis liefern. Die DSL die hier definiert wird, entspricht der SQL-Syntax und man kann sich&lt;br /&gt;
vorstellen, daß -- wenn die {{java|where}}-Methode entsprechend modelliert wird -- auch die Definition geschachtelter&lt;br /&gt;
Select-Statements möglich sind.&lt;br /&gt;
&lt;br /&gt;
Das sind denn auch die beiden Elemente der fluent interfaces, die hier wesentlich sind.&lt;br /&gt;
Zunächst einmal das &amp;quot;method chaining&amp;quot;: Man versteht darunter, daß die Methoden-Aufrufe nicht in einzelnene Befehlen&lt;br /&gt;
geschehen -- wie das bei Verwendung von Settern und lokalen Variablen der Fall ist -- sondern in einer (mehr oder weniger langen) &lt;br /&gt;
Kette von aufeinander angewandten Methoden, so daß für die komplette Folge nur ein einziger Befehl&lt;br /&gt;
(gewissermaßen ein einziges Semikolon) benötigt wird.&lt;br /&gt;
&lt;br /&gt;
Das zweite Element ist die Schachtelung. Statt Unter-Objekte in lokalen Variablen abzulegen und dort zu manipulieren,&lt;br /&gt;
werden sie -- wieder in einer einzigen Methoden-Kette erzeugt und dann direkt als Argumente an Methoden übergeben.&lt;br /&gt;
Das ganze Konstrukt erhält dadurch einen eher funktionalen Charakter. Das ist für den &amp;quot;prozeduralen&amp;quot; Java-Hacker&lt;br /&gt;
ein eher ungewohntes und damit befremdliches Konzept.&lt;br /&gt;
&lt;br /&gt;
Ich stand der &amp;quot;fluent interface&amp;quot;-Idee von Anfang an skeptisch gegenüber. Solange die dadurch definierte DSL den Charakter einer formalen&lt;br /&gt;
Sprache hat -- wie das bei SQL der Fall ist -- die einer eindeutig definierten inneren Logik folgt, giebt es eigentlich kein Problem.&lt;br /&gt;
Wenn man aber versucht -- und so wird es vielfach verkauft -- natürliche Sprache darüber nachzubilden wird die Sache schwierig.&lt;br /&gt;
Computer-Programme sind formal und lassen keine Unschärfe zu; das Gegenteil ist ein wesentliches Merkmal natürlicher Sprachen.&lt;br /&gt;
&lt;br /&gt;
Wie kann man nun zusammenfassen inwiefern fluent interfaces bei der Builder-Konstruktion bedeutsam sind?&lt;br /&gt;
&lt;br /&gt;
{{quotation|Der Builder verwendet Method Chaining und Schachtelung, um klassische Anweisungsfolgen durch eine DSL zu ersetzen.}}&lt;br /&gt;
&lt;br /&gt;
Dadurch wird einerseits eine bessere Lesbarkeit und eine bessere Verständlichkeit der zugrundeliegenden Semantik erreicht&lt;br /&gt;
und andererseits boiler plate code gekapselt, der sonst die die Aufmerksamkeit absaugen würde.&lt;br /&gt;
&lt;br /&gt;
== Separation  of Concerns ==&lt;br /&gt;
Wie im Abschnitt &amp;quot;Zugriffs-Kontolle&amp;quot; ausführlicher beschrieben wird, bietet der Builder eine Möglichkeit&lt;br /&gt;
die Zuständigkeiten über Entities so trennen. Das klingt zunächst einmal etwas merkwürdig; welche Zuständigkeiten&lt;br /&gt;
sollte man bei einem Entity -- das selbst keine Logik enthält -- trennen?&lt;br /&gt;
&lt;br /&gt;
Es geht hier um die Trennung von Erzeugung (bzw. Manipulation) des Objekts und dem Zugriff auf den Inhalt.&lt;br /&gt;
Die Idee des immutable Objekts ist Java grundsätzlich fremd, sie widerspricht geradezu der eigentlichen Objekt-Idee.&lt;br /&gt;
Aber tatsächlich haben unveränderliche Objekte in einer multithreading-Umgebung große Vorteile,&lt;br /&gt;
weil sie die Synchronisation stark vereinfachen. Nicht umsonst ist das funktionale Paradigma weiterhin auf dem Vormarsch.&lt;br /&gt;
&lt;br /&gt;
Konsequent durchgezogen, kann das Entity vollständig auf Setter verzichten indem es die Manipulation dem Builder überträgt&lt;br /&gt;
und sich darauf beschränken Daten zu halten und herauszugeben.&lt;br /&gt;
&lt;br /&gt;
== Statisch oder dynamisch? ==&lt;br /&gt;
Das ist für jede Programmiersprache die -- oder zumindest eine -- Gretchenfrage. Was ist damit gemeint?&lt;br /&gt;
Statisch heißt &amp;quot;zur Compile-Zeit&amp;quot;, dynamisch -- oder nicht-statisch -- bezeichnet das Gegenstück, nämlich &amp;quot;zur Laufzeit&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Wenn Tony Hoare die Einführung von &amp;quot;null&amp;quot; in ALGOL als &amp;quot;billion Dollar mistake&amp;quot; bezeichnet hat, meinte er damit,&lt;br /&gt;
daß die null- oder Ungültigkeitsprüfung optimalerweise zur Compile-Zeit stattfinden sollte. Es giebt mittlerweile&lt;br /&gt;
Sprachen, die Konzepte dafür implementieren -- in Java sind sie nur unzulänglich ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Inwiefern betrifft das den Builder? Bei jeder Prüfung muß man sich fragen, wann diese stattfinden soll.&lt;br /&gt;
Was ist mit Muß-Werten? Kann man das Vorhandensein zur Compile-Zeit prüfen -- was sicherer wäre -- oder soll man&lt;br /&gt;
die Prüfung auf die Laufzeit -- was einfacher wäre -- verlagern? Auf diese spezielle Frage wird später noch eingegangen,&lt;br /&gt;
betrachten wir die Frage etwas allgemeiner: &amp;quot;wann statisch, wann dynamisch&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
Die Antwort lautet: -- wie überraschend -- kommt drauf an...&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich kann man sagen: statische Prüfung ist immer aufwändiger als die dynamische. Definiert an einen einfachen&lt;br /&gt;
Builder mit mehrereren Konfigurations-Methoden, kann man die Methoden in beliebiger Reihenfolge aufrufen; im einfachsten&lt;br /&gt;
Falle sogar mehrfach. Möchte man eine Reihenfolge festlegen, die bereits zur Compile-Zeit eingehalten werden muß ist das&lt;br /&gt;
prinzipiell möglich. es erfordert allerdings zusätzliche Klassen und verursacht Aufwand.&lt;br /&gt;
&lt;br /&gt;
Möchte man zur Compile-Zeit sicher sein, daß Muß-Felder gefüllt sind, geht das nur über (häßliche) Konstruktoren und selbst&lt;br /&gt;
dann hat man nur eingeschränkte Kontrolle darüber, ob die Felder mit brauchbaren Werten gefüllt sind.&lt;br /&gt;
&lt;br /&gt;
Es bleibt also eine Abschätzung: Lohnt sich der Aufwand -- wenn es denn überhaupt geht?&lt;br /&gt;
&lt;br /&gt;
Der Aldi-Tip: Mach&amp;#039;s dynamisch und schreib&amp;#039; viele Unit-Tests.&lt;br /&gt;
&lt;br /&gt;
== Migration/Versionierung ==&lt;br /&gt;
Die Separation von Datenspeicherung -- im Entity -- und Manipulation -- im Builder -- macht es einfacher,&lt;br /&gt;
zwischen unterschiedlichen Versionen von Entities zu unterscheiden, diese zu erzeugen und Migration von&lt;br /&gt;
Daten zwischen Versionen durchzuführen.&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>