<?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[Designfrage: Attribut VOR Aufruf checken?]]></title><description><![CDATA[<p>Abend,</p>
<p>kleine Designfrage: Wenn eine Klasse ein Attribut mIsVisible besitzt und gewisse Methoden nur durchlaufen sollen, wenn mIsVisible = true ist, sollte man das Attribut dann VOR Aufruf checkern oder IN der Methode?</p>
<p>Sprich:<br />
A) VOR Aufruf checken:</p>
<pre><code class="language-cpp">MyClass* m = ...
if(m-&gt;isVisible())
   m-&gt;method();  // MyClass::method() prüft NICHT mehr den Status von MyClass::mIsvisible ab
</code></pre>
<p>oder<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> In der Methode checken:</p>
<pre><code class="language-cpp">MyClass::method() {
   if(!mIsVisible)
      return;
   ...
}

MyClass* m = ...
m-&gt;method(); // Aufruf unabhängig vom Status von MyClass::mIsVisible
</code></pre>
<p>Was findet ihr besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310062/designfrage-attribut-vor-aufruf-checken</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 21:08:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310062.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Nov 2012 16:51:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Fri, 02 Nov 2012 16:51:47 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>kleine Designfrage: Wenn eine Klasse ein Attribut mIsVisible besitzt und gewisse Methoden nur durchlaufen sollen, wenn mIsVisible = true ist, sollte man das Attribut dann VOR Aufruf checkern oder IN der Methode?</p>
<p>Sprich:<br />
A) VOR Aufruf checken:</p>
<pre><code class="language-cpp">MyClass* m = ...
if(m-&gt;isVisible())
   m-&gt;method();  // MyClass::method() prüft NICHT mehr den Status von MyClass::mIsvisible ab
</code></pre>
<p>oder<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> In der Methode checken:</p>
<pre><code class="language-cpp">MyClass::method() {
   if(!mIsVisible)
      return;
   ...
}

