<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Designfrage&#x2F;Template]]></title><description><![CDATA[<p>Tag!</p>
<p>Nachdem ich mich so allmählich durch das Buch &quot;Modern C++ Design, Generic Programming and Design Patterns Applied&quot; von Andrei Alexandrescu welze, überlege ich ständig, wo ich am sinnvollsten Templates im Quellcode nutzen kann.</p>
<p>Jüngster Einsatz ist bei einer Klasse, die Daten aus einer Datei liest. Ich möchte es deshalb abstrahieren, weil das später evtl. in anderen Formaten/Backends (Datenbank zum Bleistift) möglich sein soll.</p>
<p>Daher folgendes Design:</p>
<pre><code class="language-cpp">template &lt;class Loader&gt; 
class ItemsetLoader : public Loader { 
    public: 
        static bool LoadFromFile( const std::string&amp; filename, model::Itemset&amp; itemset ); 
}; 

template &lt;class Loader&gt; 
bool ItemsetLoader&lt;Loader&gt;::LoadFromFile( const std::string&amp; filename, model::Itemset&amp; itemset ) { 
    return Loader::LoadFromFileImpl( filename, itemset ); 
} 

// Ein Beispiel-Loader für YAML: 
class YAMLItemsetLoader { 
    protected: 
        static bool LoadFromFileImpl( const std::string&amp; filename, model::Itemset&amp; itemset ); 
};
</code></pre>
<p>&quot;itemset&quot; ist hier schlichtweg das Objekt, welches die Daten empfangen soll. Ist ein solches Design sinnvoll? Ich persönlich finde es recht sexy, wollte aber sicherheitshalber mal rumfragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Man könnte natürlich auch einfach getrennte Klassen bauen, wie z.B. YAMLLoader, DBLoader, XYZLoader etc., die einfach alle LoadFromFile() implementiert haben. Aber ich finde die Idee gut, dass es ein gemeinsames Interface gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252159/designfrage-template</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 18:31:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252159.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Oct 2009 14:39:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage&#x2F;Template on Thu, 15 Oct 2009 14:39:07 GMT]]></title><description><![CDATA[<p>Tag!</p>
<p>Nachdem ich mich so allmählich durch das Buch &quot;Modern C++ Design, Generic Programming and Design Patterns Applied&quot; von Andrei Alexandrescu welze, überlege ich ständig, wo ich am sinnvollsten Templates im Quellcode nutzen kann.</p>
<p>Jüngster Einsatz ist bei einer Klasse, die Daten aus einer Datei liest. Ich möchte es deshalb abstrahieren, weil das später evtl. in anderen Formaten/Backends (Datenbank zum Bleistift) möglich sein soll.</p>
<p>Daher folgendes Design:</p>
<pre><code class="language-cpp">template &lt;class Loader&gt; 
class ItemsetLoader : public Loader { 
    public: 
        static bool LoadFromFile( const std::string&amp; filename, model::Itemset&amp; itemset ); 
}; 

template &lt;class Loader&gt; 
bool ItemsetLoader&lt;Loader&gt;::LoadFromFile( const std::string&amp; filename, model::Itemset&amp; itemset ) { 
    return Loader::LoadFromFileImpl( filename, itemset ); 
} 

// Ein Beispiel-Loader für YAML: 
class YAMLItemsetLoader { 
    protected: 
        static bool LoadFromFileImpl( const std::string&amp; filename, model::Itemset&amp; itemset ); 
};
</code></pre>
<p>&quot;itemset&quot; ist hier schlichtweg das Objekt, welches die Daten empfangen soll. Ist ein solches Design sinnvoll? Ich persönlich finde es recht sexy, wollte aber sicherheitshalber mal rumfragen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Man könnte natürlich auch einfach getrennte Klassen bauen, wie z.B. YAMLLoader, DBLoader, XYZLoader etc., die einfach alle LoadFromFile() implementiert haben. Aber ich finde die Idee gut, dass es ein gemeinsames Interface gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1792941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1792941</guid><dc:creator><![CDATA[SBoch]]></dc:creator><pubDate>Thu, 15 Oct 2009 14:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage&#x2F;Template on Thu, 15 Oct 2009 18:46:51 GMT]]></title><description><![CDATA[<p>Finde ich durchaus sinnvoll. Mache es für gewisse Sachen ähnlich.</p>
<p>In dem Beispiel macht es eigentlich nicht so viel aus, wenn das mit Klassen lösen würdest. Aber das schöne an diesem Ansatz ist, ist, dass du jetzt noch etwas anderes dazu tun kannst und keine extra Klasse definieren brauchst. z.B:</p>
<pre><code class="language-cpp">template &lt;class Loader, class Deleter&gt;
class ItemsetLoader : public Loader {
    public:
        static bool LoadFromFile( const std::string&amp; filename, model::Itemset&amp; itemset );
    static void DeleteFile ( const std::string&amp; filename){...}
};

