<?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[Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Antipattern-Problem <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="🙂"
    /><br />
Je mehr Funktionalität ich einbaue, neigen meine Klassen manchmal dazu, dass sie sich etwas aufblähen. Die Frage ist: bis zu welchem Grad sind große Klassen tolerierbar und ab wann spricht man von einer &quot;Gottklasse&quot; ?</p>
<p>In meinem Fall habe ich eine Klasse Matrix entwickelt, die schon in die Richtung einer Gottklasse geht. Sie enthält</p>
<p>- die notwendigen Konstruktoren um eine m x n Matrix zu erstellen<br />
- <strong>Get(i,j);</strong> und <strong>Set(i,j,value);</strong><br />
- überladene Operatoren: *<em>+ - * = += -= <em>= &lt;&lt; &gt;&gt; == !=</em></em><br />
- <strong>Extend(b);</strong> // Matrix A zu [A b] erweitern<br />
- <strong>Transpose();</strong> // transponierte Matrix zurückgeben<br />
- <strong>Inverse();</strong> // Inverse berechnen<br />
- <strong>Det();</strong> // Determinante berechnen<br />
- <strong>Submatrix(i,j);</strong> // Untermatrix zurückgeben (entsteht durch Streichen von Zeile i und Spalte j)<br />
- <strong>Gauss();</strong> // Gauss-Algorithmus (Matrix auf Dreiecksform bringen)<br />
- <strong>Decomposite(L,U);</strong> // LR-Zerlegung durchführen (A=L*U)<br />
- <strong>ColumnPivotSearch();</strong> // Spaltenpivotsuche<br />
- <strong>TotalPivotSearch();</strong> // Vollständige Pivotsuche<br />
- <strong>SwapRows(row1, row2);</strong> // Zeilentausch<br />
- <strong>SwapCols(col1, col2);</strong> // Spaltentausch</p>
<p>Hier bin ich etwas unentschlossen, ob und wie ich die Klasse sinnvoll entschlacken kann. Sinnvoll wäre es vielleicht, die Klasse auf Grundfunktionalität (+ - * <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="🙂"
    /> abzuspecken und alles andere, z.B. den Gauss-Algorithmus auszulagern. Andererseits finde ich es auch schön Operationen wie Inverse() oder Det() drinzulassen, und die basieren wiederum auf den Gauss-Algorithmus. Irgendwelche Vorschläge ?</p>
<p>Grüße, Lutz</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246204/anti-patterns-was-ist-eine-quot-gottklasse-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 06:39:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246204.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Jul 2009 12:25:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 12:25:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Antipattern-Problem <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="🙂"
    /><br />
Je mehr Funktionalität ich einbaue, neigen meine Klassen manchmal dazu, dass sie sich etwas aufblähen. Die Frage ist: bis zu welchem Grad sind große Klassen tolerierbar und ab wann spricht man von einer &quot;Gottklasse&quot; ?</p>
<p>In meinem Fall habe ich eine Klasse Matrix entwickelt, die schon in die Richtung einer Gottklasse geht. Sie enthält</p>
<p>- die notwendigen Konstruktoren um eine m x n Matrix zu erstellen<br />
- <strong>Get(i,j);</strong> und <strong>Set(i,j,value);</strong><br />
- überladene Operatoren: *<em>+ - * = += -= <em>= &lt;&lt; &gt;&gt; == !=</em></em><br />
- <strong>Extend(b);</strong> // Matrix A zu [A b] erweitern<br />
- <strong>Transpose();</strong> // transponierte Matrix zurückgeben<br />
- <strong>Inverse();</strong> // Inverse berechnen<br />
- <strong>Det();</strong> // Determinante berechnen<br />
- <strong>Submatrix(i,j);</strong> // Untermatrix zurückgeben (entsteht durch Streichen von Zeile i und Spalte j)<br />
- <strong>Gauss();</strong> // Gauss-Algorithmus (Matrix auf Dreiecksform bringen)<br />
- <strong>Decomposite(L,U);</strong> // LR-Zerlegung durchführen (A=L*U)<br />
- <strong>ColumnPivotSearch();</strong> // Spaltenpivotsuche<br />
- <strong>TotalPivotSearch();</strong> // Vollständige Pivotsuche<br />
- <strong>SwapRows(row1, row2);</strong> // Zeilentausch<br />
- <strong>SwapCols(col1, col2);</strong> // Spaltentausch</p>
<p>Hier bin ich etwas unentschlossen, ob und wie ich die Klasse sinnvoll entschlacken kann. Sinnvoll wäre es vielleicht, die Klasse auf Grundfunktionalität (+ - * <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="🙂"
    /> abzuspecken und alles andere, z.B. den Gauss-Algorithmus auszulagern. Andererseits finde ich es auch schön Operationen wie Inverse() oder Det() drinzulassen, und die basieren wiederum auf den Gauss-Algorithmus. Irgendwelche Vorschläge ?</p>
<p>Grüße, Lutz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748858</guid><dc:creator><![CDATA[lrosema]]></dc:creator><pubDate>Fri, 24 Jul 2009 12:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 12:29:25 GMT]]></title><description><![CDATA[<p>Auf den ersten Blick sehe ich SwapCols und SwapRows. Die kannst du locker als freie Funktionen auslagern. Denn mit Get und Set kannst du anscheinend auf die Cols und Rows zugreifen, oder?</p>
<p>Wir haben in unseren Projekten auch solche Gottklassen. Die sind so an die 10.000 Zeilen lang. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Da ist niemand von uns stolz drauf, das kannst du wissen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748862</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 24 Jul 2009 12:29:25 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 12:37:07 GMT]]></title><description><![CDATA[<p>Du kannst die meisten deiner Memberfunktionen als globale Funktionen implementieren, wenn du über <code>Get()</code> und <code>Set()</code> Zugriff hast.</p>
<p>Was ist mit den Operatoren? Du solltest die Zuweisungsoperatoren ( <code>*=</code> , <code>+=</code> etc.) in der Klasse deklarieren und die unabhängigen ( <code>*</code> , <code>+</code> , <code>==</code> , <code>!=</code> , etc.) ausserhalb.</p>
<p>Aber grundsätzlich habe ich nicht das Gefühl, deine Klasse ist zu mächtig. Sie ist halt eine umfangreichere Matrixklasse, hat aber im Grunde genommen hauptsächlich eine Aufgabe. Ich glaube nicht, dass du viel gewinnen würdest, wenn du das noch gross auftrennst. Ich würde wie gesagt ein paar Funktionen (darunter auch Operatoren) als freie Funktionen implementieren, aber sonst eigentlich nicht viel mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748867</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 24 Jul 2009 12:37:07 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 13:42:35 GMT]]></title><description><![CDATA[<p>Vielleicht nochmal zur Frage: Mit Godclass ist nicht gemeint, das eine Klasse zu viele Funktionen hat. Nur weil deine auch swap-Funktionen hat, macht sie das nicht zur Godclass.</p>
<p>Es ist damit eher gemeint, das eine Klasse viele Funktionen übernimmt. Z.B. wenn deine Matrix-Klasse noch String- und Filestream-Funktionen hätte, würde sie Gott &quot;spielen&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748910</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 24 Jul 2009 13:42:35 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 14:16:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1463">@Artchi</a> und Nexus</p>
<p>Was soll es denn bringen, ehemalige Memberfunktionen als freie Funktionen zu implementieren? Klar, die Klasse wird kleiner. Aber wenn ich vernünftig mit ihr umgehen wollte, müsste ich trotzdem diese ganzen freien Funktionen kennen. Die wären dann aber weiter von der Klasse entfernt.</p>
<p>Ich finde die Klasse wie sie ist in Ordnung.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748936</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Fri, 24 Jul 2009 14:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 14:21:52 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<p>Was soll es denn bringen, ehemalige Memberfunktionen als freie Funktionen zu implementieren?</p>
</blockquote>
<p>Erhöht die Kapselung <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="😉"
    /> und lässt mehr Spielraum für Erweiterungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748942</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Jul 2009 14:21:52 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 14:27:11 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>DStefan schrieb:</p>
<blockquote>
<p>Was soll es denn bringen, ehemalige Memberfunktionen als freie Funktionen zu implementieren?</p>
</blockquote>
<p>Erhöht die Kapselung <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="😉"
    /> und lässt mehr Spielraum für Erweiterungen.</p>
</blockquote>
<p>Hat mir Kapselung nicht das Geringste zu tun und mit Spielraum für Erweiterungen auch nicht.</p>
<p>BTW: Ich find's immer klasse, wenn jemand seine Meinung so herrlich begründet, wie du....</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748951</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Fri, 24 Jul 2009 14:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 14:43:22 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<p>BTW: Ich find's immer klasse, wenn jemand seine Meinung so herrlich begründet, wie du...</p>
</blockquote>
<p>Ja, da hast du Recht, bin gerade bissl zeitknapp und einen Link kann ich dir auch nicht geben, da ich nicht an meinem Rechner sitze.</p>
<p>Meyers oder Herb hatte mal was dazu geschrieben, ich versuchst mal kurz.</p>
<pre><code class="language-cpp">class A
{
    private:
            int b;
    public:
            void setB(int x)  { b = x; }
            void getB() const { return b; }
            void transformB() { b = b*(-3); }
}
</code></pre>
<p>Ähnlich der MatrixKlasse. Nun wieso erhöhe ich die Kapselung, wenn ich transformB aus der Klasse hole ?<br />
Was macht transformB eigentlich ? Es greift auf meine private Variable zu. Somit ist da nichts geschützt bzw sicher gekapselt, aber auch nicht schlimm.</p>
<p>Würde es die Kapselung erhöhen, wenn ich transformB rausholen würde?</p>
<pre><code class="language-cpp">class A
{
    private:
            int b;
    public:
            void setB(int x)  { b = x; }
            void getB() const { return b; }
}

void transformB(A&amp; a) { a.setB( a.getB()*(-3) ); }
</code></pre>
<p>Was ist hier passiert ? Eine Funktionen weniger, die auf b direkt zugreifen kann, dh b ist noch besser gekapselt, da weniger Funktionen auf sie Zugriff haben.</p>
<p>Soviel zur Kapselung.</p>
<p>Kommen wir zur Erweiterbarkeit:<br />
Was ist wenn nun ein B kommt, im Matrix-Fall könnte es ein Vektor sein, der von Matrix ableitet:</p>
<pre><code class="language-cpp">class B : public A
</code></pre>
<p>Und siehe da, ich kann transform auch mit einem B-Objekt aufrufen, wäre es noch in der Klasse A dann würde dass nicht gehen. Somit kann ich mit freien Funktionen einfacher meine Software erweitern ( *ganz so auch nun wieder nicht* ).</p>
<p>Ich hoffe so reicht dir meine Meinung <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>Edit: Da schreibt man ne Zeit lang nicht mehr so oft und überall schleichen sich Fehler ein ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748959</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 24 Jul 2009 14:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 14:54:11 GMT]]></title><description><![CDATA[<p>Naja, mit Kapselung hat das tatsächlich nichts zutun. Der Grund ist einfach, das z.B. die Swap-Funktionen rein Komfort-Funktionen sind. Und Komfort-Funktionen sollte man frei stellen.</p>
<p>Für gewöhnlich brauche ich <em>Member</em>funktionen, um auf die <em>privaten</em> Elemente zugreifen zu können.</p>
<p>Ein bsp. aus Scott Meyers Buch:</p>
<pre><code class="language-cpp">class Browser
{
public:
    void clear();  // Seite aus Speicher löschen
    void load();   // Seite laden

    void reload()
    {
         clear();
         load();
    }
};
</code></pre>
<p>DIe reload-Funktion ist eine reine <em>Komfortfunktion</em> für den Anwender! Man sieht an der Implementierung, das sie <em>nicht</em> auf private oder protected Elemente zugreifen <em>muß</em>.</p>
<p>Das zeigt mir, das es keinen Grund gibt, diese reload-Funktion als Member Element zu haben.</p>
<pre><code class="language-cpp">class Browser
{
public:
    void clear();  // Seite aus Speicher löschen
    void load();   // Seite laden
};

void reload(Browser &amp;b)
{
     b.clear();
     b.load();
}
</code></pre>
<p>Jetzt hat man noch die Möglichkeit, <code>reload(Browser&amp;)</code> in eine andere Header-Datei auszulagern. Und somit wäre es sogar möglich, das jemand eine andere reload-Funktion bereit stellt, ohne die reload-Funktion überschreiben zu müssen. Denn die neue reload-Funktion könnte nämlich sogar im selben Namespace liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748969</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 24 Jul 2009 14:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 15:04:04 GMT]]></title><description><![CDATA[<p>Naja, wenn ich die Funktionen aus der Klasse auslagere, dann werde ich diese Funktionen zusammen mit der Klasse in einen eigenen Namespace packen. Dann würde der Nachteil, dass die Funktionen weiter weg von der Klasse sind, nicht so ins Gewicht fallen.</p>
<p>Wenn ich die Algorithmen wie z.B. die Pivotsuche, Gauss, LR-Zerlegung auslagere, so dass nur noch grundlegende Rechenoperationen für Matrizen in der Klasse übrig bleiben, wäre das ein bißchen klarer getrennt.</p>
<p>Die Gauss- und Pivotsuche- Funktionen sind ja nicht mehr &quot;nur&quot; Matrizenrechnung sondern schon eine Anwendung der Matrizenrechnung für eine bestimmte Aufgabe (Gleichungssysteme lösen).</p>
<p>Noch ist die Klasse ja relativ klein, aber wenn ich weitere Funktionen einfach immer nur in die Klasse packen würde, kann es schnell unübersichtlich werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748970</guid><dc:creator><![CDATA[lrosema]]></dc:creator><pubDate>Fri, 24 Jul 2009 15:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 15:05:24 GMT]]></title><description><![CDATA[<p>Zusätzlich dazu dass du die Funktionen aus der Klasse rausholen und sie als freie Funktionen definieren kannst, könntest du sie auch noch in einen eigenen Header verfrachten, z.B. alles was über die Grundfunktionalität hinausgeht. Damit hast du dann zwei (oder mehr) verschiedene Verantwortlichkeiten getrennt und die Klasse entspricht dem MxN-Container für Zahlen, zusammen mit den Grundrechenarten, während der ausgelagerte Header (oder auch mehrere) das Modul für die etwas &quot;forgeschritteneren&quot; Operationen bilden, die man nicht unbedingt in jeder Anwendung braucht, in der eine Matrix benötigt wird. Somit müsste der Compiler im einfachen Anwendungsfall nicht mehr die komplette Palette an komplizierten Funktionen compilieren, obwohl sie nicht gebraucht werden. Das entspräche dann der allgemeinen C++-Philosophie &quot;don't pay for what you don't need&quot;, und dem <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" rel="nofollow">Single Responsibility Principle</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1748978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1748978</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 24 Jul 2009 15:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 16:45:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Naja, mit Kapselung hat das tatsächlich nichts zutun.</p>
</blockquote>
<p>Das sehe ich nicht so. Wenn die Funktion, die lediglich Funktionen braucht, die öffentlich verfügbar sind, dann heisst das ja nicht, dass man zwangsweise auch nur diese benutzt. Sprich für mich als Programmierer dieser Funktion verschafft das auslagern auch ein gewisses Mass an Sicherheit, dass ich die Invariante nicht störe. Sprich es ist mir gar nicht möglich, wenn die Funktion ausgelagert ist. (Sofern die öffentlichen Funktionen das nicht tun).</p>
<p>Wenn ich z.B eine Fenster Klasse habe, die triviale getter, welche die X/Y Koordinaten zurückgeben, haben und dann in einer Funktion aus irgendeinem Grund halt anstatt die <code>getX</code> -Funktion zu benutzen einfach direkt auf den Wert zugreife, dann hast du sofort ein Problem, wenn du jetzt die getter auf z.B relative Koordinaten umrechen musst (was dann im getter passiert). Eine Funktion, die von aussen darauf zugreift, benutzt brav die getter und alles funktioniert wunderprächtig. Aber in der Funktion, die halt dann doch die Member benutzt läuft alles schief. Und das ist imo ein unnötiges Risiko.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749022</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 24 Jul 2009 16:45:19 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 17:36:47 GMT]]></title><description><![CDATA[<blockquote>
<p>- Gauss(); // Gauss-Algorithmus (Matrix auf Dreiecksform bringen)<br />
- Decomposite(L,U); // LR-Zerlegung durchführen (A=L*U)<br />
- ColumnPivotSearch(); // Spaltenpivotsuche<br />
- TotalPivotSearch(); // Vollständige Pivotsuche</p>
</blockquote>
<p>Das sind Algorithmen und brauchen nicht als Methoden der Klasse implementiert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749061</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 24 Jul 2009 17:36:47 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 18:08:56 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<blockquote>
<p>Naja, mit Kapselung hat das tatsächlich nichts zutun.</p>
</blockquote>
<p>Das sehe ich nicht so. Wenn die Funktion, die lediglich Funktionen braucht, die öffentlich verfügbar sind, dann heisst das ja nicht, dass man zwangsweise auch nur diese benutzt. Sprich für mich als Programmierer dieser Funktion verschafft das auslagern auch ein gewisses Mass an Sicherheit, dass ich die Invariante nicht störe. Sprich es ist mir gar nicht möglich, wenn die Funktion ausgelagert ist. (Sofern die öffentlichen Funktionen das nicht tun).</p>
<p>Wenn ich z.B eine Fenster Klasse habe, die triviale getter, welche die X/Y Koordinaten zurückgeben, haben und dann in einer Funktion aus irgendeinem Grund halt anstatt die <code>getX</code> -Funktion zu benutzen einfach direkt auf den Wert zugreife, dann hast du sofort ein Problem, wenn du jetzt die getter auf z.B relative Koordinaten umrechen musst (was dann im getter passiert). Eine Funktion, die von aussen darauf zugreift, benutzt brav die getter und alles funktioniert wunderprächtig. Aber in der Funktion, die halt dann doch die Member benutzt läuft alles schief. Und das ist imo ein unnötiges Risiko.</p>
</blockquote>
<p>Und wer garantiert dir, das die ausgelagerte Funktion noch richtig funktioniert, wenn sich plötzlich die Schnittstelle ändert und relative statt absolute koordinaten zurück gibt?</p>
<p>Dieses ganze Auslagern und überall Wiederverwenden solcher Funktionen führt meiner Meinung nach nur zu &quot;Gottfunktionen&quot;. Wenn die Funktionen nicht so trivial wie reload sind und irgendwas geändert werden muss, dann kann es schnell passieren, dass die Funktion für ein paar Klassen nicht mehr das tut was sie soll. Das führt einfach nur zu unzähligen Abhängigkeiten im Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749073</guid><dc:creator><![CDATA[tralala]]></dc:creator><pubDate>Fri, 24 Jul 2009 18:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 18:22:21 GMT]]></title><description><![CDATA[<p>KasF und drakon! Ja, stimmt. Fällt mir jetzt auch so langsam auf, das die Kapselung besser gewahrt wird. Um so besser, noch ein Argument für die freien Funktionen. <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>@tralala! Wenn sich das Verhalten der Schnittstelle ändert, ist das mit oder ohne freie Funktion ein Problem. Eine Schnittstelle soll genau sagen, was sie tut. <code>getX()</code> und <code>getY()</code> ist natürlich generell undeutlich. Man kann deshalb das Verhalten dieser Funktionen in der API-Doku beschreiben (natürlich darf man die Doku nicht nachträglich ändern...).</p>
<p>Am besten wäre aber natürlich ein <em>eindeutiger</em> Funktionsname, wie <code>getRelativX()</code> und <code>getRelativY()</code> ! Und wenn die Implementierung auf Einmal absolute Werte liefert, dann ist das ein Fehler. Aber was hat da die freie Funktion damit zu schaffen? Die ist total unschuldig. Denn nicht nur die frei Funktion wäre von diesem Fehler betroffen, sondern JEDER der die getter-Funktionen benutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749080</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Fri, 24 Jul 2009 18:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Fri, 24 Jul 2009 18:36:18 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Am besten wäre aber natürlich ein <em>eindeutiger</em> Funktionsname, wie <code>getRelativX()</code> und <code>getRelativY()</code> !</p>
</blockquote>
<p>Wobei natürlich auch das nicht eindeutig sein muss. <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>Ich denke, man kann die Funktionsnamen soweit so bennen, sofern es im logischen Kontext Sinn macht, oder wenn es unterschiedliche Möglichkeiten gibt, wie eben das Abfragen der absoluten oder relativen Koordinaten. Den Rest muss halt in der Referenz stehen. Sonst müsste man ja so etwas schreiben:</p>
<pre><code class="language-cpp">void getx_relative_and_clamp_to_0_1024 (){...}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1749089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749089</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 24 Jul 2009 18:36:18 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 01:02:30 GMT]]></title><description><![CDATA[<p>Wenn eine Funktion ala &quot;getx_relative_and_clamp_to_0_1024&quot; wirklich Sinn macht, dann sollte sie auch so heissen. OK, das &quot;relative&quot; sollte man IMO weglassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749222</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 25 Jul 2009 01:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 05:55:59 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>@tralala! Wenn sich das Verhalten der Schnittstelle ändert, ist das mit oder ohne freie Funktion ein Problem. Eine Schnittstelle soll genau sagen, was sie tut. <code>getX()</code> und <code>getY()</code> ist natürlich generell undeutlich. Man kann deshalb das Verhalten dieser Funktionen in der API-Doku beschreiben (natürlich darf man die Doku nicht nachträglich ändern...).</p>
<p>Am besten wäre aber natürlich ein <em>eindeutiger</em> Funktionsname, wie <code>getRelativX()</code> und <code>getRelativY()</code> ! Und wenn die Implementierung auf Einmal absolute Werte liefert, dann ist das ein Fehler. Aber was hat da die freie Funktion damit zu schaffen? Die ist total unschuldig. Denn nicht nur die frei Funktion wäre von diesem Fehler betroffen, sondern JEDER der die getter-Funktionen benutzt.</p>
</blockquote>
<p>Ja, seh ich auch so, aber ich versteh nicht, was es dann bringt eine freie Funktion zu machen, statt sie in der Klasse zu lassen. Ich versteh einfach nicht was an drakons Beispiel jetzt besser gekapselt und sicherer sein soll bzw. wieso man die Funktion nicht in der Klasse lassen kann, man kann ja trotzdem die getter verwenden. Ich finde halt einfach das die Gefahr, dass man sich ungewollte abhängigkeiten schafft viel größer ist, vorallem, wenn man die freien Funktionen so schreibt, dass sie auch von anderen Klassen verwendet werden können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749237</guid><dc:creator><![CDATA[tralala]]></dc:creator><pubDate>Sat, 25 Jul 2009 05:55:59 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 06:29:20 GMT]]></title><description><![CDATA[<p>Artchi schrieb:</p>
<blockquote>
<p>Auf den ersten Blick sehe ich SwapCols und SwapRows.</p>
</blockquote>
<p>Das ist sinnfrei. Gerade diese beiden Methoden profitieren enorm vom Wissen der Speicherung der Daten in einer Matrix. Außerhalb der Klasse sind die Elemente nur noch über die Indizes ansprechbar, während innerhalb der Klasse man ggf. Zeiger auf Spalten oder Reihen vertauschen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749241</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sat, 25 Jul 2009 06:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 07:19:38 GMT]]></title><description><![CDATA[<p>tralala schrieb:</p>
<blockquote>
<p>Ja, seh ich auch so, aber ich versteh nicht, was es dann bringt eine freie Funktion zu machen, statt sie in der Klasse zu lassen.</p>
</blockquote>
<p>Lassen wir den Guru etwas dazu sagen:</p>
<p><a href="http://www.gotw.ca/gotw/084.htm" rel="nofollow">http://www.gotw.ca/gotw/084.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749250</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 25 Jul 2009 07:19:38 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 07:53:26 GMT]]></title><description><![CDATA[<p>Und was sagt der Guru dazu?</p>
<p>tralala schrieb:</p>
<blockquote>
<p>Ich finde halt einfach das die Gefahr, dass man sich ungewollte abhängigkeiten schafft viel größer ist, vorallem, wenn man die freien Funktionen so schreibt, dass sie auch von anderen Klassen verwendet werden können.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1749253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749253</guid><dc:creator><![CDATA[tralala]]></dc:creator><pubDate>Sat, 25 Jul 2009 07:53:26 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 08:12:43 GMT]]></title><description><![CDATA[<p>tralala schrieb:</p>
<blockquote>
<p>Und was sagt der Guru dazu?</p>
<p>tralala schrieb:</p>
<blockquote>
<p>Ich finde halt einfach das die Gefahr, dass man sich ungewollte abhängigkeiten schafft viel größer ist, vorallem, wenn man die freien Funktionen so schreibt, dass sie auch von anderen Klassen verwendet werden können.</p>
</blockquote>
</blockquote>
<p>Toller Guru <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="😉"
    /> Aber du warst da glaub ich nicht gemeint...</p>
<p>Ich weiß nicht welche &quot;ungewollten Abhängigkeiten&quot; du meinst... Sei mal deutlicher!<br />
Es geht hier auch um den generischen Ansatz.</p>
<pre><code class="language-cpp">template &lt; typename ContainerT &gt;
void clear( ContainerT &amp;cnt )
{
    cnt.erase( cnt.begin(), cnt.end() );
}
</code></pre>
<p>Sollte für vector/list/... aber eben auch für basic_string funktionieren.<br />
Stattdessen gibt es das clear() in den Klassen vector/... und basic_string.</p>
<p>Und wenn deine allgemeine freie Funktion mal ausnahmsweise für einen bestimmten Typen anders implementiert wird (weil die Schnittstelle anders ist, blame you), dann gibt es eine Spezialisierung, die man auch gleich über den Header der nötigenden Klasse bekommt.</p>
<p>Ich seh immer noch keine Abhängigkeiten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749259</guid><dc:creator><![CDATA[Trödelmeier]]></dc:creator><pubDate>Sat, 25 Jul 2009 08:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Anti-Patterns: Was ist eine &amp;quot;Gottklasse&amp;quot; ? on Sat, 25 Jul 2009 08:47:06 GMT]]></title><description><![CDATA[<p>Naja, das sind hier immer nur so trivial Beispiele mit Funktionen die aus 2 bis 3 Aktionen bestehen. Wer programmiert denn täglich irgendwelche Container mit so klar definiertem verhalten? Normal programmiert man irgendwelche kompliziertere Anwendungslogik und da finde ich es gefährlich alles aus den Klassen raus zu ziehen. Wenn die Anwenungslogik sich ändert oder nen Bug für einen Fall hatte, musst du schauen, ob andere Klassen die gleiche Funktion verwenden und ob sich da das verhalten auch ändern soll oder ob du hier und da was spezialisieren musst usw...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1749272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1749272</guid><dc:creator><![CDATA[tralala]]></dc:creator><pubDate>Sat, 25 Jul 2009 08:47:06 GMT</pubDate></item></channel></rss>