11 Stimmen

Wiederholte Anrufe - Kodierungspraxis

Welche bevorzugen Sie? (natürlich macht getSize keine komplizierte Zählung, sondern gibt nur den Mitgliedswert zurück)

void method1(Object & o)
{
    int size = o.getSize();

    someAction(size);
    someOtherAction(size);
}

ou

void method2(Object & o)
{
    someAction(o.getSize());
    someOtherAction(o.getSize());
}

Ich weiß, dass ich messen kann, welche schneller ist, aber ich möchte einige Kommentare... Nicht nur in Bezug auf die Ausführungszeit... z.B. wenn Sie Methode2 bevorzugen, wie oft verwenden Sie maximal o.getSize und was ist die Zahl, die Sie dazu bringt, Methode1 zu verwenden? Irgendwelche Best Practices? (stellen Sie sich auch andere Typen als int vor) TY

10voto

Alnitak Punkte 324207

Ich würde mich für Methode 1 entscheiden, nicht nur, weil sie wahrscheinlich etwas schneller ist, sondern vor allem, weil ich mir keine Gedanken darüber machen muss, ob die aufgerufene Methode irgendwelche Nebenwirkungen hat.

Wenn dies in einem Multithreading-Programm aufgerufen wird, wird außerdem sichergestellt, dass ich immer die meine Wert der Größe - andernfalls könnte er sich zwischen den beiden Aufrufen geändert haben. Natürlich kann es Fälle geben, in denen Sie diese Änderung explizit bemerken wollen; in diesem Fall verwenden Sie Methode 2.

(und ja, gemäß anderen Antworten, machen Sie size a const int um sicherzustellen, dass es nicht verändert wird, wenn es als Referenz an etwas anderes übergeben wird).

9voto

Johnsyweb Punkte 128606

Da Sie nicht wollen, dass size zu ändern, wenn Sie aufrufen someAction() o someOtherAction() (was nicht der Fall ist, wenn es sich um den Rückgabewert einer Funktion handelt), sollten Sie überlegen:

void method3(const Object& o)
{
    const int size = o.getSize();

    someAction(size);
    someOtherAction(size);
}

getSize() kann einfach sein oder eine kostspielige Berechnung beinhalten. Auch die Größe der o kann von einem anderen Thread zwischen Ihren Aufrufen von someAction() y someOtherAction() .

1voto

Nawaz Punkte 339767

Ich würde den ersten Ansatz bevorzugen. Der wiederholte Aufruf einer Funktion erscheint mir nicht sinnvoll, insbesondere wenn der zurückgegebene Wert jedes Mal derselbe ist. Der erste Ansatz vermeidet auch den Overhead des wiederholten Aufrufs einer Funktion.

1voto

Adrian Marinica Punkte 2161

Wenn ich eine Funktion aufrufe, die mehrmals etwas zurückgibt (etwa mehr als 2-3 Mal), speichere ich den zurückgegebenen Wert normalerweise in einer lokalen Variablen. Das liegt daran, dass ich mehr Wert auf die Programmgeschwindigkeit als auf die Speicherplatzersparnis lege. Nicht, dass Speicherplatz nicht wichtig wäre. Es hängt nur von der jeweiligen Situation ab. Der Aufruf einer Funktion, deren Ausführung nicht viel Zeit in Anspruch nimmt, ist nicht zeitaufwendig, aber eine Funktion mit mehreren Schleifen, die sehr oft aufgerufen wird, würde Ihr Programm in lange Wartezeiten versetzen.

1voto

Shamim Hafiz - MSFT Punkte 20458

Mit der ersten Methode werden unnötige Funktionsaufrufe vermieden, daher ziehe ich method1() vor, da der Code auch etwas sauberer aussieht.

Sie sollten sich jedoch bewusst sein, dass sie je nach Kontext zu unterschiedlichen Ergebnissen führen können. Wenn sich beispielsweise die Größe in someAction() ändert und Sie den in der Variablen size gespeicherten Wert verwenden, erhalten Sie möglicherweise nicht das gewünschte Ergebnis.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X