<?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[Funktionen besser als Methoden]]></title><description><![CDATA[<p>Ich hab gehört, dass man, wenn es möglich ist, besser eine Funktion schreiben ,soll als eine Methode, damit die Klasse schlank bleibt. Dabei geht es nicht nur um statische Methoden, sondern um alle Methoden die irgendwie raus können. Was soll da der Vorteil sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293725/funktionen-besser-als-methoden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 05:43:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293725.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Oct 2011 13:06:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 13:06:54 GMT]]></title><description><![CDATA[<p>Ich hab gehört, dass man, wenn es möglich ist, besser eine Funktion schreiben ,soll als eine Methode, damit die Klasse schlank bleibt. Dabei geht es nicht nur um statische Methoden, sondern um alle Methoden die irgendwie raus können. Was soll da der Vorteil sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129226</guid><dc:creator><![CDATA[funktiomethoder]]></dc:creator><pubDate>Sun, 09 Oct 2011 13:06:54 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 13:39:51 GMT]]></title><description><![CDATA[<p>Wo hast du das denn gehört? Um eine Klasse schlank zu halten, kannst du eine neue Klasse schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129236</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Sun, 09 Oct 2011 13:39:51 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 13:47:13 GMT]]></title><description><![CDATA[<p>Soweit ich weiss sollte man Methoden, die nicht auf klasseninterne Variabeln und Methoden zugreifen muessen, als Funktionen implementieren. Allerdings nicht umbedingt um die Klasse schlank zu halten. Es ist halt einfach besser, dass das, was nicht internen Zugriff braucht, auch keinen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129237</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 09 Oct 2011 13:47:13 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 13:50:47 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Soweit ich weiss sollte man Methoden, die nicht auf klasseninterne Variabeln und Methoden zugreifen muessen, als Funktionen implementieren. Allerdings nicht umbedingt um die Klasse schlank zu halten. Es ist halt einfach besser, dass das, was nicht internen Zugriff braucht, auch keinen hat.</p>
</blockquote>
<p>Warum? Kannst du mal ein Beispiel machen um das zu zeigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129238</guid><dc:creator><![CDATA[funktiomethoder]]></dc:creator><pubDate>Sun, 09 Oct 2011 13:50:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 13:57:26 GMT]]></title><description><![CDATA[<p>funktiomethoder schrieb:</p>
<blockquote>
<p>icarus2 schrieb:</p>
<blockquote>
<p>Soweit ich weiss sollte man Methoden, die nicht auf klasseninterne Variabeln und Methoden zugreifen muessen, als Funktionen implementieren. Allerdings nicht umbedingt um die Klasse schlank zu halten. Es ist halt einfach besser, dass das, was nicht internen Zugriff braucht, auch keinen hat.</p>
</blockquote>
<p>Warum? Kannst du mal ein Beispiel machen um das zu zeigen?</p>
</blockquote>
<p>Erklaerung und Beispiel im &quot;Effective C++, Third Edition&quot; von Scott Meyers, Item 23 &quot;Prefer non-member non-friend functions to member functions&quot;.</p>
<p>Hast du das Buch per Zufall zur Hand? Falls nicht kann ichs sehr empfehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129241</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 09 Oct 2011 13:57:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 14:00:20 GMT]]></title><description><![CDATA[<p>ja da war etwas...</p>
<p>an das kapitel erinnere ich mich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129242</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 09 Oct 2011 14:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 14:09:08 GMT]]></title><description><![CDATA[<p>Interessanter Artikel zu einem verwandten Thema: <a href="http://www.gotw.ca/publications/mill02.htm" rel="nofollow">http://www.gotw.ca/publications/mill02.htm</a></p>
<p>Wenn Du die Wahl hast, eine freie Funktion oder eine Methode zu schreiben, dann ist das mit der freien Funktion vielleicht gar keine schlechte Idee, da Du dann nicht versehentlich Invarianten verletzen kannst und eben nur auf public Member Zugriff hast.</p>
<p>Und sonst fällt mir dazu noch ein, dass in generischen Funktionen freie Funktionsaufrufe bevorzugt werden sollten. Beispiel:</p>
<pre><code class="language-cpp">template&lt;class Container&gt;
void show(Container const&amp; c) {
  using std::begin;
  using std::end;
  auto       it = begin(c);
  auto const ee = end(c);
  while (it!=ee) {
    std::cout &lt;&lt; *it &lt;&lt; ' ';
    ++it;
  }
  std::cout &lt;&lt; '\n';
}
</code></pre>
<p>Statt hier c.begin() und c.end() zu schreiben, werden freie Funktionen begin/end aufgerufen. Das ermöglicht es, dieses Funktionstemplate auch für Typen nutzbar zu machen, die solche Methoden gar nicht anbieten. Für rohe Arrays werden in diesem Beispiel dann std::begin/std::end verwendet, die für Arrays auch überladen sind. Und sonst wird noch ADL verwendet, um ggf passende begin/end Funktionen zu suchen.</p>
<p>ADL = argument dependent lookup</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129243</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 09 Oct 2011 14:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 15:42:42 GMT]]></title><description><![CDATA[<p>Könnt ihr mal ein paar Beispiele aus eurem Code zeigen, wo ihr das macht? So ein Container show programmiert man ja nicht so wirklich oft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129274</guid><dc:creator><![CDATA[funktiomethoder]]></dc:creator><pubDate>Sun, 09 Oct 2011 15:42:42 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 16:06:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">inline Quaternion operator * (Quaternion const&amp; q1, Quaternion const&amp; q2)
  {
    Quaternion q(q1[0] * q2[0] - q1[1] * q2[1] - q1[2] * q2[2] - q1[3] * q2[3],
                 q1[0] * q2[1] + q1[1] * q2[0] + q1[2] * q2[3] - q1[3] * q2[2],
                 q1[0] * q2[2] - q1[1] * q2[3] + q1[2] * q2[0] + q1[3] * q2[1],
                 q1[0] * q2[3] + q1[1] * q2[2] - q1[2] * q2[1] + q1[3] * q2[0]);
    return q;
  }
</code></pre>
<pre><code class="language-cpp">template&lt;unsigned int N&gt;
  BlockMatrix&lt;N&gt; operator * (BlockMatrix&lt;N&gt; const&amp; m1, BlockMatrix&lt;N&gt; const&amp; m2)
  {
    BlockMatrix&lt;N&gt; m;
    for (unsigned i = 0; i &lt; N; ++i)
      for (unsigned j = 0; j &lt; N; ++j)
        for (unsigned k = 0; k &lt; N; ++k)
          m[i][j] += m1[k][j] * m2[i][k];
    return m;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2129279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129279</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 09 Oct 2011 16:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen besser als Methoden on Sun, 09 Oct 2011 16:07:29 GMT]]></title><description><![CDATA[<p>Ich bringe mal das Beispiel von Scott Meyers. Sagen wir du moechtest einen Web-Browser programmieren. Dann kannst du neben anderem den Cache, die Histoy und die Cookies loeschen. Du hast also folgende Klasse:</p>
<pre><code class="language-cpp">class WebBrowser
{
public:
	...
	void clearCachge();
	void clearHistroy();
	void clearCookies();
	...
};
</code></pre>
<p>Viele Benutzer moechten nun alles auf einmal loeschen koennen. Man koennte nun eine Methode void clearEverything implementieren in WebBrowser, die den Cache, die Histroy und die Cookies loescht:</p>
<pre><code class="language-cpp">class WebBrowser
{
public:
	...
	void clearEverything();
	...
};
</code></pre>
<p>Die Methode clearEverything() braucht allerdings keinen Zugriff auf Internes von WebBrowser. Man kann sie ohne weiteres mit clearHistroy(), clearCache() und clearCookies() implementieren, die oeffentlich sind.</p>
<p>Nach dem Grundsatz der Data Encapsulation (Datenkapselung) sollte man deshalb clearEverything auch keinen Zugriff auf die internen Dinge geben.<br />
Deshalb ist es besser clearEverything() als als non-member function zu implementieren:</p>
<pre><code class="language-cpp">void clearBrowser(WebBrowser&amp; wb)
{
	wb.clearCache();
	wb.clearHistory();
	wb.clearCookies();
}
</code></pre>
<p>Man kann sich natuerlich ueber dieses Konzept streiten. Falls du genauere und ausfuehrlichere Argumente moechtest verweise ich dich auf meine Quelle oben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2129280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2129280</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 09 Oct 2011 16:07:29 GMT</pubDate></item></channel></rss>