class NormalLoader
{...};

class FancyLoader
{...};

class NormalDeleter
{...};

class FancyDeleter
{...};
</code></pre>
<p>Da kannst du jetzt varieren, wie du willst. Stell dir vor du müsstest jede Möglichkeit der Normal und Fancy Klasse ausprogrammieren. Und im Normal Fall gibt es ja mehr, als 4 Möglichkeiten. Das ausrechnen spare ich mir hier mal. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Diese Technik wird im übrigen in der Standardbibliothek recht oft benutzt.</p>
<p>Also finde ich das durchaus eine gute Überlegung. Vor allem kann man dem User die Freiheit überlassen gewisse Sachen selbst zu steuern, wenn der Bedarf da ist. Wenn nicht gibt es ja noch die Default Template Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793062</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 15 Oct 2009 18:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage&#x2F;Template on Thu, 15 Oct 2009 20:24:16 GMT]]></title><description><![CDATA[<p>SBoch schrieb:</p>
<blockquote>
<p>Man könnte natürlich auch einfach getrennte Klassen bauen, wie z.B. YAMLLoader, DBLoader, XYZLoader etc., die einfach alle LoadFromFile() implementiert haben. Aber ich finde die Idee gut, dass es ein gemeinsames Interface gibt.</p>
</blockquote>
<p>Nein, bei deinem Beispiel ist da nichts gemeinsam. Es ist höchstens ein marignaler Unterschied, wenn du anstatt YAMLLoader ein ItemsetLoader&lt;YAMLItemsetLoader&gt; schreibst. Dadurch hast du noch nichts gewonnen. Den Typen musst du immer noch mitschleppen. Das was dein Ansatz so wie er jetzt ist macht, ist nichts weiter, als eine weitere Ebene an Komplexität hinzuzufügen.</p>
<p>Policy based design ist nur Sinnvoll, wenn die Klasse die einzelnen Policies sinnvoll miteinander kombiniert. Das heißt, die äußere Klasse organisiert, und die Policies führen die konkreten Aktionen aus. Wenn es aber nichts zu organisieren gibt, ist der ganze Designansatz irgendwie...komisch.</p>
<p>Ich denke, an der Stelle sollte man sich immer schön an occam's razor halten: Wenn es zwei Wege gibt etwas zu machen, dann nimm den einfacheren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793110</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 15 Oct 2009 20:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage&#x2F;Template on Thu, 15 Oct 2009 20:58:40 GMT]]></title><description><![CDATA[<p>Okay, also scheint es wirklich nur &quot;sexy auszusehen&quot;. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Anders wäre es wohl, wenn es einen Loader gibt, der Policy-Klassen wie YAML, TXT etc. als Datenquelle nutzt, richtig? Soweit möchte ich natürlich nicht gehen, aber rein von der Theorie sollte das so passen.</p>
<p>Ich danke Dir für den Anstoß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793121</guid><dc:creator><![CDATA[SBoch]]></dc:creator><pubDate>Thu, 15 Oct 2009 20:58:40 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage&#x2F;Template on Thu, 15 Oct 2009 21:01:22 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>:<br />
Sorry, deinen Beitrag habe ich komischerweise total überlesen. So wie du es beschreibst macht es schon Sinn, ja. Wobei da einiges an Funktionalität hinzukommt im Vergleich zu meinem Beispiel. Ich wollte eigentlich nur ein gemeinsames Interface bezwecken, was evtl. falsch am Platze ist.</p>
<p>Dennoch auch von Dir interessante Anregungen, Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1793122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1793122</guid><dc:creator><![CDATA[SBoch]]></dc:creator><pubDate>Thu, 15 Oct 2009 21:01:22 GMT</pubDate></item></channel></rss>