<?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[Große Klasse, Redesign]]></title><description><![CDATA[<p>Hallo!</p>
<p>Eine Klasse 'Image' besitzt Bilddaten und Methoden zur Manipulation dieser<br />
Bilddaten. operator+=(Image&amp; otherPic) ist die Hauptmethode, die otherPic<br />
und *this zuerst vorbereitet und dann addiert. Soweit ist das Design der<br />
Klasse sauber:</p>
<pre><code class="language-cpp">class Image
{
public:
	void operator+=(Image&amp; otherPic);

private:
	unsigned xResolution;
	unsigned yResolution;
	vector&lt;Pixel&gt; vPixels;

	void redEyes();
	void enhanceContrast();
	void denoise();
	void scale();
	void clip();	
	void overlay(vector&lt;Pixels&gt;&amp; vPixels);
};

bla..

Image::operator+=(Image&amp; otherPic)
{
	this-&gt;scale();
	this-&gt;clip();

	otherPic.scale();
	otherPic.clip()
	otherPic.redEyes();
	otherPic.enhanceContrast();
	otherPic.denoise();
	this-&gt;overlay(otherPic.vPixels);	
}
</code></pre>
<p>Das Problem: Bei diesem Design steht beinahe der ganze Code der Software in<br />
der (bereits riesigen) Klasse 'Image', und das wirkt so, als würde man nicht<br />
objektorientiert programmieren, sondern hätte globale Variablen, auf die jede<br />
beliebige Funktion zugreifen kann. -&gt; Unübersichtlich, schwer zu debuggen. Da<br />
noch viele weitere Funktionen zur Manipulation der Daten zu implementieren<br />
sind, ist ein anderes Design erforderlich.</p>
<p>Ich bin mit keiner meiner Ideen zum Redesign so recht glücklich, daher würde<br />
ich mir gerne Eure Vorschläge ansehen, wie man die Klasse aufteilen oder die<br />
Funktionen zur Datenmanipulation auslagern kann.</p>
<p>(Anm: Es geht tatsächlich nicht um Bilddaten, sondern um 3D-Objekte, wo noch<br />
mehr private Daten in der Klasse sind und manipuliert werden, aber als<br />
Metapher für die Diskussion ist die obige Image-Klasse besser geeignet.)</p>
<p>Danke, lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274071/große-klasse-redesign</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 19:04:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274071.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Sep 2010 08:17:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Große Klasse, Redesign on Sun, 19 Sep 2010 08:17:13 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Eine Klasse 'Image' besitzt Bilddaten und Methoden zur Manipulation dieser<br />
Bilddaten. operator+=(Image&amp; otherPic) ist die Hauptmethode, die otherPic<br />
und *this zuerst vorbereitet und dann addiert. Soweit ist das Design der<br />
Klasse sauber:</p>
<pre><code class="language-cpp">class Image
{
public:
	void operator+=(Image&amp; otherPic);

private:
	unsigned xResolution;
	unsigned yResolution;
	vector&lt;Pixel&gt; vPixels;

	void redEyes();
	void enhanceContrast();
	void denoise();
	void scale();
	void clip();	
	void overlay(vector&lt;Pixels&gt;&amp; vPixels);
};

bla..

Image::operator+=(Image&amp; otherPic)
{
	this-&gt;scale();
	this-&gt;clip();

	otherPic.scale();
	otherPic.clip()
	otherPic.redEyes();
	otherPic.enhanceContrast();
	otherPic.denoise();
	this-&gt;overlay(otherPic.vPixels);	
}
</code></pre>
<p>Das Problem: Bei diesem Design steht beinahe der ganze Code der Software in<br />
der (bereits riesigen) Klasse 'Image', und das wirkt so, als würde man nicht<br />
objektorientiert programmieren, sondern hätte globale Variablen, auf die jede<br />
beliebige Funktion zugreifen kann. -&gt; Unübersichtlich, schwer zu debuggen. Da<br />
noch viele weitere Funktionen zur Manipulation der Daten zu implementieren<br />
sind, ist ein anderes Design erforderlich.</p>
<p>Ich bin mit keiner meiner Ideen zum Redesign so recht glücklich, daher würde<br />
ich mir gerne Eure Vorschläge ansehen, wie man die Klasse aufteilen oder die<br />
Funktionen zur Datenmanipulation auslagern kann.</p>
<p>(Anm: Es geht tatsächlich nicht um Bilddaten, sondern um 3D-Objekte, wo noch<br />
mehr private Daten in der Klasse sind und manipuliert werden, aber als<br />
Metapher für die Diskussion ist die obige Image-Klasse besser geeignet.)</p>
<p>Danke, lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954272</guid><dc:creator><![CDATA[gcc]]></dc:creator><pubDate>Sun, 19 Sep 2010 08:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Sun, 19 Sep 2010 08:40:32 GMT]]></title><description><![CDATA[<p>Ich würde die Bildbearbeitungsfunktionen von der Image-Klasse trennen. Ganz grob skizziert vielleicht:</p>
<pre><code class="language-cpp">class Image {
    unsigned xResolution;
    unsigned yResolution;
    vector&lt;Pixel&gt; pixels;
public:
    // Konstruktor, getter, setter, ...
};

class ImageRenderer {
public:
    void render(const Image&amp; image) {
        // ...
    }
};

class ImageFilter {
public:
    virtual void apply(Image&amp; img) = 0;
    virtual ~ImageFilter() {}
};

class RedEyeFilter {
public:
    virtual void apply(Image&amp; img) {
        // Hier rote Augen entfernen
    }
};

class ImageTransformer {
public:
    virtual Image transform(const Image&amp; imgA, const Image&amp; imgB) = 0;
    virtual ~ImageTransformer() {}
};

class Overlayer : ImageTransformer {
public:
    virtual Image transform(const Image&amp; imgA, const Image&amp; imgB) {
        // Bilder übereinander legen und neues Bild zurückgeben
    }
};
</code></pre>
<p>Ja, so in der Art würd ichs jetzt spontan machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954274</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Sun, 19 Sep 2010 08:40:32 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Sun, 19 Sep 2010 11:19:47 GMT]]></title><description><![CDATA[<p>Interessant, dass das Thema in letzer Zeit des öfteren nachgefragt wird.</p>
<p>Z.B gleich hier:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-273691.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-273691.html</a></p>
<p>oder hier:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-273619-and-highlight-is-.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-273619-and-highlight-is-.html</a></p>
<p>Die Threads laufen mehr oder weniger auf das, was OhneName auch sagt heraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954317</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 19 Sep 2010 11:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Sun, 19 Sep 2010 13:12:47 GMT]]></title><description><![CDATA[<p>Das was du dort gemacht hat nennt sich God-class oder God-object <a href="http://de.wikipedia.org/wiki/God_object" rel="nofollow">http://de.wikipedia.org/wiki/God_object</a> und wie schon hier erklärt hilft da nur feiner zu granulieren.</p>
<p>Gruß Blue-Tec</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954353</guid><dc:creator><![CDATA[blue-tec]]></dc:creator><pubDate>Sun, 19 Sep 2010 13:12:47 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Sun, 19 Sep 2010 14:24:54 GMT]]></title><description><![CDATA[<p>Die Operatorüberladung</p>
<pre><code class="language-cpp">void operator+=(Image&amp; otherPic);
</code></pre>
<p>ist auch äusserst fragwürdig. Am besten fährst du, wenn du einige Konventionen beachtest:</p>
<ul>
<li>Benutze Operatoren nur, wenn sie intuitiv sind. Ich würde hier eine benannte Funktion vorziehen, ein Plus kann in dem Zusammenhang vieles bedeuten.</li>
<li>Beachte Const-Correctness. Ein <code>+=</code> verändert den rechten Operand nie. Dass du es doch tust, ist ein umso grösseres Zeichen dafür, dass eine benannte Methode besser geeignet wäre.</li>
<li>Gebe etwas zurück. Die übliche Konvention bei <code>operator+=</code> ist, eine Referenz auf <code>this</code> zurückzugeben, um Verkettungen zu ermöglichen.</li>
<li>Wenn du <code>a += b;</code> schreiben kannst, muss der Ausdruck <code>a = a + b;</code> ebenfalls gültig und semantisch äquivalent mit dem ersten sein.</li>
</ul>
<p>Ich würde hier auf Operatorüberladung verzichten. Siehe auch <a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">Überladung von Operatoren in C++</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954380</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Sep 2010 14:24:54 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Mon, 20 Sep 2010 12:31:12 GMT]]></title><description><![CDATA[<p>Schau dir an wie VTK das macht (oder nimm das gleich, denn es hat sicher 90% der Funktionalität die du brauchst).<br />
(Bezugsdiagramm hier: <a href="http://www.vtk.org/doc/nightly/html/classvtkAlgorithm.html" rel="nofollow">http://www.vtk.org/doc/nightly/html/classvtkAlgorithm.html</a>)</p>
<p>Alles sauber von einer Basisklasse abgeleitet (vtkObject, bzw. hier eher vtkAlgorithm). Das Bild zeigt natürlich nur die erste Ebene der Ableitungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954771</guid><dc:creator><![CDATA[antialias]]></dc:creator><pubDate>Mon, 20 Sep 2010 12:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Mon, 20 Sep 2010 15:03:39 GMT]]></title><description><![CDATA[<p>antialias schrieb:</p>
<blockquote>
<p>Alles sauber von einer Basisklasse abgeleitet...</p>
</blockquote>
<p>&quot;Sauber&quot; ist immer relativ. Ableitungen mögen manche Probleme beheben, bergen aber auch sehr viel Neue. Nichts gegen flache Vererbungshirachien, die hier scheint aber eine tiefe Hierarchie zu sein.</p>
<p>Gerade nichts aussagende Klassennamen wie TObject, CObject, vtkObject... halte ich häufig für ein Anzeichen schlechtes Designs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954852</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 20 Sep 2010 15:03:39 GMT</pubDate></item><item><title><![CDATA[Reply to Große Klasse, Redesign on Mon, 20 Sep 2010 16:53:50 GMT]]></title><description><![CDATA[<p>antialias schrieb:</p>
<blockquote>
<p>Schau dir an wie VTK das macht (oder nimm das gleich, denn es hat sicher 90% der Funktionalität die du brauchst).<br />
(Bezugsdiagramm hier: <a href="http://www.vtk.org/doc/nightly/html/classvtkAlgorithm.html" rel="nofollow">http://www.vtk.org/doc/nightly/html/classvtkAlgorithm.html</a>)</p>
<p>Alles sauber von einer Basisklasse abgeleitet (vtkObject, bzw. hier eher vtkAlgorithm). Das Bild zeigt natürlich nur die erste Ebene der Ableitungen.</p>
</blockquote>
<p>Das sieht aus wie etwas, das ich brauchen kann. So wie ich das verstehe,<br />
werden hier Unix-Pipes nachgebildet. Die Klasse vtkAlgorithm ist ein<br />
allgemeines Rohr. Die Algorithmen, die von vtkAlgorithm ableiten, werden<br />
dadurch ebenfalls Rohre mit kompatiblen Anschlußstücken. Diese Anschluß-<br />
stücke heißen inputPortInformation und outputPortInformation, womit die<br />
Ein- und Ausgangsdaten der Algorithmen gemeint sind.</p>
<p>Leider ist das Ding RIESIG, und ich finde mich in der Doku kaum zurecht.<br />
So weiß ich noch nicht, wo die Abfolge festgelegt wird, d.h. wo die Rohre<br />
zusammengeschaltet werden. Ein kleineres Projekt nach diesem Paradigma wäre<br />
günstig. Aber ich lese mich weiter ein. Danke für den Tipp, die Idee macht<br />
mir Fieber in den Fingern.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954902</guid><dc:creator><![CDATA[gcc]]></dc:creator><pubDate>Mon, 20 Sep 2010 16:53:50 GMT</pubDate></item></channel></rss>