<?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[gute Umsetzung für generischen und erweiterbaren Code]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche meine Klassen so modular, generisch, erweiterbar und weitverwendbar wie möglich zu machen.</p>
<p>Im Moment will ich meinen Stil, wie ich Programmlogik aus dem Hauptteil rausziehe, damit es veränderbar ist, verbessern, C++ typischer schreiben und performanceteschnisch das Optimum raus holen. Dazu würd ich mich über eure Erfahrungen und Tipps freuen.</p>
<p>So, weil sich unter meinem Problem wohl keiner was vorstellen kann hier ein kleines Beispiel (das ist nur erfunden, um das Prinzip zu erklären. Bei meinen Programmen ist es viel komplexer):<br />
Eine Klasse benötigt bestimmte Informationen. Diese werden, je nach Anwendung, verschieden generiert und auch wieder gespeichert (in einer Instanz allerdings immer nur eine Art). Einmal werden sie über das Internet angefragt, ein anderes Mal aus einer XML gelesen oder manchmal direkt generiert.<br />
Kleine Übereinstimmungen haben diese Wege, wie z.B. die Erstellung eines Datums aus einem String wird immer im gleich durchgeführt. Ansonsten benötigen alle Arten Grund verschiedene Implemenatationen.<br />
Erster Ansatz: Die Datums-Erstellung in eine Methode packen und für jede Art des Einlesens/Speicherns eine Methode machen.<br />
Ist irgend wie unübersichtlich, da es sehr viel Code wird. Aber ok, das ist hinnehmbar.<br />
Größer Wermutstropfen ist allerdings, dass wenn irgend wer die Funktionalität gebrauchen könnte aber eine neue Art der Daten Aufbewahrung hat. Dann müsste er neue Methoden anlegen, andere die diese gar nicht brauchen schleppen das dann auch im Code mit.<br />
Wirklich &quot;leicht erweiterbar&quot; ist das dann nicht.</p>
<p>Bin so auf eine andere Art gekommen, wie ich dies lösen kann:<br />
Ich habe mir ein &quot;Interface&quot; (bzw. abstrakte Klasse) gebaut, in der ich die Methode zur Generierung des Datums zur Verfügung stelle, da es fast alle Implementationen brauchen.<br />
Dann werden noch 2 virtuelle Methoden erwartet, einmal getData und setData. Dafür gibt es allerdings noch keine Implementationen.<br />
In meinem Hauptprogramm, welches die Daten braucht, erwarte ich im Konstruktor ein Objekt dieses Interfaces.<br />
Wenn ich die Daten brauche, ruf ich einfach getData von diesem Objekt auf.</p>
<p>Für die verschiedenen bekannten Umsetzungen der Datenverwaltung lege ich konkrete Klassen die das Interfaces implementieren an und erstelle daraus libs. Wenn später noch wer eine neue Umsetzung hat, kann er selber auch von diesem Interface ableiten und eine lib machen.</p>
<p>Somit braucht keiner an der Klasse der Datenverarbeitung rum schrauben, die bleibt ja immer gleich.<br />
Aber trotzdem kann jeder das machen, was er will.</p>
<p>Diesen Ansatz habe ich von Java (da kann man z.B. so verschiedene Sortieralgorithmen mitgeben).<br />
An sich bin ich auch zufrieden aber ob das wirklich C++-Konform ist bezweifel ich doch irgend wie. Deshalb würd ich gern wissen, wie man hier das normal macht und was ihr mir empfehlen würdet.</p>
<p>Da es bei manchen Programmen schon auf Performance ankommt bekam ich vorkurzen den Tipp, dass Templates um einiges stärker wie generische Klassen in Java sind (mit denen ich es imemr verglich) und man damit auch sowas machen kann wie ich will, also dass man damit die Methoden auch bereitstellen kann. Da es dabei dann zur Kompile-Zeit vorhanden ist, kann es aber direkt rein geschrieben werden und wird somit schneller.<br />
Über google habe ich aber leider keine Beschreibung für diese Art wie ich es will gefunden, die mir was brachte. Bzw. bei der ich die das Problem sofort umsetzen konnte.<br />
Habe nur irgend wo gelesen, dass es dann keine libs sein dürfen (müsste ich zwar das wieder umstellen und den Leuten erklären aber das wäre kein Problem). Ist das über Templates gut? Wenn ja, wie setz ich das genau um, dass es von der Funktionalität so ist, wie meine Lösung von oben.</p>
<p>vielen lieben Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286186/gute-umsetzung-für-generischen-und-erweiterbaren-code</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 02:35:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286186.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 May 2011 08:45:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to gute Umsetzung für generischen und erweiterbaren Code on Thu, 05 May 2011 08:45:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche meine Klassen so modular, generisch, erweiterbar und weitverwendbar wie möglich zu machen.</p>
<p>Im Moment will ich meinen Stil, wie ich Programmlogik aus dem Hauptteil rausziehe, damit es veränderbar ist, verbessern, C++ typischer schreiben und performanceteschnisch das Optimum raus holen. Dazu würd ich mich über eure Erfahrungen und Tipps freuen.</p>
<p>So, weil sich unter meinem Problem wohl keiner was vorstellen kann hier ein kleines Beispiel (das ist nur erfunden, um das Prinzip zu erklären. Bei meinen Programmen ist es viel komplexer):<br />
Eine Klasse benötigt bestimmte Informationen. Diese werden, je nach Anwendung, verschieden generiert und auch wieder gespeichert (in einer Instanz allerdings immer nur eine Art). Einmal werden sie über das Internet angefragt, ein anderes Mal aus einer XML gelesen oder manchmal direkt generiert.<br />
Kleine Übereinstimmungen haben diese Wege, wie z.B. die Erstellung eines Datums aus einem String wird immer im gleich durchgeführt. Ansonsten benötigen alle Arten Grund verschiedene Implemenatationen.<br />
Erster Ansatz: Die Datums-Erstellung in eine Methode packen und für jede Art des Einlesens/Speicherns eine Methode machen.<br />
Ist irgend wie unübersichtlich, da es sehr viel Code wird. Aber ok, das ist hinnehmbar.<br />
Größer Wermutstropfen ist allerdings, dass wenn irgend wer die Funktionalität gebrauchen könnte aber eine neue Art der Daten Aufbewahrung hat. Dann müsste er neue Methoden anlegen, andere die diese gar nicht brauchen schleppen das dann auch im Code mit.<br />
Wirklich &quot;leicht erweiterbar&quot; ist das dann nicht.</p>
<p>Bin so auf eine andere Art gekommen, wie ich dies lösen kann:<br />
Ich habe mir ein &quot;Interface&quot; (bzw. abstrakte Klasse) gebaut, in der ich die Methode zur Generierung des Datums zur Verfügung stelle, da es fast alle Implementationen brauchen.<br />
Dann werden noch 2 virtuelle Methoden erwartet, einmal getData und setData. Dafür gibt es allerdings noch keine Implementationen.<br />
In meinem Hauptprogramm, welches die Daten braucht, erwarte ich im Konstruktor ein Objekt dieses Interfaces.<br />
Wenn ich die Daten brauche, ruf ich einfach getData von diesem Objekt auf.</p>
<p>Für die verschiedenen bekannten Umsetzungen der Datenverwaltung lege ich konkrete Klassen die das Interfaces implementieren an und erstelle daraus libs. Wenn später noch wer eine neue Umsetzung hat, kann er selber auch von diesem Interface ableiten und eine lib machen.</p>
<p>Somit braucht keiner an der Klasse der Datenverarbeitung rum schrauben, die bleibt ja immer gleich.<br />
Aber trotzdem kann jeder das machen, was er will.</p>
<p>Diesen Ansatz habe ich von Java (da kann man z.B. so verschiedene Sortieralgorithmen mitgeben).<br />
An sich bin ich auch zufrieden aber ob das wirklich C++-Konform ist bezweifel ich doch irgend wie. Deshalb würd ich gern wissen, wie man hier das normal macht und was ihr mir empfehlen würdet.</p>
<p>Da es bei manchen Programmen schon auf Performance ankommt bekam ich vorkurzen den Tipp, dass Templates um einiges stärker wie generische Klassen in Java sind (mit denen ich es imemr verglich) und man damit auch sowas machen kann wie ich will, also dass man damit die Methoden auch bereitstellen kann. Da es dabei dann zur Kompile-Zeit vorhanden ist, kann es aber direkt rein geschrieben werden und wird somit schneller.<br />
Über google habe ich aber leider keine Beschreibung für diese Art wie ich es will gefunden, die mir was brachte. Bzw. bei der ich die das Problem sofort umsetzen konnte.<br />
Habe nur irgend wo gelesen, dass es dann keine libs sein dürfen (müsste ich zwar das wieder umstellen und den Leuten erklären aber das wäre kein Problem). Ist das über Templates gut? Wenn ja, wie setz ich das genau um, dass es von der Funktionalität so ist, wie meine Lösung von oben.</p>
<p>vielen lieben Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058836</guid><dc:creator><![CDATA[Xenya]]></dc:creator><pubDate>Thu, 05 May 2011 08:45:05 GMT</pubDate></item><item><title><![CDATA[Reply to gute Umsetzung für generischen und erweiterbaren Code on Thu, 05 May 2011 09:02:30 GMT]]></title><description><![CDATA[<p>Xenya schrieb:</p>
<blockquote>
<p>Diesen Ansatz habe ich von Java (da kann man z.B. so verschiedene Sortieralgorithmen mitgeben).<br />
An sich bin ich auch zufrieden aber ob das wirklich C++-Konform ist bezweifel ich doch irgend wie. Deshalb würd ich gern wissen, wie man hier das normal macht und was ihr mir empfehlen würdet.</p>
</blockquote>
<p>Das ist völlig okay und gutes Design in C++. Nennt sich (Runtime-)Polymorphismus und ist einer der Grundpfeiler des objektorientierten Designs. Warum sollte das in C++ nicht richtig sein? dafür gibts doch virtuelle Funktionen!</p>
<p>Eine andere Möglichkeit des Polymorphismus ist der Compiletime Polymorphismus in C++, den es in Java so nicht gibt. Dazu werden Templates benutzt. Deine Basisklasse wäre dafür das eigentliche Klassentemplate. Das Template-Argument wäre dann eine Policy-Klasse, die bestimmt, wie die Daten gelesen/geschrieben werden. Google im netz mal nach Policy-based design <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>
<blockquote>
<p>Da es bei manchen Programmen schon auf Performance ankommt bekam ich vorkurzen den Tipp, dass Templates um einiges stärker wie generische Klassen in Java sind (mit denen ich es imemr verglich) und man damit auch sowas machen kann wie ich will, also dass man damit die Methoden auch bereitstellen kann. Da es dabei dann zur Kompile-Zeit vorhanden ist, kann es aber direkt rein geschrieben werden und wird somit schneller.</p>
</blockquote>
<p>richtig. Zur Laufzeit wirds schneller, kann aber zur Compilezeit deutlich länger dauern. Das läuft dann entweder so wie ich oben beschrieben hab, oder über Template-Spezialisierungen.</p>
<blockquote>
<p>Habe nur irgend wo gelesen, dass es dann keine libs sein dürfen</p>
</blockquote>
<p>Dass was keine Libs sein dürfen? Das Problem ist folgendes: Die Definitionen Templates müssen zur Compilezeit vorliegen, können also nicht in libs versteckt werden. Ansonten spricht nichts gegen libs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058842</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 05 May 2011 09:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to gute Umsetzung für generischen und erweiterbaren Code on Thu, 05 May 2011 09:18:46 GMT]]></title><description><![CDATA[<p>Tipp:<br />
Nicht übertreiben. Code muss auch lesbar bleiben. Was nützt das genialste, flexibelste Design, wenn da keiner durchsteigt und all die Stellschrauben am Ende gar nicht genutzt werden?</p>
<p>Übung macht den Meister. Konkretere aber noch allgemeingültige Ratschläge fallen mir spontan nicht ein. Ich habe als Java-&gt;C++ Umsteiger zunächst im Streben nach Flexibilität relativ viele &quot;Interfaces&quot; (abstrakte Basisklassen) gebaut und dann gemerkt, dass da ein für C++ Verhältnisse recht unbrauchbares Design herauskam. Das wurde aber mit der Zeit besser.</p>
<p>Mehr auf Templates statt virtuelle Funktionen zu setzen, ist eigentlich keine schlechte Idee. Dann kann man immer noch &quot;polymorphe Wrapper&quot; bauen und da rein stecken, wenn man Laufzeitpolymorphie braucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2058846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2058846</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 05 May 2011 09:18:46 GMT</pubDate></item></channel></rss>