2009-07-22 10 views
0

Ich habe einige Daten von einem Server geladen, aber es gibt keine Garantie, dass ich alles haben werde, wenn die UI es dem Benutzer anzeigt. In jedem Frame gibt es eine Tick-Funktion. Wenn neue Daten empfangen werden, wird ein Flag gesetzt, sodass ich weiß, dass es Zeit ist, es in meine Datenstruktur zu laden. Welche der folgenden Möglichkeiten bietet einen vernünftigeren Weg zu entscheiden, wann die Funktion tatsächlich ausgeführt wird?Entscheiden, ob eine Funktion ausgeführt werden soll oder nicht, welcher Weg ist besser?

AddNewStuffToList() 
{ 
    // Clear the list and reload it with new data 
} 

Foo_Tick() 
{ 
    if (updated) 
     AddNewStuffToList(); 

    // Rest of tick function 
} 

Versus:

AddNewStuffToList() 
{ 
    if (updated) 
    { 
     // Clear the list and reload it with new data 
    } 
} 

Foo_Tick() 
{ 
    AddNewStuffToList(); 

    // Rest of tick function 
} 

Ich habe eine Menge der irrelevanten Details zum Zwecke des Beispiels weggelassen.

Antwort

1

IMHO erste. Diese Version trennt:

  • , wenn Daten (Foo_Tick)

VON

  • wie zu aktualisieren Daten Laden (AddNewStuffToList()).

2. Option nur alle Dinge zusammen mischen.

0

Sie sollten die Funktion wahrscheinlich erst ausführen, wenn sie aktualisiert wurde. Auf diese Weise kann die Funktion für mehrere Zwecke verwendet werden.

Angenommen, Sie haben zwei Anrufe, die beide kommen und Daten in die Liste einfügen. Bei der ersten Einrichtung, bei der die Variable innerhalb der Funktion geprüft wurde, konnte nur überprüft werden, ob ein Aufruf eingegangen ist. Wenn Sie dies stattdessen in der Funktion überprüfen, die die Daten aufruft, können Sie beliebig viele Eingabequellen haben. ohne die Anfangsfunktion ändern zu müssen.

Funktionen sollten wirklich genau sein auf das, was sie tun, und sollten es vermeiden, durch eine andere Funktion erstellt Informationen benötigen, es sei denn, es übergeben wird.

0

In der ersten Version wird der einfache Variablencheck "updated" jedes Mal überprüft und nur wenn true, würde AddNewStuffToList aufgerufen werden.

Mit der zweiten Version werden Sie AddNewStuffToList aufrufen, gefolgt von einer Prüfung auf "aktualisiert" jedes Mal.

In diesem speziellen Fall, da Funktionsaufrufe im Vergleich zu einer Variablenprüfung im Allgemeinen teuer sind, bevorzuge ich persönlich die erste Version.

Es gibt jedoch Situationen, in denen eine Überprüfung innerhalb der Funktion besser wäre. z.B. Diese

doSomething(Pointer *p){ 
    p->doSomethingElse(); 
} 

FooTick(){ 
    Pointer *p = new Pointer(); 
    // do stuff ... 
    // lets do something 

    if (p){ 
    doSomething(p); 
    } 
} 

ist clumbsy, weil jedes Mal, wenn Sie doSomething nennen sollten Sie wirklich überprüfen sind Sie nicht in einem schlechten Zeiger übergeben. Was ist, wenn das vergessen wird? wir könnten eine Zugriffsverletzung bekommen. In diesem Fall ist das Folgende besser, da Sie den Scheck nur an einer Stelle schreiben und kein zusätzlicher Overhead hinzugefügt wird, da wir immer sicherstellen wollen, dass wir keinen schlechten Zeiger übergeben.

doSomething(Pointer *p){ 
    if (p){ 
    p->doSomethingElse(); 
    } 
} 

Also im Allgemeinen hängt es von der Situation ab.Es gibt keine richtigen und falschen Antworten, nur Vor- und Nachteile.

Verwandte Themen