<?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[Designframe - Befehlsklassen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Programm, welches Befehle entgegen nimmt. Um das möglichst einfach erweiterbar zu halten, habe ich folgende Klassenstruktur:</p>
<pre><code class="language-cpp">Command (BasisKlasse)
 CommandHello (Hello-Befehl)
 CommandList (List-Befehl)

CommandManager
</code></pre>
<p>Nun sieht es so aus, dass der CommandManager eine Funktion ParseCommand hat.</p>
<p>Dieser guckt einfach nach, ob der Befehl bereits ausgeführt wird, usw.</p>
<pre><code class="language-cpp">Command::Create()
{
if (text == &quot;hello&quot;)
{
 return new CommandHello();
}
else if (text == &quot;list&quot;)
{
 return new CommandList();
}
return NULL;
}

// ParseCommand

Command *cmd = Command::Create(msg);

if (!cmd)
 return false;

cmd-&gt;Execute();

// ...
</code></pre>
<p>Mir scheint es aber so, als wäre das Vorgehen noch nicht optimal. Wie würdet ihr das realisieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306606/designframe-befehlsklassen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 16:40:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306606.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Aug 2012 15:09:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 15:09:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Programm, welches Befehle entgegen nimmt. Um das möglichst einfach erweiterbar zu halten, habe ich folgende Klassenstruktur:</p>
<pre><code class="language-cpp">Command (BasisKlasse)
 CommandHello (Hello-Befehl)
 CommandList (List-Befehl)

CommandManager
</code></pre>
<p>Nun sieht es so aus, dass der CommandManager eine Funktion ParseCommand hat.</p>
<p>Dieser guckt einfach nach, ob der Befehl bereits ausgeführt wird, usw.</p>
<pre><code class="language-cpp">Command::Create()
{
if (text == &quot;hello&quot;)
{
 return new CommandHello();
}
else if (text == &quot;list&quot;)
{
 return new CommandList();
}
return NULL;
}

// ParseCommand

Command *cmd = Command::Create(msg);

if (!cmd)
 return false;

cmd-&gt;Execute();

// ...
</code></pre>
<p>Mir scheint es aber so, als wäre das Vorgehen noch nicht optimal. Wie würdet ihr das realisieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237990</guid><dc:creator><![CDATA[fghfgh]]></dc:creator><pubDate>Thu, 02 Aug 2012 15:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 15:10:12 GMT]]></title><description><![CDATA[<p>Ach scheisse, bin irgendwie im falschen Forum gelandet. Hatte mich wohl verlesen, sorry.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237991</guid><dc:creator><![CDATA[fghfgh]]></dc:creator><pubDate>Thu, 02 Aug 2012 15:10:12 GMT</pubDate></item><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 15:17:14 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u109509" rel="nofollow">SeppJ</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f10" rel="nofollow">C (C89 und C99)</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (auch C++0x und C++11)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237992</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Thu, 02 Aug 2012 15:17:14 GMT</pubDate></item><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 15:23:02 GMT]]></title><description><![CDATA[<p>Viel zu kompliziert. Nimm einfach ein enum mit Funktionen zum Wandeln von/zu Strings und ein switch. Fertig. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2237993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237993</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 02 Aug 2012 15:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 15:41:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">cmd-&gt;Execute();
</code></pre>
<p><a href="http://steve-yegge.blogspot.de/2006/03/execution-in-kingdom-of-nouns.html" rel="nofollow">Execution in the Kingdom of Nouns</a></p>
<p>Immer wenn ich eine Klasse xxxManager nennen wuerde, habe ich das Gefuehl, dass irgendwas mit meinem Design nicht stimmt. Sachen wie <code>execute</code> verstaerken das noch ungemein. Meist hat sich dann eine bessere Loesung gefunden, zumindestens bei der Namensgebung.</p>
<p>In deinem Fall handelt es sich um eine <code>CommandQueue</code> . Ein andere Klasse kann das Ausfuehren der Kommandos uebernehmen (Listener). So sind Verwaltung und Ausfuehrung sauber getrennt, Producer/Consumer laesst sich auch ausserhalb von Multithreading gut verwenden ... Es kann mehrere Queues geben, manche speichern nur das zuletzt eingefuegte Element, manche nur das erste, manche Queues sind Ringbuffer ... Ueber Templates kann auch bestimmt werden, welche Kommandos sie entgegen nehmen. Designtechnisch war das immer der beste Ansatz.</p>
<p>Beispielsweise hier eine Queue im Einsatz bei Multithreading: <a href="http://bartoszmilewski.com/2011/11/13/c11-concurrency-series-9-condition-variables/" rel="nofollow">http://bartoszmilewski.com/2011/11/13/c11-concurrency-series-9-condition-variables/</a> . Parameterisiert man noch ueber den verwendeten Container, dann koennen schoene einfache Queues fuer Message passing/commands entworfen werden, die auf den Einsatzzweck zugeschnitten sind.</p>
<p>PS: Wenn deine Kommandos sich so leicht kopieren lassen, dann benutze bitte kein <code>new</code> . Auch gibt es move-Konstruktoren. Dein Ansatz sieht mehr nach Java aus als nach C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2237994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2237994</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Aug 2012 15:41:07 GMT</pubDate></item><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 17:12:29 GMT]]></title><description><![CDATA[<p>Ein Commando erbt immer von meiner Thread-Klasse und lässt sich daher natürlich nicht kopieren.</p>
<p>Ich schaue mir den Link mal an, danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2238027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2238027</guid><dc:creator><![CDATA[fghfgh]]></dc:creator><pubDate>Thu, 02 Aug 2012 17:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to Designframe - Befehlsklassen on Thu, 02 Aug 2012 17:54:51 GMT]]></title><description><![CDATA[<p>fghfgh schrieb:</p>
<blockquote>
<p>Ein Commando erbt immer von meiner Thread-Klasse und lässt sich daher natürlich nicht kopieren.</p>
</blockquote>
<p>1.) Befehl und Aktion wuerde ich trennen. Ein Befehl ist kein Thread. Einige Tutorials zeigen ja, wie man von Threads erbt, aber ich halte das grundsaetzlich fuer eine schlechte Idee.<br />
2.) Ein <code>std::thread</code> laesst sich moven ...<br />
3.) Wenn du das willst, dann kannst du gleich einen <code>std::future</code> nehmen und <code>std::async</code> benutzen.</p>
<p>Und wenn du dir die Tutorials zum C++11 Mutlithreading ansiehst, ist es wohl besser du faengst bei Folge 1 an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2238036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2238036</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 02 Aug 2012 17:54:51 GMT</pubDate></item></channel></rss>