<?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[About a code. Code Style Frage.]]></title><description><![CDATA[<p>Ich benötige mal ein paar Argumente für oder gegen exzessiven const Gebrauch bei primitiven Datentypen.</p>
<p>Folgendes habe ich gefunden:</p>
<pre><code>const bool Test(const bool&amp; b = true, const int&amp; t = 2)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/330934/about-a-code-code-style-frage</link><generator>RSS for Node</generator><lastBuildDate>Thu, 02 Jul 2026 15:26:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330934.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Feb 2015 12:06:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 12:06:05 GMT]]></title><description><![CDATA[<p>Ich benötige mal ein paar Argumente für oder gegen exzessiven const Gebrauch bei primitiven Datentypen.</p>
<p>Folgendes habe ich gefunden:</p>
<pre><code>const bool Test(const bool&amp; b = true, const int&amp; t = 2)
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2440942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440942</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Tue, 03 Feb 2015 12:06:05 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 12:51:34 GMT]]></title><description><![CDATA[<p>Ich gehe mal davon aus, du meinst die Übergabe als &quot;const Ref&quot;, wie in dem Beispiel.</p>
<p>Bei primitiven Datentypen ist das völlig übertrieben. Erzeugt sogar mehr Overhead, als eine &quot;normale&quot; Kopie.</p>
<p>Primitive Datentypen in der Parameterliste als const zu deklarieren - das kann man machen, wenn man den Wert mehrfach verwendet und eine versehentliche Änderung verhindern will. Ich persönlich hatte noch nie eine solche Situation.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440945</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 03 Feb 2015 12:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 12:51:55 GMT]]></title><description><![CDATA[<p>Die consts in den Parametern sind nicht das Problem, da sollte man sich eher fragen wofuer man da Referenzen braucht. (Und danach dann ob man das const will, das ist debatable IMO, aber uebliche Meinung ist dass man Parameter nicht const macht weil es dem Caller keiner Information gibt.) Das const beim Rueckgabetypen ist einfach nur sinnlos und redundant, man bekommt ja schon ein rvalue wenn man die Funktion aufruft, da hat das const keinen Effekt mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440946</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 03 Feb 2015 12:51:55 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 12:57:20 GMT]]></title><description><![CDATA[<p>Ausserdem sind Default-Argumente sehr oft ein Zeichen für Design-Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440947</guid><dc:creator><![CDATA[killerargument]]></dc:creator><pubDate>Tue, 03 Feb 2015 12:57:20 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 15:08:42 GMT]]></title><description><![CDATA[<p>killerargument schrieb:</p>
<blockquote>
<p>Ausserdem sind Default-Argumente sehr oft ein Zeichen für Design-Fehler.</p>
</blockquote>
<p>Wenn du meinst... Nach meiner Erfahrung sind sie kein Designfehler, sofern die Parameter sinnvolle Vorgabewerte haben. Wieso sollte man 2 Funktionen für exakt die gleiche Funktionalität schreiben, wenn diese sich nur um ein Detail unterscheiden: Und zwar ob man mit einem festen Wert oder einem vorgegebenen arbeitet.</p>
<p>Es hat durchaus seinen Grund warum viele Sprachen die Anfang die Defaultparameter nicht unterstützt hatten, diese nachträglich hinzugefügt haben.</p>
<p>Nehmen wir mal ein ganz banales Beispiel: Fast an allen Stellen sollen Ausgaben auf 2 Nachkommastellen gerundet werden, an ganz wenigen Stellen benötigt man aber eine davon abweichende Anzahl. Warum kein Defaultparameter für die Anzahl der Nachkommastellen (Standard: 2)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440966</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 03 Feb 2015 15:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 15:22:20 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Nehmen wir mal ein ganz banales Beispiel: Fast an allen Stellen sollen Ausgaben auf 2 Nachkommastellen gerundet werden, an ganz wenigen Stellen benötigt man aber eine davon abweichende Anzahl. Warum kein Defaultparameter für die Anzahl der Nachkommastellen (Standard: 2)?</p>
</blockquote>
<p>Das ist so ein typischer Design-Fehler.</p>
<p>Da gehört entweder eine Konstante definiert, die an &quot;fast allen Stellen&quot; übergeben wird. Die Konstante ist dann vernünftig benannt und kommentiert, sodass man die Intention erkennen kann.</p>
<p>Oder man erstellt zwei Funktionen mit unterschiedlichen Namen. Eine von denen hat dann das &quot;Standardverhalten&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440968</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 15:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 15:31:43 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Nehmen wir mal ein ganz banales Beispiel: Fast an allen Stellen sollen Ausgaben auf 2 Nachkommastellen gerundet werden, an ganz wenigen Stellen benötigt man aber eine davon abweichende Anzahl. Warum kein Defaultparameter für die Anzahl der Nachkommastellen (Standard: 2)?</p>
</blockquote>
<p>Das ist so ein typischer Design-Fehler.</p>
</blockquote>
<p>Ich habe gelernt das Codeduplikate und unnötiger Code Designfehler sind.</p>
<p>Warum soll ich 2 Funktionen pflegen, selbst wenn eine davon die andere Aufruft? Warum sollte ich die Funktionen unterschiedlich nennen, wenn sie grundsätzlich die gleiche Aufgabe hat (nur das in einem Fall eine weitere Angabe nötig ist)?</p>
<p>Es ist ja nicht so das man hier eine Funktion mit einer großen Parameteranzahl hätte (was wiederum schlechtes Design ist). Wer definiert eigentlich das es sich hier um einen Design-Fehler handelt.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Da gehört entweder eine Konstante definiert, die an &quot;fast allen Stellen&quot; übergeben wird. Die Konstante ist dann vernünftig benannt und kommentiert, sodass man die Intention erkennen kann.</p>
</blockquote>
<p>Ich halte benannte Konstanten zwar grundsätzlich für etwas gutes, in dem Fall wäre die unnötige Codemenge aber weit höher. Ebenso wie es nicht intuitiv wäre die Funktion die sich nur um diesen einen Parameter unterscheidet anders zu nennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440970</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 03 Feb 2015 15:31:43 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 16:42:58 GMT]]></title><description><![CDATA[<p>Offensichtlich gibt es keine Intention die Kopie der Parameter zu verhindern. Der einzige Grund für eine Referenz könnte sein dass man e.g. die Adressen der Parameter speichert, oder eine Referenz darauf.</p>
<blockquote>
<p>Warum soll ich 2 Funktionen pflegen, selbst wenn eine davon die andere Aufruft?</p>
</blockquote>
<p>Du pflegst grundsätzlich nur eine. Die andere kann sogar perfect forwarding machen und nur ein Argument hinten dranhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440979</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 03 Feb 2015 16:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 16:56:45 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Ich habe gelernt das Codeduplikate und unnötiger Code Designfehler sind.</p>
<p>Warum soll ich 2 Funktionen pflegen, selbst wenn eine davon die andere Aufruft? Warum sollte ich die Funktionen unterschiedlich nennen, wenn sie grundsätzlich die gleiche Aufgabe hat (nur das in einem Fall eine weitere Angabe nötig ist)?</p>
</blockquote>
<p>Es gibt viele dos und donts in der Entwicklung. Dummerweise verwechseln manche Zeitgenossen ¨should not¨ mit ¨must not¨. Zweites Problem, manche donts schliessen sich gegenseitig aus. Hier ein schönes Beispiel default parameter und code duplikate.</p>
<p>Ich meine, wenn beim Aufruf einer Funktion, der übergebene Wert für das Verständnis unerheblich ist, darf er durch einen Defaultparameter ersetzt werden. Sonst nicht.</p>
<p>Mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440980</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 03 Feb 2015 16:56:45 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 17:42:46 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Ich meine, wenn beim Aufruf einer Funktion, der übergebene Wert für das Verständnis unerheblich ist, darf er durch einen Defaultparameter ersetzt werden. Sonst nicht.</p>
</blockquote>
<p>Wenn der Wert unerheblich ist, warum gibt es dann den Parameter? Hmm, ist wohl doch nicht so unerheblich.</p>
<p>Ich verstehe schon, warum ihr Default-Werte da in Ordnung findet. Ich finde aber, dass so eine enge Kopplung zwischen Deklaration und Aufruf fast immer ungünstig ist. Ausnahme sind sehr allgemeine Funktions-Templates, wo der Standardwert <code>std::less&lt;T&gt;()</code> oder so etwas ist. Das geht, weil <em>kleiner als</em> gängige Konvention zum Vergleichen von Werten ist. Für eine Anzahl von angezeigten Ziffern gibt es aber keinen plausiblen Standardwert.</p>
<p>Für mich ist das ungefähr so als würde C++ das so spezifizieren:</p>
<pre><code class="language-cpp">float fabs(float = -3.5f);
</code></pre>
<p>Wenn man in seinem Programm ganz oft den Absolutwert von <code>-3.5</code> braucht, ist das super. Man spart damit vier Zeichen pro Aufruf. Für alle anderen ist das unnötig verwirrend, weil sie erstens zunächst begreifen müssen, dass die Funktion eigentlich mehr Parameter hat als Werte übergeben werden. Zweitens müssen sie dann die Deklaration aufsuchen, um den Wert zu erfahren. Drittens wird jeder vernünftige Entwickler den Wert bei einem neuen Aufruf explizit angeben, denn wer weiß, wann irgendjemand den Standardwert mal heimlich ändert. Ist ja bloß ein Standardwert, was kann da schon passieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440986</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 17:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 17:50:30 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Ausnahme sind sehr allgemeine Funktions-Templates, wo der Standardwert <code>std::less&lt;T&gt;()</code> oder so etwas ist. Das geht, weil <em>kleiner als</em> gängige Konvention zum Vergleichen von Werten ist.</p>
<p>[...]</p>
<p>Drittens wird jeder vernünftige Entwickler den Wert bei einem neuen Aufruf explizit angeben, denn wer weiß, wann irgendjemand den Standardwert mal heimlich ändert. Ist ja bloß ein Standardwert, was kann da schon passieren?</p>
</blockquote>
<p>Das widerspricht sich etwas...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440989</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 03 Feb 2015 17:50:30 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 18:01:29 GMT]]></title><description><![CDATA[<p>Ich verstehe den Sinn nicht: Wo ist der Unterschied zwischen einer Funktion mit Defaultargument und zwei Überladungen?<br />
Und wenn man sie unterschiedlich nennt: Wieso? Spezifiziert man das Argument nicht, macht man schon klar, dass man das Defaultverhalten <em>wünscht</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440992</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 03 Feb 2015 18:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 18:42:46 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Ich verstehe den Sinn nicht: Wo ist der Unterschied zwischen einer Funktion mit Defaultargument und zwei Überladungen?<br />
Und wenn man sie unterschiedlich nennt: Wieso? Spezifiziert man das Argument nicht, macht man schon klar, dass man das Defaultverhalten <em>wünscht</em>.</p>
</blockquote>
<p>Es sollte kein &quot;Default-Verhalten&quot; geben. Wenn das Verhalten beim Aufruf nicht immer ersichtlich ist, sollte man alle Argumente explizit angeben.</p>
<p>Dafür gibt es mehrere Gründe:</p>
<p>- Der Aufruf wird kopiert und woanders eingefügt. Vielleicht ergibt der Standardwert in dem neuen Kontext gar keinen Sinn. Zumindest muss man darüber nachdenken, ob der Wert da Sinn ergibt. Kann ich am Commit erkennen, ob sich da jemand Gedanken gemacht hat? Nö, kann ich nicht.</p>
<p>- Es kommen immer mehr Parameter dazu (sehr gerne <code>bool</code> s), weil man die ja meistens beim Aufruf nicht sehen kann. Irgendwann fangen Kombinationen von nicht-Default-Werten an, nicht mehr zu funktionieren.</p>
<p>- In Unit-Test (falls man überhaupt welche hat), werden die Parameter mit Standardwerten natürlich grundsätzlich vergessen.</p>
<p>- Ich kann den Standardwert nie wieder ändern, falls fremder Code meine Funktion aufruft. Das ist nicht solange nicht schlimm, bis mal jemand versehentlich den Wert ändert.</p>
<p>- Default-Parameter entstehen oft nur für üble, &quot;temporäre&quot; Hacks und begünstigen diese, weil nicht über die existierenden Aufruf nachgedacht wird.</p>
<p>- Man kann eigentlich keinen Default-Parameter hinzufügen, ohne sämtliche Aufrufstellen zu überprüfen. Der Wert muss schließlich überall Sinn ergeben. Das ist umständlicher und fehleranfälliger als ein neuer Parameter ohne Standardwert. In der Realität &quot;hofft&quot; man einfach, dass nichts kaputtgeht und überprüft die Aufrufstellen nicht.</p>
<p>- Wenn der erwartete Wertebereich der Funktion sich ändert, sodass der Standardwert nicht mehr darin liegen würde, müssen auch wieder sämtliche Aufrufstellen überprüft werden.</p>
<p>- Standardwerte dienen nur der Faulheit. Gebt doch zu, dass ihr einfach nur keine Lust habt, jedes Mal über sinnvolle Werte für zweifelhafte Parameter nachzudenken.</p>
<p>- Derselbe Werte kann an verschiedenen Stellen <em>aus unterschiedlichen Gründen</em> gewählt worden sein. Ein Standardwert fördert das Weglassen wertvoller Dokumentation der Gründe.</p>
<p>- Es ist viel zu <em>clever</em> einfach den am häufigsten gewählten Wert zum Standard zu erklären. Das ist so herrlich willkürlich und scheinbar produktiv.</p>
<p>Das ist alles Kleinvieh, aber das macht bekanntlich auch Mist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2440999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2440999</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 18:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 19:40:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@TyRoXx</a><br />
Erklär mir bitte was hier böse ist:</p>
<pre><code class="language-cpp">void LogEvent(std::string const&amp; event, boost::optional&lt;std::string&gt; const&amp; data = boost::none);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2441016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441016</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Feb 2015 19:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 19:50:39 GMT]]></title><description><![CDATA[<p>Den Grund hatte ich tatsächlich vergessen: Man kann vergessen den zweiten Parameter zu übergeben. Ein explizites <code>boost::none</code> sagt dem Compiler und meinen Kollegen, dass ich da wirklich nichts übergeben wollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441020</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 19:50:39 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 19:50:55 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>...</p>
<p>Das ist alles Kleinvieh, aber das macht bekanntlich auch Mist.</p>
</blockquote>
<p>Offensichtlich scheint C++ von einem Haufen inkompetenter Deppen entworfen worden zu sein. Da hier reichlich von Defaultwerten gebrauch gemacht wird. Beispiel fstream::open<br />
Warum ist der Default text und nicht binary?</p>
<p>Wie kann man nur so eine Sprache nutzen?</p>
<p>Mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441021</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 03 Feb 2015 19:50:55 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 20:01:23 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Offensichtlich scheint C++ von einem Haufen inkompetenter Deppen entworfen worden zu sein. Da hier reichlich von Defaultwerten gebrauch gemacht wird. Beispiel fstream::open<br />
Warum ist der Default text und nicht binary?</p>
</blockquote>
<p>Du nennst wirklich die C++-IOStreams ein Beispiel guten Designs?</p>
<p>Der Standardwert <code>text</code> dürfte weltwelt zu tausenden Bugs in echten Produkten geführt haben und weiterhin führen, weil das <code>binary</code> -Flag vergessen wurde. Ich habe den Fehler bestimmt schon zehn mal gemacht (und hoffentlich immer bemerkt). Hier im Forum kam das Problem auch relativ oft zur Sprache.</p>
<p>Hier treffen sogar zwei Designfehler zusammen:<br />
- Ein Standardwert, wo er überhaupt keinen Sinn ergibt.<br />
- Eine Methode, die zwei völlig unterschiedliche Aufgaben hat, abhängig von einem Standardwertparameter einer ganz anderen Methode.</p>
<p>Die Bibliothek wurde sicher nicht von Idioten entworfen. Es war aber eine andere Zeit mit anderen Anforderungen. Weder die Rolle, noch die Konventionen von C++ waren damals so gefestigt wie heute.</p>
<p>(Rust hat das Feature übrigens nicht, falls man Rust noch erwähnen darf.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441025</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 20:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 20:09:14 GMT]]></title><description><![CDATA[<p>Ich verstehe deine Argumente.<br />
Aber es gibt einen Typen von default-Werten, den du vergessen hattest:<br />
Zusätzliche, optionale Informationen. Bspw.</p>
<pre><code>int stoi( const std::string&amp; str, std::size_t* pos = 0, int base = 10 );
</code></pre>
<p>(Zugegeben, dass int base gehört nicht zu dem Typ, aber ist auch imo total akzeptabel).<br />
Manchmal braucht man den Index des ersten, nicht konvertierten, Charakters. In den meisten Fällen nicht. Braucht man ihn also, kann man explizit einen Outputparameter übergeben.<br />
Die tatsächliche Relisierung über Pointer finde ich zugegeben etwas ungeschickt, ein anderer Overload, der einen dummy-Int per Referenz übergibt wäre passender und man spart sich den Branch fürs Prüfen, aber darum gehts nicht.<br />
Eine anderes Beispiel ist von einer Bibliothek, die ich geschrieben habe:<br />
Es geht um das Verwalten von Strings. Intern werden die gehasht um schnelle Vergleiche zu ermöglichen und in eine Datenbank eingetragen. Bei der automatischen Generierung von Ids will man evtl., dass sie einzigartig sind. Oder man will verhindern, dass bei einer Kollision der Hashs der Kollisionshandler aufgerufen wird.<br />
Dann kann man als zusätzlichen Outputparameter im Konstruktor ein enum übergeben, was dann entsprechend gefüllt wird (old_string, new_string, collision).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441030</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 03 Feb 2015 20:09:14 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 20:25:57 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<pre><code>int stoi( const std::string&amp; str, std::size_t* pos = 0, int base = 10 );
</code></pre>
<p>(Zugegeben, dass int base gehört nicht zu dem Typ, aber ist auch imo total akzeptabel).<br />
Manchmal braucht man den Index des ersten, nicht konvertierten, Charakters. In den meisten Fällen nicht. Braucht man ihn also, kann man explizit einen Outputparameter übergeben.</p>
</blockquote>
<p>Ich dachte, dass Ausgabeparameter inzwischen endlich gestorben wären.</p>
<p>Die Signatur ist IMO völlig daneben. Da ist so ziemlich alles falsch. Warum so ein spezifischer Typ wie <code>std::string</code> ? Warum keine Range oder Iteratoren? Warum ein <code>size_t</code> und nicht der korrekte Typ, nämlich in diesem Fall <code>std::string::const_iterator</code> ? Was passiert eigentlich, wenn ich eine negative Basis übergebe?</p>
<pre><code class="language-cpp">template &lt;class InputIterator&gt;
std::tuple&lt;int, InputIterator&gt; parse_int(InputIterator begin, InputIterator end, unsigned base = 10);
</code></pre>
<p>Es ist in der Standardbibliothek üblich, in solchen Fällen mehrere Werte als Tupel zurückzugeben (bisher nur <code>pair</code> ). Was man nicht braucht, kann man ignorieren.</p>
<p>Als Standardwert ist die 10 hier schon in Ordnung, weil das Konvention unter fast allen Menschen ist und sich zu Lebzeiten von C++ nicht mehr ändern wird.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Eine anderes Beispiel ist von einer Bibliothek, die ich geschrieben habe:<br />
Es geht um das Verwalten von Strings. Intern werden die gehasht um schnelle Vergleiche zu ermöglichen und in eine Datenbank eingetragen. Bei der automatischen Generierung von Ids will man evtl., dass sie einzigartig sind. Oder man will verhindern, dass bei einer Kollision der Hashs der Kollisionshandler aufgerufen wird.<br />
Dann kann man als zusätzlichen Outputparameter im Konstruktor ein enum übergeben, was dann entsprechend gefüllt wird (old_string, new_string, collision).</p>
</blockquote>
<p>Verstehe ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441031</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 20:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 20:39:24 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Offensichtlich scheint C++ von einem Haufen inkompetenter Deppen entworfen worden zu sein. Da hier reichlich von Defaultwerten gebrauch gemacht wird. Beispiel fstream::open<br />
Warum ist der Default text und nicht binary?</p>
</blockquote>
<p>Du nennst wirklich die C++-IOStreams ein Beispiel guten Designs?</p>
<p>Der Standardwert <code>text</code> dürfte weltwelt zu tausenden Bugs in echten Produkten geführt haben und weiterhin führen, weil das <code>binary</code> -Flag vergessen wurde. Ich habe den Fehler bestimmt schon zehn mal gemacht (und hoffentlich immer bemerkt). Hier im Forum kam das Problem auch relativ oft zur Sprache.</p>
<p>Hier treffen sogar zwei Designfehler zusammen:<br />
- Ein Standardwert, wo er überhaupt keinen Sinn ergibt.<br />
- Eine Methode, die zwei völlig unterschiedliche Aufgaben hat, abhängig von einem Standardwertparameter einer ganz anderen Methode.</p>
<p>Die Bibliothek wurde sicher nicht von Idioten entworfen. Es war aber eine andere Zeit mit anderen Anforderungen. Weder die Rolle, noch die Konventionen von C++ waren damals so gefestigt wie heute.</p>
<p>(Rust hat das Feature übrigens nicht, falls man Rust noch erwähnen darf.)</p>
</blockquote>
<p>Toll ist es nicht. Es wurde halt das Verhalten der c stdio nachgebildet.</p>
<p>Im übrigen, Deine Argumente gegen defaults sind ja nicht verkehrt und mein Beispel ist in der Tat ungünstig gewählt, da es unnötig ist, c stdio nach zu bilden. Trotzdem kann es auch gute Gründe dafür (den defaults) geben und man sollte sich dem nicht grundsätzlich verschließen.</p>
<p>Als der erste c++ standard raus kam, gab es schon min. 8 Jahre brauchbare compiler. Ich weiß noch wie 1990 plötzlich alle meinten c++ lernen zu müssen (ich auch). Es gab also genug Erfahrung.</p>
<p>Mfg martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441035</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 03 Feb 2015 20:39:24 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 20:50:58 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Trotzdem kann es auch gute Gründe dafür (den defaults) geben und man sollte sich dem nicht grundsätzlich verschließen.</p>
</blockquote>
<p>Ich verschließe mich doch gar nicht. Einen guten Grund erkenne ich sehr wohl an: Wenn der Standardwert sogar für projektfremde Programmierer so offensichtlich ist, dass man nicht nachschauen muss. Das ist bei <code>std::sort</code> (fast) der Fall und eine Standardzahlenbasis von zehn ist auch für jeden nachvollziehbar.</p>
<p>In beiden Fällen könnte man sogar noch darüber streiten, ob der Standardwert jeweils sinnvoll ist. Vergleicht <code>std::sort</code> standardmäßig mit <code>std::less</code> oder mit <code>operator&lt;</code> ? Wer weiß es ohne nachzuschlagen?<br />
Und ist Basis zehn im EDV-Umfeld wirklich fast immer richtig? Man schreibt Zahlen sehr oft hexadezimal auf, also warum ist der Wert nicht standardmäßig 16?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441038</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 20:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 21:06:18 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Trotzdem kann es auch gute Gründe dafür (den defaults) geben und man sollte sich dem nicht grundsätzlich verschließen.</p>
</blockquote>
<p>Ich verschließe mich doch gar nicht. Einen guten Grund erkenne ich sehr wohl an: Wenn der Standardwert sogar für projektfremde Programmierer so offensichtlich ist, dass man nicht nachschauen muss. Das ist bei <code>std::sort</code> (fast) der Fall und eine Standardzahlenbasis von zehn ist auch für jeden nachvollziehbar.</p>
<p>In beiden Fällen könnte man sogar noch darüber streiten, ob der Standardwert jeweils sinnvoll ist. Vergleicht <code>std::sort</code> standardmäßig mit <code>std::less</code> oder mit <code>operator&lt;</code> ? Wer weiß es ohne nachzuschlagen?<br />
Und ist Basis zehn im EDV-Umfeld wirklich fast immer richtig? Man schreibt Zahlen sehr oft hexadezimal auf, also warum ist der Wert nicht standardmäßig 16?</p>
</blockquote>
<p>Dann sind wir uns ja einig, warum also das lange gerede?</p>
<p>Viele Programme werden für IT-fremde Menschen geschrieben. Viele Konvertierungen finden für diese Menschen statt. Die würden mir den Kopf abreisen, wenn ich denen hexzahlen vorsetzen würde.</p>
<p>Obwohl: Eine 66jährige, wäre vielleicht froh, wenn ich ihr bescheingen würde, sie sei 42.</p>
<p>Mfg martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441040</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Tue, 03 Feb 2015 21:06:18 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 22:03:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22298">@TyRoXx</a><br />
Es ist nicht immer alles was &quot;more verbose&quot; ist auch automatisch &quot;more good&quot;.</p>
<p>Um zu entscheiden was besser ist - verbose oder concise - kommt es mMn. sehr darauf an wie oft man ein bestimmtes Konstrukt in einem Programm findet.<br />
Wenn man es 3x in einem Programm findet, dann definitiv verbose.<br />
Wenn man es 3000x findet, dann definitiv concise. Dann muss sich &quot;der neue&quot; halt eine Sache mehr merken bevor er richtig produktiv mittun kann, dafür müssen &quot;die alten&quot; nicht an 3000 Stellen den &quot;noise&quot; mitlesen den sie eh schon kennen.</p>
<p>Wobei ich mich selbst grundsätzlich eher auf der Seite der &quot;more verbose&quot; Befürworter sehe, aber was du hier predigst geht mir irgendwie zu weit.</p>
<p>Deine Argumentation, also immer verbose, es sei denn jeder Affe weiss sofort was gemeint ist, muss man nur mehr ein Stückchen weiter treiben, und dann darf man schon überhaupt keine Funktionen mehr verwenden. Die sind böse, die verstecken wertvolle Informationen hintern einem wenigsagenden Namen. Pfui. Weg weg weg.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Den Grund hatte ich tatsächlich vergessen: Man kann vergessen den zweiten Parameter zu übergeben. Ein explizites <code>boost::none</code> sagt dem Compiler und meinen Kollegen, dass ich da wirklich nichts übergeben wollte.</p>
</blockquote>
<p>Das ist mMn. kein gutes Argument. Man kann auch mit dem expliziten boost::none vergessen etwas anzugeben. Wenn du 100x sinnfrei boost::none getippt hast, weil deine Events so gut wie nie Daten haben, dann tippst du beim 101-ten Event, der dann doch Daten gehapt hätte, auch boost::none. Bzw. copy-pastest es von einer der anderen 100 Stellen.</p>
<p>Wenn ich aus irgend einem Grund hier keinen Default-Parameter verwenden dürfte, dann würde ich eher noch zwei Funktionen machen, z.B. <code>LogSimpleEvent(string)</code> und <code>LogDataEvent(string, string)</code> .</p>
<p>BTW: Was machst du bei Funktionen die z.B. 10+ Parameter nehmen? Guter Stil ist da ja statt dessen ne <code>struct</code> zu übergeben.<br />
Bei der kannst du dann aber erst nicht erzwingen dass alle Member initialisiert werden - kann man genau so leicht vergessen. Die einzige (mMn. überhaupt nicht gute) Alternative (die mir gerade einfällt), wäre, im Default-Ctor der struct lauter Blödsinnswerte einzutragen und zu beten dass es beim Testen auffällt wenn ein Wert wo nicht explizit gesetzt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441043</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Feb 2015 22:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 21:14:22 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Für mich ist das ungefähr so als würde C++ das so spezifizieren:</p>
<pre><code class="language-cpp">float fabs(float = -3.5f);
</code></pre>
</blockquote>
<p>Nur das dies ein absolut unsinniges Beispiel ist. Wenn man wie ich oben im Beispiel gennannt den Fall hat das man beim Runden im überwiegenden Fall 2 Nachkommastellen braucht, ist dies keine willkürliche Zahl.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Drittens wird jeder vernünftige Entwickler...</p>
</blockquote>
<p>Wie schön hier manche mit Absoluta arbeiten. Merkwürdig nur das ich solchen Entwicklern in meiner gesamten Laufbahn noch nicht in der Praxis begegnet bin. Die Wahrheit liegt wohl wesentlich mehr in einem <em>sinnvollen</em> Mittelweg. Dir ist hoffentlich auch das Paretoprinzip bekannt, das sich auf nahezu alle Bereiche anwenden lässt. In diesem Fall: Wenn in ~80% der Fälle ein Standardwert wirklich Sinn ergibt, ist die Argumentation mit der expliziten Angabe für mich schlicht Unsinn.</p>
<p>Wenn ich eine Funktion habe die z.B. Werte eines Vectors in eine CSV-getrennte Stringliste umwandelt, und im Programm das Trennzeichen nun einmal üblicherweise &quot;,&quot; ist, würde ich eine seperate Funktion für die Sonderfälle, oder eine explizite Angabe in jeden Aufruf ebenso als Unsinn deklarieren.</p>
<p>Und es gibt sogar Sonderfälle wo das Ändern des Standardwertes auch einen Sinn ergeben kann (das ist aber wirklich eine Ausnahme).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441044</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 03 Feb 2015 21:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 22:40:33 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Das ist mMn. kein gutes Argument. Man kann auch mit dem expliziten boost::none vergessen etwas anzugeben. Wenn du 100x sinnfrei boost::none getippt hast, weil deine Events so gut wie nie Daten haben, dann tippst du beim 101-ten Event, der dann doch Daten gehapt hätte, auch boost::none. Bzw. copy-pastest es von einer der anderen 100 Stellen.</p>
</blockquote>
<p>Du argumentierst jetzt aber mit einem Fehler, der bei beiden Varianten passieren kann. Der Standardwert ist eine davon unabhängige, weitere Fehlerquelle.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn ich aus irgend einem Grund hier keinen Default-Parameter verwenden dürfte, dann würde ich eher noch zwei Funktionen machen, z.B. <code>LogSimpleEvent(string)</code> und <code>LogDataEvent(string, string)</code> .</p>
</blockquote>
<p>Das ist noch besser als mit <code>optional</code> zu arbeiten. Mit dem <code>optional&lt;string&gt; const&amp;</code> müsste jeder lvalue- <code>string</code> kopiert werden. <code>optional</code> ist hier also die falsche Wahl, unabhängig von Standardparameterwerten.<br />
Explizit unterschiedlich benannte Funktionen halte ich im Zweifel für die bessere Wahl, weil das die Intention deutlicher macht. Ich sehe, dass die zwei Log-Funktionen wohl unterschiedliche Dinge tun. Das muss ich dann nicht an der Anzahl der Argumente erraten.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>BTW: Was machst du bei Funktionen die z.B. 10+ Parameter nehmen? Guter Stil ist da ja statt dessen ne <code>struct</code> zu übergeben.<br />
Bei der kannst du dann aber erst nicht erzwingen dass alle Member initialisiert werden - kann man genau so leicht vergessen. Die einzige (mMn. überhaupt nicht gute) Alternative (die mir gerade einfällt), wäre, im Default-Ctor der struct lauter Blödsinnswerte einzutragen und zu beten dass es beim Testen auffällt wenn ein Wert wo nicht explizit gesetzt wurde.</p>
</blockquote>
<p>Man kann prinzipiell nicht verhindern, dass jemand Unsinnswerte übergibt. Man kann nur mit einem Konstruktur dabei helfen alle Member zu setzen. Ich sehe nicht, was das mit Standardparametern zu tun hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441064</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 03 Feb 2015 22:40:33 GMT</pubDate></item><item><title><![CDATA[Reply to About a code. Code Style Frage. on Tue, 03 Feb 2015 23:16:20 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Das ist mMn. kein gutes Argument. Man kann auch mit dem expliziten boost::none vergessen etwas anzugeben. Wenn du 100x sinnfrei boost::none getippt hast, weil deine Events so gut wie nie Daten haben, dann tippst du beim 101-ten Event, der dann doch Daten gehapt hätte, auch boost::none. Bzw. copy-pastest es von einer der anderen 100 Stellen.</p>
</blockquote>
<p>Du argumentierst jetzt aber mit einem Fehler, der bei beiden Varianten passieren kann. Der Standardwert ist eine davon unabhängige, weitere Fehlerquelle.</p>
</blockquote>
<p>Wo? Wie?<br />
Entweder ich gebe den Wert an, oder ich gebe ihn nicht an. <code>boost::none</code> ist ein vernünftiger Default-Wert in dem skizzierten Fall, an dem sich wohl so schnell nix ändern wird (genauer: niemals was ändern wird<sup>*</sup>). Wo soll da eine weitere, zusätzliche Fehlerquelle sein? WTF?</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn ich aus irgend einem Grund hier keinen Default-Parameter verwenden dürfte, dann würde ich eher noch zwei Funktionen machen, z.B. <code>LogSimpleEvent(string)</code> und <code>LogDataEvent(string, string)</code> .</p>
</blockquote>
<p>Das ist noch besser als mit <code>optional</code> zu arbeiten. Mit dem <code>optional&lt;string&gt; const&amp;</code> müsste jeder lvalue- <code>string</code> kopiert werden. <code>optional</code> ist hier also die falsche Wahl, unabhängig von Standardparameterwerten.</p>
</blockquote>
<p>Herr TyRoXx. Das Wort Verhältnismässigkeit ist dir vermutlich fremd. Schlag es nach, ist ne interessante Sache. Ansonsten denk dir halt einfach nen <code>optional&lt;int&gt;</code> damit der Ineffizienzalarm in deinem Kopf nicht so schlimm losbrüllt.</p>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>BTW: Was machst du bei Funktionen die z.B. 10+ Parameter nehmen? Guter Stil ist da ja statt dessen ne <code>struct</code> zu übergeben.<br />
Bei der kannst du dann aber erst nicht erzwingen dass alle Member initialisiert werden - kann man genau so leicht vergessen. Die einzige (mMn. überhaupt nicht gute) Alternative (die mir gerade einfällt), wäre, im Default-Ctor der struct lauter Blödsinnswerte einzutragen und zu beten dass es beim Testen auffällt wenn ein Wert wo nicht explizit gesetzt wurde.</p>
</blockquote>
<p>Man kann prinzipiell nicht verhindern, dass jemand Unsinnswerte übergibt. Man kann nur mit einem Konstruktur dabei helfen alle Member zu setzen. Ich sehe nicht, was das mit Standardparametern zu tun hat.</p>
</blockquote>
<p>Boah, stell dich mal nicht <em>so</em> blöd!</p>
<pre><code class="language-cpp">LogEvent(&quot;foo&quot;);
//...
LogEvent(&quot;foo&quot;, &quot;foo-data&quot;);

// vs.

EventEntry ee;
ee.name = &quot;foo&quot;;
// Weitere 9 Werte setzen die man immer setzen muss
LogEvent(ee);
// ...
EventEntry ee;
ee.name = &quot;foo&quot;;
// Weitere 9 Werte setzen die man immer setzen muss
ee.data = &quot;foo-data&quot;;
LogEvent(ee);
</code></pre>
<p>Du erkennst hier kein Muster? Echt nicht?</p>
<p><sup>*</sup>: Natürlich könnte man auf die Idee kommen <code>boost::none</code> durch <code>boost::optional&lt;T&gt;()</code> zu ersetzen, was ne Dependency auf <code>none.hpp</code> einspart. Ändert aber an der Semantik nixe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2441075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2441075</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Feb 2015 23:16:20 GMT</pubDate></item></channel></rss>