Objekt mit Flag
-
Hallo!
Sagen wir ich habe eine Klasse Car:
class Car { private: bool mIsActive; public: void setActive(bool isActive); bool isActive() const; };Dann habe ich noch einen CarManager, der zyklisch alle Autos updated. Allerdings sollen jetzt nur die aktiven Autos geupdated werden. Jetzt frage ich mich, wer für die Prüfung des Cars Flag verantwortlich ist? Soll das der CarManager machen:
// Variante A for(int i=0; i < mCars.size(); i++) { if(mCars[i]->isActive(); mCars[i]->update(); }sprich Cars::update() wird nur für aktive Cars aufgerufen, oder soll das Flag in Cars::update() getestet werden:
// Variante B for(int i=0; i < mCars.size(); i++) { mCars[i]->update(); // Wir rufen IMMER update() auf... } Car::update() { if(!mIsActive) //... und Car checkt selber, ob es aktiv ist return; //.. Auto updaten Code }Was ist besser?
-
Kann man so allgemein nicht sagen.
Ich habe hier die leichte die Tendelendenz, es außerhalb zu machen.Ein isDead im Game wird außerhalb gemacht, weil das auch dafür sorgt, daß die Hauptschleife die toten Objekte aus dem Container löscht.
Wenn so ein isActive typischerweise nur die Inspektion oder ein platter Reifen ist, geht das die Hauptschleife hingegen eher gar nichts an.
ALso ich sage ein klares Jein.
-
Noch andere Meinungen, Ratschläge?^^
-
Eine Liste aller aktiven Objekte führen.
-
also speziell für dein Beispiel würde ich sagen:
mach das Attribut public... wenn du ohnehin triviale getter und setter hast,
kannst du den Zugriff auch so freigeben.
in dem Fall würde für die Überprüfung von außen dann sprechen,
dass die Funktionsaufrufe wegfallen, falls das Objekt inaktiv ist,
was wiederum Performance bringt.Insgesamt ist das aber nur Spekulation und hängt stark vom System, dem Compiler, der Optimierungsstufe, dem konkreten Inhalt deiner ausgeführten Funktionen usw.
z.B. könnte ein Compiler deine IsActive inlinen, sodass es im Binärcode genauso aussieht, als wäre die Variable immer public gewesen...
Über die Grenzen einer Quelldatei hinaus würde das aber Link-Time-Optimization erfordern, die AFAIK noch nicht 100% ausgereift ist.wenn es dir aber nicht um Performance oder Größe beim generierten Code geht, sondern nur um Stil,
so würde ich mich volkard anschließen...schreib es so, wie es Sinn macht...
-
Arrekk schrieb:
Was ist besser?
Würde auch meinen, dass das vom Fall abhängt. In meinem Jump'n'Run habe ich die Abfrage, ob ein Gegner aktiv ist, in der Schleife. Aber man könnte sich wie von TyRoXx vorgeschlagen auch überlegen, Gegner erst in die Hauptliste einzufügen, wenn sie aktiviert werden. Worum gehts konkret bei
update()?DrakoXP schrieb:
wenn du ohnehin triviale getter und setter hast,
kannst du den Zugriff auch so freigeben.Nein. Lese-/Schreibzugriff ist immer noch getrennt, ausserdem ist die Implementierung verborgen und kann ohne Probleme geändert werden.
DrakoXP schrieb:
in dem Fall würde für die Überprüfung von außen dann sprechen,
dass die Funktionsaufrufe wegfallen, falls das Objekt inaktiv ist,
was wiederum Performance bringt.Der Performanceunterschied ist kaum messbar bis nichtexistent. Dafür Kapselung zu opfern braucht stichhaltige Beweise.
Übrigens: Deine Versform sieht zwar interessant aus, aber das Forum bricht Zeilen automatisch um
