<?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[Klassenarchitektonische Frage]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Habe folgende Situation. Ich habe eine Klasse, nennen wir sie <em>Spektrum</em>, welche ein bestimmtes mathematisch-physikalisches Objekt repräsentiert (was genau, ist erst mal egal). Nun gibt es noch eine Klasse <em>SpektrumController</em>. Diese Klasse kümmert sich um die Kommunikation zwischen dem jeweiligen <em>Spektrum</em> und dem User bzw. dem Filesystem durch Methoden wie <em>ReadFromFile(), WriteToFile(), Plot(), PrintStatistics()</em>. Warum mache ich das? Ich möchte eine strikte Trennung zwischen den &quot;eigentlichen&quot; mathematischen Objekten und dem &quot;User-Interface&quot;. Die mathematischen Objekte sollen später evtl. mal in eine wissenschaftliche Analyse-Library eingebunden werden, da möchte ich sie nicht durch Methoden wie WriteToFile() etc. verseuchen.</p>
<p>Nun allerdings der Haken: Die Controller-Klasse muss alle Attribute des jeweiligen Spektrum-Objekts kennen. Meine Frage an euch wäre nun, durch welche Art der Beziehung diese Bedingung am saubersten vollzogen werden kann. Einige bisherige Überlegungen von mir:</p>
<p>- Hat-Beziehung mit Get-Methoden:<br />
Ich implementiere <em>SpektrumController</em> eine(n Pointer auf eine) Instanz von <em>Spektrum</em> und in <em>Spektrum</em> für jedes Attribut eine Get-Methode: GetFieldMap(), GetSpektrometerLength() etc.. womit <em>SpektrumController</em> auf die Attribute zugreifen kann. Problem: umständlich...</p>
<p>- Hat-Beziehung mit Friend-Class:<br />
Ich mache <em>SpektrumController</em> zur Friend-Class von <em>Spektrum</em>. Problem: &quot;being fried with a father doesn't mean being friend with his son&quot;. Will ich von <em>SpektrumController</em> weitere Spezialisierungen ableiten, muss ich diese wieder explizit zur Friend Class machen. Außerdem widerspricht das der strikten Trennung, da ich die Friend Classes in der Spektrum.h benenne.</p>
<p>- Vererbung:<br />
Ich lasse <em>SpektrumController</em> von <em>Spektrum</em> erben. Das hätte den Vorteil, dass automatisch auf alle Attribute zugegriffen werden darf. Problem: möchte ich noch weitere Spezialisierungen von <em>Spektrum</em> ableiten und dazu zugehörige Controllers entsprechend von <em>SpektrumController</em> (was der Fall ist), tritt das Diamond-Problem auf. Ferner kann ich Basisklassen nicht zur Laufzeit per Konstruktor initialisieren (also erst den Controller und dann das zugehörige Spektrum), müsste also noch zusätzliche Methoden für die nachträgliche Initialisierung schreiben.</p>
<p>Was wäre eurer Meinung nach die sauberste Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294407/klassenarchitektonische-frage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 21:44:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294407.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Oct 2011 16:35:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Mon, 24 Oct 2011 16:35:03 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Habe folgende Situation. Ich habe eine Klasse, nennen wir sie <em>Spektrum</em>, welche ein bestimmtes mathematisch-physikalisches Objekt repräsentiert (was genau, ist erst mal egal). Nun gibt es noch eine Klasse <em>SpektrumController</em>. Diese Klasse kümmert sich um die Kommunikation zwischen dem jeweiligen <em>Spektrum</em> und dem User bzw. dem Filesystem durch Methoden wie <em>ReadFromFile(), WriteToFile(), Plot(), PrintStatistics()</em>. Warum mache ich das? Ich möchte eine strikte Trennung zwischen den &quot;eigentlichen&quot; mathematischen Objekten und dem &quot;User-Interface&quot;. Die mathematischen Objekte sollen später evtl. mal in eine wissenschaftliche Analyse-Library eingebunden werden, da möchte ich sie nicht durch Methoden wie WriteToFile() etc. verseuchen.</p>
<p>Nun allerdings der Haken: Die Controller-Klasse muss alle Attribute des jeweiligen Spektrum-Objekts kennen. Meine Frage an euch wäre nun, durch welche Art der Beziehung diese Bedingung am saubersten vollzogen werden kann. Einige bisherige Überlegungen von mir:</p>
<p>- Hat-Beziehung mit Get-Methoden:<br />
Ich implementiere <em>SpektrumController</em> eine(n Pointer auf eine) Instanz von <em>Spektrum</em> und in <em>Spektrum</em> für jedes Attribut eine Get-Methode: GetFieldMap(), GetSpektrometerLength() etc.. womit <em>SpektrumController</em> auf die Attribute zugreifen kann. Problem: umständlich...</p>
<p>- Hat-Beziehung mit Friend-Class:<br />
Ich mache <em>SpektrumController</em> zur Friend-Class von <em>Spektrum</em>. Problem: &quot;being fried with a father doesn't mean being friend with his son&quot;. Will ich von <em>SpektrumController</em> weitere Spezialisierungen ableiten, muss ich diese wieder explizit zur Friend Class machen. Außerdem widerspricht das der strikten Trennung, da ich die Friend Classes in der Spektrum.h benenne.</p>
<p>- Vererbung:<br />
Ich lasse <em>SpektrumController</em> von <em>Spektrum</em> erben. Das hätte den Vorteil, dass automatisch auf alle Attribute zugegriffen werden darf. Problem: möchte ich noch weitere Spezialisierungen von <em>Spektrum</em> ableiten und dazu zugehörige Controllers entsprechend von <em>SpektrumController</em> (was der Fall ist), tritt das Diamond-Problem auf. Ferner kann ich Basisklassen nicht zur Laufzeit per Konstruktor initialisieren (also erst den Controller und dann das zugehörige Spektrum), müsste also noch zusätzliche Methoden für die nachträgliche Initialisierung schreiben.</p>
<p>Was wäre eurer Meinung nach die sauberste Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135241</guid><dc:creator><![CDATA[yeoldelloyd]]></dc:creator><pubDate>Mon, 24 Oct 2011 16:35:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Mon, 24 Oct 2011 18:48:59 GMT]]></title><description><![CDATA[<p>Zwei oder Drei... ich würd sagen, zwei, kann mir aber vorstellen, das Diamond Problem zu umgehen.</p>
<p>Edit: Was genau meinst du mit &quot;Strikte Trennung&quot;?<br />
Und explizit zu friend Class machen ist nicht explizit mehrere Initialisierungs oder Getter(/Setter)-Methoden schreiben.<br />
Deswegen würd ich dir zu 2 raten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135310</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Mon, 24 Oct 2011 18:45:49 GMT]]></title><description><![CDATA[<p>drölf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135312</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 24 Oct 2011 18:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Mon, 24 Oct 2011 19:28:00 GMT]]></title><description><![CDATA[<p>Erste Variante. Wenn Du wirklich eine saubere Trennung möchtest, macht das einfach Sinn. friend funktioniert auch, hat aber den klaren Nachteil, dass Spektrum eine Klasse SpektrumController kennen muss (zumindest vom Namen her). Vererbung ist eine ziemlich starke Bindung, die die Vererbungshierarchie blockiert, sprich: möchtest Du später wirklich eine Hierarchie diverser Controller haben mit speziellen Controllern usw., so hast Du Dir das verwährt. Hat-Beziehung ist einfach loser gekoppelt und bei dem, was Du vorhast, daher meiner Erfahrung nach üblicher und sinnvoller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135324</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 24 Oct 2011 19:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 07:02:58 GMT]]></title><description><![CDATA[<p>Vererbung bedeutet entweder:<br />
&quot;Erbendes ist ein...&quot; bei public-Vererbung<br />
oder<br />
&quot;Erbendes ist implementiert als ein&quot; bei protected- oder private-Vererbung.</p>
<p>Beide Fälle scheinen mir hier nicht vorzuliegen.</p>
<p>Stattdessen ist Deine Spektrum-Klasse weitestgehend unabhängig vom Lesen und Schreiben von Daten.</p>
<p>Betrachten wir mal Aggregation- bzw. Komposition:<br />
<strong>Komposition:</strong> Die Komponenten leben genauso lange, wie das Kompositum, also in Deinem Fall: Das Spektrum-Objekt lebt so lange wie der &quot;Controller&quot;, oder besser gesagt: Die ReaderWriter-Klasse. Statt &quot;Hat-ein...&quot; passt hier besser &quot;Besteht aus...&quot;. Das ist es wohl auch nicht.</p>
<p><strong>Aggregation:</strong> Die Komponenten sind in der Lebensdauer unabängig vom Kompositum, aber: Das Kompositum besteht aus den Komponenten. Das könnte was sein. Aber: Solange Du eine Reader-Writer-Klasse hast, sollte die nicht das zu lesende Element enthalten, sondern IMHO lediglich als Referenz, die mit Daten gefüllt wird übergeben bekommen. Denn der ReaderWriter kann unabhängig vom zu Lesenden oder Schreibenden existieren. Ob Du dann in &quot;Spektrum&quot; die Daten mit setter Methoden füllst ist erst mal noch offen.</p>
<p>Interessant bei der folgenden Lösung ist, dass die Interface-Klasse für den ReaderWriter <strong>nichts</strong> von den Innereien der Spektrum Klasse kennen muss. Konkrete Implementierungen von ReaderWriter brauchen nur die öffentliche Schnittstelle von Spektrum. Das lässt Dir im Gegenzug viel Gestaltungsspielraum beim Entwerfen von Spektrum.</p>
<pre><code class="language-cpp">class Spectrum
{
public:
	typedef binType float;

	void resize(unsigned int newSize); // nötig für Lesen
	void setBin(unsigned int index, binType value);
	binType getBin(unsinged int index) const;
private:
	std::vector&lt;binType&gt; bins;
};

// Interface Klasse. Konkrete Implementierungen lesen dann aus Files, vom Netz, etc.
class SpectrumReaderWriter
{
public: 
	void readSpectrum(Spectrum&amp; spectrumToBeRead) = 0;
	void writeSpectrum(const Spectrum&amp; spectrumToBeWritten) = 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2135397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135397</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 25 Oct 2011 07:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 07:33:36 GMT]]></title><description><![CDATA[<blockquote>
<p>Interessant bei der folgenden Lösung ist, dass die Interface-Klasse für den ReaderWriter nichts von den Innereien der Spektrum Klasse kennen muss. Konkrete Implementierungen von ReaderWriter brauchen nur die öffentliche Schnittstelle von Spektrum.</p>
</blockquote>
<p>Ich verstehe den Vorteil so formuliert nicht. Konkrete Implementierungen müssen doch sehr wohl auf die Schnittstelle zugreifen und auch die Implementierung von Spektrum dann zur Verfügung haben. Du machst noch ein Interface dazu, dass OP gar nicht unbedingt gebraucht hatte. Fängt er zeitgleich mit der Implementierung von einem FileReader an, hat er doch genau so viel/wenig Flexibilität bei der Gestaltung von Spectrum?</p>
<p>Und bzgl. der Schnittstellen von Spectrum gibt es sowieso keine Flexibilität, sobald die erste Subklasse deines Interfaces gebastelt ist. Der einzige Vorteil, der mir bzgl. des Interfaces einleuchtet, ist, dass man auf UI-Ebene irgendwem einen fertigen Controller als Interface übergeben kann, sodass das jeweilige UI-Element nicht die Implementierung der konkreten Reader kennen muss. Aber wieso ist das ein Vorteil? Wenn jemand wirklich etwas am Controller ändern möchte, dann muss er das Interface und alle anderen Klassen auch noch ändern. Das einzig Positive ist doch, dass er durch Gestaltung des Interfaces von vornerein schon weiß, dass das fix ist und er bloß ganz stark überlegen sollte, ob er das so haben möchte, oder?</p>
<p>Ansonsten wirkt die Vorgehensweise für mich sehr java-mäßig einfach alles, was in irgendeiner Weise erweiterbar sein könnte, in Interfaces zu stecken. Das bläht dann alles wunderschön auf, schafft oft weitere Dateien, sorgt für zusätzliche Indirektionen, erschwert das Debuggen und hat oft nur den Vorteil einer irgendwo erweiterten Flexibilität, die am Ende dann doch durch die Anforderungen der Software gar nicht abgedeckt wurde. Geht nicht gegen Dich, würde das nur gerne ein wenig ausgeführt wissen, finde die Idee durchaus interessant. <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/2135407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135407</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 25 Oct 2011 07:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 08:10:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22559">@Eisflamme</a>:</p>
<p>Du hast natürlich recht, ein Interface macht nur dann Sinn, wenn man mehrere Verschiedene ReaderWriter-Implementierungen haben will (File, Netz, etc. wie oben erwähnt). Ansonsten eben ohne separate Interface-Klasse direkt einen Reader, wobei die Schnittstelle gleich beleibt.</p>
<p>Da yeodelloyd aber bereits erwähnt hat, dass er eine &quot;Controller&quot;-Hierarchie haben wird, scheint mit eine Interface-Klasse geeignet. Dann können Nutzer von ReaderWriter mit Basis-(oder Interface-)-Klassen Referenzen arbeiten.</p>
<p>Ungeachtet dessen, halte ich meine Überlegungen, keine enge Kopplung zwischen den Klassen (auch nicht per friend) zu haben, für sinnvoll. Mit dem von mir vorgeschlagenen Design, kann die Spektrum-Klasse komplett unabhängig von der SpektrumIO realisiert und getestet werden. Gleiches gilt für die Reader-Writer-Klasse, die nur einen Stub braucht, der die öffentliche Schnittstelle von Spektrum zur Verfügung stellt. Grundsätzlich ginge das auch mit friends und Aggregation, dann wäre aber die Kopplung unnötig eng.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135432</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 25 Oct 2011 08:10:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 09:01:09 GMT]]></title><description><![CDATA[<p>Hey, danke für die Antworten! Von allen genannten finde ich die von ogni am interessantesten. Allerdings verstehe ich noch nicht, wieso die Controller-Klasse dann nichts von den Innereien des Spektrums kennen muss. Die Sache ist bei mir (jetzt gehe ich mal ein wenig mehr ins Detail meiner Spektrums-Klasse), dass nicht nur Bins ausgelesen und geschrieben werden, sondern die Berechnung der Bin-Inhalte auf bestimmten physikalischen Parametern beruht. Um das Objekt also wieder zu 100 % so zu erzeugen, wie es vorher war, müssen Reader und Writer nicht nur auf Bin-Inhalte, sondern auch auf alle Parameter zugreifen können. (Zumal ich auch noch eine Print-Methode möchte, die mir alle Parameter in der Konsole ausgibt.)</p>
<p>Ich suche also jetzt mehr oder weniger aus Faulheit einen eleganten Weg, für alle diese Parameter (so um die 20 Stück...) eine Get-Methode zu schreiben. <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="😉"
    /> Wahrscheinlich werde ich aber wohl nicht drum rum kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135456</guid><dc:creator><![CDATA[yeoldelloyd]]></dc:creator><pubDate>Tue, 25 Oct 2011 09:01:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 09:13:36 GMT]]></title><description><![CDATA[<p>Aber die physikalischen Parameter sind doch von außen vorgegeben (&quot;Versuchsraum&quot;) und nicht Teil (Eigenschaft!) des jeweiligen Spektrum-Objekt, oder? Dann kannst du deine ganzen Parameter in ein eigenes struct auslagern. Zur Berechnung übergibst du dann eine Instanz dieses PhysParms an das Spektrum. Das Speichern von Parm-Spekt-Paaren würde ich dem Benutzer überlassen (oder eben direkt ein Hilfskonstrukt mitliefern).</p>
<p>Wenn du denkst dass das so nicht geht, wäre es nicht schlecht, wenn du ein wenig mehr Details preisgeben könntest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135459</guid><dc:creator><![CDATA[spicker]]></dc:creator><pubDate>Tue, 25 Oct 2011 09:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 10:29:16 GMT]]></title><description><![CDATA[<p>Wie Spicker bereits erwähnt hat, ist die Berechnung des Spektrums keine seiner Eigenschaften, sondern eine Klasse für sich (von der es unterschiedlichste Arten geben kann).</p>
<p>Oder im Trivialfall sind das nur Methoden der Art</p>
<pre><code class="language-cpp">void makePhaseSpectrum(Spectrum&amp; spectrumToBeFilled);
void makeEqualizedSpectrum(Spectrum&amp; spectrumToBeFilled);
</code></pre>
<p>Ein Spectrum &quot;weiss&quot; nicht, bzw. muss nicht wissen, wie es erzeugt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135489</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 25 Oct 2011 10:29:16 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenarchitektonische Frage on Tue, 25 Oct 2011 11:12:01 GMT]]></title><description><![CDATA[<p>Hey, danke! Die Parameter in eine Struct auszulagern, halte ich für eine elegante Maßnahme. Das werde ich wohl so umsetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2135513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2135513</guid><dc:creator><![CDATA[yeoldelloyd]]></dc:creator><pubDate>Tue, 25 Oct 2011 11:12:01 GMT</pubDate></item></channel></rss>