<?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[frage zu programmierstil (am c++ beispiel)]]></title><description><![CDATA[<p>hallo allerseits,</p>
<p>habe leider zu folgendem thema nicht soviel bei der suche im forum gefunden aber hoffe zumindest ein kommentar von erfahrenen leuten zu bekommen:</p>
<pre><code>class A
{
   public:
     A() {myVal=0;mySpeciaVal=0;}
     ~A(){}

     int GetVal()
     {
        if( IrgendWasUeberpruefen() )
        {
          myVal = mySpecialVal;
        }
        return myVal;
     }

     void SetVal(int newVal)
     {
       if( IrgendWasUeberpruefen() )
         mySpecialVal = newVal;
       else
         myVal = newVal;
     }

     bool IrgendWasUeberprufen()
     {
        bool state = false;
        // irgend eine gescheite logik hier und state entsprechend setzen ..
        return state;
     }
     int myVal;
     int specialVal;
};
</code></pre>
<p>Es geht darum, dass obige GetVal Methode offensichtlich seiteneffekte hat.<br />
Ich hatte bisher immer die sichtweise dass getter (sofern man sie unbedingt haben muss) schon von vornherein als const-methoden deklariert sein sollten und auch im rumpf keine seiten-effekte haben sollten.</p>
<p>liege ich eigentlich mit dieser sichtweise voellig falsch ?!?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
falls nicht, gibt es vielleicht online verfuegbare quellen, die meine sichtweise bestaetigen oder in die gleiche richtung gehen !?</p>
<p>vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327692/frage-zu-programmierstil-am-c-beispiel</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 22:44:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327692.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Aug 2014 11:46:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Thu, 28 Aug 2014 11:46:04 GMT]]></title><description><![CDATA[<p>hallo allerseits,</p>
<p>habe leider zu folgendem thema nicht soviel bei der suche im forum gefunden aber hoffe zumindest ein kommentar von erfahrenen leuten zu bekommen:</p>
<pre><code>class A
{
   public:
     A() {myVal=0;mySpeciaVal=0;}
     ~A(){}

     int GetVal()
     {
        if( IrgendWasUeberpruefen() )
        {
          myVal = mySpecialVal;
        }
        return myVal;
     }

     void SetVal(int newVal)
     {
       if( IrgendWasUeberpruefen() )
         mySpecialVal = newVal;
       else
         myVal = newVal;
     }

     bool IrgendWasUeberprufen()
     {
        bool state = false;
        // irgend eine gescheite logik hier und state entsprechend setzen ..
        return state;
     }
     int myVal;
     int specialVal;
};
</code></pre>
<p>Es geht darum, dass obige GetVal Methode offensichtlich seiteneffekte hat.<br />
Ich hatte bisher immer die sichtweise dass getter (sofern man sie unbedingt haben muss) schon von vornherein als const-methoden deklariert sein sollten und auch im rumpf keine seiten-effekte haben sollten.</p>
<p>liege ich eigentlich mit dieser sichtweise voellig falsch ?!?! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
falls nicht, gibt es vielleicht online verfuegbare quellen, die meine sichtweise bestaetigen oder in die gleiche richtung gehen !?</p>
<p>vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415167</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 28 Aug 2014 11:46:04 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Thu, 28 Aug 2014 12:00:21 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>Ich hatte bisher immer die sichtweise dass getter (sofern man sie unbedingt haben muss) schon von vornherein als const-methoden deklariert sein sollten und auch im rumpf keine seiten-effekte haben sollten.</p>
</blockquote>
<p>In der Regel sehe ich das auch so, es gibt aber durchaus auch Ausnahmen (z.B. bei LazyLoad, bei dem die Daten erst beim Zugriff nachgeladen werden). Wobei ich in diesen Sonderfall die Getter weiterhin mit const angebe, und mit mutable arbeite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415170</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 28 Aug 2014 12:00:21 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Thu, 28 Aug 2014 12:10:40 GMT]]></title><description><![CDATA[<p>noch eine anmerkung:</p>
<p>die member muesste oben eigentlich mySpecialVal heissen (letzte zeile in klasse).</p>
<p>so verstehe ich, dass obige GetVal() methode doch &quot;schoener&quot; wie folgt aussehe:</p>
<pre><code>int GetVal() const
{
   int val = myVal;
   if( IrgendWasUeberpruefen() )
     val = mySpecialVal;
   return val; 
}
</code></pre>
<p>nur dieses &quot;schoener&quot; wuerde ich gerne fuer einen mitmenschen irgendwoher belegt haben ...</p>
<p>gibt es vielleicht bekannte (oeffentlich verfuegbare) quellen zu diesem thema ? ich benutze glaube ich nicht die richtigen such-begriffe sodass google hierzu nicht viel liefert.</p>
<p>Zudem ist natuerlich diese aenderung von GetVal() mit fehlen des seiteneffektes damit verbunden, dass entsprechende logik (zum setzen von myVal) an anderen stellen nachprogrammiert werden muesste. das duerfte klar sein.</p>
<p>vielen dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415172</guid><dc:creator><![CDATA[pepe75]]></dc:creator><pubDate>Thu, 28 Aug 2014 12:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Thu, 28 Aug 2014 13:09:08 GMT]]></title><description><![CDATA[<p>pepe75 schrieb:</p>
<blockquote>
<p>so verstehe ich, dass obige GetVal() methode doch &quot;schoener&quot; wie folgt aussehe:</p>
</blockquote>
<p>Die macht aber nicht das gleiche, zudem sehe ich kein Grund für die temporäre Variable (Wenn kein Wert gesetzt werden soll, kann man im if auch gleich ein return machen).</p>
<p>Wenn ich den ursprünglichen Code richtig verstehe wollte der Orginalautor einen Wert abhängig von einem bestimmten Status setzen und zurückliefern. Dies als solches ist in einer Getter durchaus nicht verkehrt, nicht verständlich für mich ist aber das Überschreiben im Getter.</p>
<p>pepe75 schrieb:</p>
<blockquote>
<p>gibt es vielleicht bekannte (oeffentlich verfuegbare) quellen zu diesem thema ? ich benutze glaube ich nicht die richtigen such-begriffe sodass google hierzu nicht viel liefert.</p>
</blockquote>
<p>Wenn du google durchsuchst wirst du vermutlich nichts finden, oder gleich 100 verschiedene Meinungen.</p>
<p>Aber Grundsätzlich glaube ich das Code möglichst verständlich sein sollte. Und wenn man etwas abruft, erwartet man keine Statusänderung. Dazu wirst du schon eher Treffer finden (Vermutlich unter &quot;SOLID&quot;/&quot;KISS&quot; oder Clean Code).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415176</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 28 Aug 2014 13:09:08 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Thu, 28 Aug 2014 17:00:09 GMT]]></title><description><![CDATA[<p>Meine Gedanken zu dem Thema...</p>
<p>1. Der Funktionsname <code>GetVal</code> impliziert einen reinen &quot;getter&quot;, d.h.<br />
1.a. Der Funktionsname impliziert dass <code>GetVal const</code> ist.<br />
1.b. Der Funktionsname impliziert dass <code>GetVal</code> keine <em>von aussen beobachtbaren</em> Effekte hat.<br />
Diese üblichen Annahmen nicht zu erfüllen verletzt das Principle Of Least Astonishment (POLA).<br />
Also entweder <code>GetVal</code> const machen oder umbenennen.</p>
<p>2. Die &quot;Symmetrie&quot; der Funktionsnamen <code>GetVal</code> und <code>SetVal</code> impliziert dass bei <code>GetVal</code> genau das zurückkommt was man zuletzt mit <code>SetVal</code> reingesteckt hat - die nächste POLA-Verletzung.<br />
Also entweder die Spezialbehandlung in <code>GetVal</code> entfernen oder eine der beiden Funktionen umbenennen.</p>
<p>3. Bei <code>GetVal() const</code> + <code>mutable</code> Member sollte man vorsichtig sein, denn <code>const</code> impliziert &quot;thread safe&quot;. Seit C++11 ist das sogar (indirekt) als Garantie im Standard verankert. D.h. man muss irgendwie intern synchronisieren (mit Mutexen, Atomics o.Ä.).<br />
Andernfalls ist es die nächste POLA-Verletzung bzw. seit C++11 sogar UB wenn man die Klasse zusammen mit der Standard-Library verwendet (also in Standard-Container steckt, von Standard-Algorithmen bearbeiten lässt, ...).</p>
<p>4. Wenn ich die Wahl zwischen der <code>GetVal</code> -Variante habe die die Membervariable modifiziert und der die das nicht tut und statt dessen bei jedem Aufruf checkt ob <code>myVal</code> oder <code>specialVal</code> zurückgegeben werden soll, dann ganz klar letzteres.<br />
Jegliche Form von &quot;mutable state&quot; macht es schwieriger zu verstehen was eine Klasse macht, wie sie sich in einem bestimmten Programm verhalten wird. Daher ist &quot;vermeidbarer mutable state&quot; böse.<br />
Und selbst in Situationen wie hier, wo <code>myVal</code> sowieso schon &quot;mutable state&quot; ist (gibt ja immer den Setter), ist es meist deutlich einfacher das Verhalten des Programms nachzuvollziehen, wenn die Variablen an möglicht wenig stellen modifziert werden. Wenn <code>myVal</code> nur im Setter modifiziert wird ist das eine super-einfache Sache, man muss nicht drüber nachdenken ob der Getter schon aufgerufen wurde oder nicht. Es ist immer klar dass <code>myVal</code> einfach genau den Fall hat der zuletzt über <code>SetVal</code> gesetzt wurde. &quot;KISS&quot; hat ja asc schon erwähnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415206</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 Aug 2014 17:00:09 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Thu, 28 Aug 2014 20:22:18 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Meine Gedanken zu dem Thema...<br />
1. Der Funktionsname <code>GetVal</code> impliziert…</p>
</blockquote>
<p>Das ist ein Foo/Bar::baz-Beispiel. Fertig.</p>
<p>Ich sage mal, warum der Thread an sich für mich fertig ist.</p>
<p>Es sind sinvolle Foo-Getter denkbar. Am Ende sogar Setter. Solange man abstrakt bleibt, aber nur dann. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Deswegen antworte ich kaum noch auf foobar-Fragen, denn zu 99% will der foobar-Kunde was granatenoffensichtlich Triviales wegvertemplieren, wegvirtualisieren oder sonstwie wegabstrahieren.</p>
<pre><code>bool IrgendWasUeberprufen()
</code></pre>
<p>Danke. Mein erster Gedanke war, daß das IrgendWasUeberprufen aüßerhalb leben sollte und alles wäre paletti.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415227</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 28 Aug 2014 20:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Sat, 30 Aug 2014 18:49:16 GMT]]></title><description><![CDATA[<p>macht ja oft Sinn, dass man bei Getxyz() Methoden auch noch was berechnet.<br />
Mit der Methode der späten Auswertung und Caching hab ich schon öfters gute Erfahrungen gemacht.</p>
<p>Also so in der Art - jedenfalls NICHT als const!<br />
mutable ist natürlich auch eine Lösung, in meinen Augen aber eine unschöne.</p>
<pre><code>int Foo::Getxxyz()
{
 if(!m_Cached)
 {
   m_xyz=Berechnexyz();
   m_Cached=true;
 }

 return m_xyz;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2415491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415491</guid><dc:creator><![CDATA[fgdfdg]]></dc:creator><pubDate>Sat, 30 Aug 2014 18:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to frage zu programmierstil (am c++ beispiel) on Mon, 01 Sep 2014 10:02:31 GMT]]></title><description><![CDATA[<p>fgdfdg schrieb:</p>
<blockquote>
<p>macht ja oft Sinn, dass man bei Getxyz() Methoden auch noch was berechnet.<br />
Mit der Methode der späten Auswertung und Caching hab ich schon öfters gute Erfahrungen gemacht.</p>
<p>Also so in der Art - jedenfalls NICHT als const!<br />
mutable ist natürlich auch eine Lösung, in meinen Augen aber eine unschöne.</p>
<pre><code>int Foo::Getxxyz()
{
 if(!m_Cached)
 {
   m_xyz=Berechnexyz();
   m_Cached=true;
 }
 return m_xyz;
}
</code></pre>
</blockquote>
<p>Genau für sowas ist <em>mutable</em> da. <em>const</em> bezieht sich nur auf den observable state eines Objekts, wenn sich da Interna ändern müssen die von aussen nicht sichtbar sein und das Objekt darf sie in einer <em>const</em> Methode ändern.</p>
<p>Edit:<br />
Typo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415637</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 01 Sep 2014 10:02:31 GMT</pubDate></item></channel></rss>