MyClass* m = ...
m-&gt;method(); // Aufruf unabhängig vom Status von MyClass::mIsVisible
</code></pre>
<p>Was findet ihr besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266656</guid><dc:creator><![CDATA[RobbenCaptn]]></dc:creator><pubDate>Fri, 02 Nov 2012 16:51:47 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Fri, 02 Nov 2012 17:01:52 GMT]]></title><description><![CDATA[<blockquote>
<p>kleine Designfrage: Wenn eine Klasse ein Attribut mIsVisible besitzt und gewisse Methoden nur durchlaufen sollen, wenn mIsVisible = true ist, sollte man das Attribut dann VOR Aufruf checkern oder IN der Methode?</p>
</blockquote>
<p>Kommt darauf an. Wenn diese Methoden <strong>immer nur dann</strong> durchlaufen sollen, wenn <code>mIsVisible == true</code> ist, dann Methode 2, sonst Methode 1.</p>
<p>Schließlich ist es Blödsinn, wenn man vor <strong>jeden</strong> Funktionsaufruf von <code>method()</code> eine Abfrage machen muss.</p>
<p>Edit: Gibt auch Fälle wo man es anders machen sollte. Aber dazu hast du zu wenig Hintergrund/Kontext gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266658</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 02 Nov 2012 17:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Fri, 02 Nov 2012 17:28:15 GMT]]></title><description><![CDATA[<p>Ich würde kategorisch immer VOR dem Aufruf checken lassen.<br />
Wenn man eine Methode aufruft erwartet man auch, dass etwas passiert.</p>
<p>Ausserdem kann es unnötig Performance kosten. Angenommen hast ein solches Objekt und musst eine Funktion 1 Million mal hintereinander aufrufen immer mit einem anderen Parameter. Dann ist es besser, den Check einmal ausserhalb der Schleife zu machen als 1 Million mal innerhalb.</p>
<p>Vor Fehlern schützen muss man sich natürlich trotzdem. Daher solltest du in jeder solchen Funktion ein assert auf die Eigenschaft haben <code>assert(isVisible())</code> .</p>
<p>Wichtig ist vor allem, dass die Methoden nicht gemischt werden. Sonst muss vor jedem Aufruf überlegt werden, ob man noch etwas testen muss oder nicht. So passieren dann Fehler. Also immer das gleiche verwenden.</p>
<p>Die raren Ausnahmen sind delete und die IO-Streams, heute mit Exceptions wäre das sowieso anders gelöst worden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266664</guid><dc:creator><![CDATA[HintergrundKontext]]></dc:creator><pubDate>Fri, 02 Nov 2012 17:28:15 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Sat, 03 Nov 2012 16:27:56 GMT]]></title><description><![CDATA[<p>B ist besser, weil man die Methode nicht falsch aufrufen kann.<br />
Eventuell lohnt es sich aber, die Sichtbarkeitseigenschaft aus der Klasse herauszuziehen und anders auszudrücken.</p>
<p>Die &quot;sichtbaren&quot; Objekte in einer gesonderten Liste führen:</p>
<pre><code class="language-cpp">struct Renderable
{
	void render();
};

struct Scene
{
	void setVisible(Renderable &amp;thing)
	{
		m_visibleThings.insert(&amp;thing);
	}

	void setInvisible(Renderable &amp;thing)
	{
		m_visibleThings.erase(&amp;thing);
	}

	void render()
	{
		for (Renderable * const entry : m_visibleThings)
		{
			entry-&gt;render();
		}
	}

private:

	std::set&lt;Renderable *&gt; m_visibleThings;
};
</code></pre>
<p>Decorator pattern:</p>
<pre><code class="language-cpp">struct Renderable
{
	virtual ~Renderable();
	virtual void render() = 0;
};

struct Hideable : Renderable
{
	explicit Hideable(std::unique_ptr&lt;Renderable&gt; realThing, bool isVisible = true)
		: m_realThing(std::move(realThing))
		, m_isVisible(isVisible)
	{
	}

	void setVisibility(bool isVisible)
	{
		m_isVisible = isVisible;
	}

	virtual void render() override
	{
		if (m_isVisible)
		{
			m_realThing-&gt;render();
		}
	}

private:

	std::unique_ptr&lt;Renderable&gt; m_realThing;
	bool m_isVisible;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2266682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266682</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 03 Nov 2012 16:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Sat, 03 Nov 2012 03:44:02 GMT]]></title><description><![CDATA[<p>HintergrundKontext schrieb:</p>
<blockquote>
<p>Ich würde kategorisch immer VOR dem Aufruf checken lassen.<br />
(...)</p>
</blockquote>
<p>Dann würdest du kategorisch schwer wartbaren und sehr fehleranfälligen Code schreiben.<br />
Solche Dinge checkt man üblicherweise in der Funktion/Methode.<br />
Und in Spezialfällen nochmal ausserhalb.<br />
(z.B. wenn man wirklich viele Objekte hat, von denen die allermeisten invisible sind, kann es Sinn machen den Check in die Schleife rauszuziehen die die Funktion/Methode aufruft)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266795</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 03 Nov 2012 03:44:02 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Sat, 03 Nov 2012 09:29:15 GMT]]></title><description><![CDATA[<p>TyRoXx:<br />
Wobei das ja nur Decorator ist, wenn Renderable dann tatsächlich schon die Render-Funktionalität hat. Aber das hast Du jetzt auch angenommen, richtig?</p>
<p>hustbaer:<br />
Bei Massenaufruf würdest Du es <em>zusätzlich</em> von außen aufrufen? Das würde doch nicht helfen, die Prüfung geschieht intern doch sowieso stets noch. Oder meinst Du, Du bietest dann zwei Versionen der Funktion an?</p>
<p>Ich finde diesen Massenaufruf jedoch eh etwas gekünstelt. In TEs Beispiel kann das so ja nicht geschehen, da die Sichtbarkeit für jedes Objekt anders sein kann und somit geprüft werden muss. Der interessante Fall ist doch, wenn man eine Gruppe gebildet hat, in welcher dieses gemeinsame Prüfattribut vorhanden ist. Dann jedoch kann ein einzelnes Objekt dieses Attribut doch überhaupt nicht kennen und somit <em>kann</em> die Prüfung doch gar nicht intern geschehen.</p>
<p>Die externe Prüfung sollte sich eben auf Attribute beziehen, die nicht dem Objekt selbst zuzuschreiben und kritisch (im Sinne von: die Funktion <em>darf</em> auf keinen Fall aufgerufen werden, wenn das Attribut z.B. false ist) sind. Wenn es sich um externe Eigenschaften handelt, kann die Prüfung aber sowieso nicht intern geschehen; und dann sollte die Methode aber natürlich trotzdem funktionieren, was sie aber sowieso tut.</p>
<p>Mir fehlt hier irgendwie das Anwendungsbeispiel, wo eine externe Prüfung der Internas einen Vorteil bieten würde, ich sehe bisher keinen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266812</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 03 Nov 2012 09:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Sat, 03 Nov 2012 20:49:37 GMT]]></title><description><![CDATA[<p>Dein Text ist für mich irgendwie sehr verwirrend.<br />
Im Beispiel des OP ist es ganz klar ein &quot;internes&quot; Attribut, überlegungen über &quot;externe&quot; Attribute erübrigen sich daher denke ich.</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>hustbaer:<br />
Bei Massenaufruf würdest Du es <em>zusätzlich</em> von außen aufrufen? Das würde doch nicht helfen, die Prüfung geschieht intern doch sowieso stets noch. Oder meinst Du, Du bietest dann zwei Versionen der Funktion an?</p>
</blockquote>
<p>Nein, ich würde nur eine Version der Funktion anbieten.<br />
Wenn gerendert wird, dann tut der Test eines bools nicht wirklich weh, weil das Rendern sowieso viel länger dauert.</p>
<p>Bleibt also noch ein Fall den man optimieren kann, und zwar dass man viele viele Objekte hat von denen nur ganz wenige gerendert werden.<br />
Und genau da macht ein zusätzlicher, &quot;externer&quot; Test u.U. Sinn. Und zwar dann, wenn die Render-Funktion nicht inline erweitert wird, der Test aber schon.<br />
Dann spart man sich nämlich die vielen Funktionsaufrufe für die vielen Objekte die eh nicht gerendert werden sollen.</p>
<blockquote>
<p>Ich finde diesen Massenaufruf jedoch eh etwas gekünstelt. In TEs Beispiel kann das so ja nicht geschehen, da die Sichtbarkeit für jedes Objekt anders sein kann und somit geprüft werden muss.</p>
</blockquote>
<p>Ja, darauf beziehe ich mich ja auch.<br />
Ich rede ja nicht von <code>if - for - render</code> sondern von <code>for - if - render</code> .</p>
<blockquote>
<p>Der interessante Fall ist doch, wenn man eine Gruppe gebildet hat, in welcher dieses gemeinsame Prüfattribut vorhanden ist. Dann jedoch kann ein einzelnes Objekt dieses Attribut doch überhaupt nicht kennen und somit <em>kann</em> die Prüfung doch gar nicht intern geschehen.</p>
</blockquote>
<p>Wieso sollte das der interessante Fall sein? Normalerweise besitzt das Objekt sein eigenes &quot;visible&quot; Attribut, den von dir beschriebenen Fall kann es dann gar nicht geben.</p>
<blockquote>
<p>Mir fehlt hier irgendwie das Anwendungsbeispiel, wo eine externe Prüfung der Internas einen Vorteil bieten würde, ich sehe bisher keinen.</p>
</blockquote>
<p>Siehe oben. Ich meine auch nicht dass man das öfter so machen sollte. Ich wollte damit nur sagen: es kann Fälle geben wo das Sinn macht - wenn auch nicht viele.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2267023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2267023</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 03 Nov 2012 20:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Attribut VOR Aufruf checken? on Sat, 03 Nov 2012 23:40:27 GMT]]></title><description><![CDATA[<p>RobbenCaptn schrieb:</p>
<blockquote>
<p>kleine Designfrage: Wenn eine Klasse ein Attribut mIsVisible besitzt und gewisse Methoden nur durchlaufen sollen, wenn mIsVisible = true ist, sollte man das Attribut dann VOR Aufruf checkern oder IN der Methode?</p>
</blockquote>
<p>Gegenfrage: Stellt es einen Programmier-/Logikfehler dar, wenn die Methode aufgerufen wird, obwohl isVisible gleich false ist? Dann würde ich eher auf ein assert zurückgreifen.</p>
<p>Mal ein ganz gruseliges Beispiel: Ein Programmierer schreibt eine Funktion, die einen gültigen Pointer als Argument erwartet. Etwas anderes als ein gültiger Pointer stellte in diesem Fall einen massiven Programmfehler dar.</p>
<p>Nun fügte dieser Programmierer (wahrscheinlich durch einen Absturz o.ä. motiviert) am Anfang dieser Funktion ein &quot;if (ptr == NULL) return;&quot; (oder äquivalent) hinzu. Klar, der Absturz war vielleicht weg. Damit aber auch jede Chance den Fehler in einem anderen Teil des Quellcodes überhaupt erst zu entdecken. Wird ein NULL-Pointer übergeben (dessen reine Existenz an dieser Stelle auf einen Fehler in einem anderen Code-Bereich hinweist), kehrte die Funktion ohne jedes Mucken (aber auch ohne irgendeine Arbeit zu verrichten) einfach zurück. Du kannst dir vorstellen, dass das Finden von Fehlern in derart geschriebenem Code keine schöne Angelegenheit ist.</p>
<p>Mit defensiver Programmierung hat das auch überhaupt nichts zu tun. Ein klar illegaler Parameter sollte niemals dazu führen, dass die Funktion still und leise einfach gar nichts macht. So versteckt man nur Bugs.</p>
<p>Sowas willst du aber nicht machen, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2267083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2267083</guid><dc:creator><![CDATA[Mod4-Taste]]></dc:creator><pubDate>Sat, 03 Nov 2012 23:40:27 GMT</pubDate></item></channel></rss>