2016-03-23 3 views
3

bevorzugen Sie Schreibmethode mit sofortiger Rückgabe des Ergebnisses, um es zuerst der Variablen zuzuordnen? Um es klar zu sagen, betrachten wir nur die Situation, die unten dargestellt ist, wenn keine anderen Operationen im Methodenkörper ausgeführt werden.Weisen Sie der Variablen das Ergebnis der Einzeloperationsmethode zu, bevor Sie sie zurückgeben oder einfach zurückgeben?

Erste Option:

private List<Integer> getIdsOfUsersLoggedWithinLastHour() { 
    return userDAO.getUsersLoggedWithinLastHour().stream().map(User::Id).collect(Collectors.toList()); 
} 

Zweite Option:

private List<Integer> getIdsOfUsersLoggedWithinLastHour() { 
     List<Integer> ids = userDAO.getUsersLoggedWithinLastHour().stream().map(User::Id).collect(Collectors.toList()); 
     return ids; 
    } 

IMHO keine Notwendigkeit besteht, aufgrund der Verfahrensoperationen zu Variablen zugewiesen werden, wenn Sie mit ihm nichts zu tun und nur zurück. Der Rückgabetyp wird in Methodensignatur deklariert, so dass Sie ihn einfach überprüfen können. Die Codesauberkeit ist ungefähr gleich. Sie verwenden einige zusätzliche Speicher- und CPU-Operationen (vielleicht nicht so wichtig heute aber es ist immer etwas Zusätzliches). Ein Freund von mir behauptet, dass das Initialisieren von Variablen besser für das Debuggen und weitere Code-Entwicklung ist, aber ich denke, es ist überflüssig und kann getan werden, wenn Sie das wirklich brauchen, nicht 'für die Zukunft'. Was ist deine Meinung?

Antwort

0

Ich weise das Ergebnis der Variablen nur dann zu, wenn ich eine gewisse Logik damit machen muss, bevor ich den Wert der Methode zurückgebe. Ansonsten verwende ich Codierungsstil aus dem ersten Beispiel - macht Code prägnant.

zweiter Code-Stil kann manchmal während der Debug-Prozesses helfen, aber Sie sollten diese IMHO

auch nicht begehen, wenn Sie zweites Beispiel inspizieren mit jedem gängigen statischen Analyse-Tool wäre es ein Ergebnis wie "local variable is redundant" geben, das ist mehr Grund, diese Vars in realen Projekten zu beseitigen.

Guter Artikel zu diesem Thema Design: http://www.yegor256.com/2015/09/01/redundant-variables-are-evil.html

Aber Sie müssen verstehen, dass es nur eine gängige Praxis, niemand kann Sie nicht redundante Variablen machen verwenden - Code arbeitet mit ihnen richtig, es ist nur eine Frage der Geschmack wie viele andere Design-Prinzipien

+0

Wenn Sie einige Logik tun müssen Sie zu Variable zuweisen, niemand mag "Zug Wracks". Entweder ich mag die erste Option als zweite.Ich stimme auch zu, dass es während des Debuggens hilfreich sein kann, aber Sie können diesen Codierungsstil verwenden, wenn Sie diesen bestimmten Ort im Code debuggen müssen. – soulcoder

+0

Wenn Sie diesen Weg mögen und denken, dass dies eine gute Antwort ist, dann tun Sie es upvote. Ich denke übrigens, dass der Downvote unberechtigt ist. Aber das ist die Falle bei der Beantwortung einer meinungsbezogenen Frage. – Bathsheba

+0

Sie haben Recht. Ich werde warten, vielleicht wird jemand Artikel oder was auch immer zur Verfügung stellen, die irgendwie beweist, dass ein Stil besser ist als andere. Das ist wahr, es ist eine auf Meinungen basierende Frage und hängt von den Vorlieben eines Menschen ab. Ich wollte nur die Meinung anderer Programmierer hören. – soulcoder

3

In vielen Fällen plump ich für die zweite Option und in dem genannten Fall würde ich fast sicher.

Damit können Sie einen Haltepunkt auf return ids; platzieren, der beim Debuggen hilfreich sein kann. (Die Überprüfung des Inhalts eines CPU-Registers ist eine Option in Low-Level-Sprachen wie C, aber ich denke nicht, dass für JVM-basierte Sprachen verfügbar ist).

Eine Reihe von Funktionen, die einen anonymen temporären Stapel zurück auf den Stapel zurückbringen, können schwer zu debuggen sein.

Ich würde mir keine Sorgen machen über irgendeinen Overhead, den die zweite Wahl einführt: das sollte optimiert werden, und eine zusätzliche Referenzvariable zu deklarieren ist wahrscheinlich kein Leistungsengpass, auch wenn sie nicht optimiert wurde. (Beachten Sie, dass in C++ es wird über einen Prozess Named Rückgabewert Optimierung genannt optimiert werden und ich glaube, dass Java nachziehen würde.) Denken Sie daran, dass Code in der Lage zu debuggen und warten ist ebenso wichtig wie Eleganz; was auch immer das in diesem speziellen Fall bedeutet.

+0

IDEs sind hilfreich, wenn Sie debuggen müssen und mit 2 Klicks können Sie Variable erstellen und initialisieren. Sie haben auch einige Evaluatoren, Uhren usw., um den Ausdruckswert sofort auszuwerten, wenn Sie den Haltepunkt betreten. Ist es nicht überflüssig, zusätzlichen Code hinzuzufügen, wenn Sie ihn nicht wirklich benötigen? Meiner Meinung nach kann man es immer trennen, wenn es solche Bedürfnisse gibt. – soulcoder

+0

Das ist das Problem bei dem Versuch, eine Frage zu beantworten, die im Wesentlichen auf einer Meinung beruht. Aber ich stimme nicht mit "Sie brauchen es nicht wirklich". Sie möglicherweise, wenn Sie versuchen, Ihren Code * zu debuggen. Ich neige dazu, mich auf einen Compiler zu verlassen, um Dinge wie triviale Zuordnungen während des Optimierungsprozesses zu entfernen. Kurz gesagt, ich vertraue dem Compiler, dies mehr zu tun, als ich mir selbst vertraue. – Bathsheba

+0

Ich stimme zu, dass es im Debug-Prozess hilfreich sein kann und der Compiler das optimieren könnte. Aber aus Sicht der Sauberkeit der Codes ist es nicht elegant und überflüssig. Wenn wir diesen Ansatz überall im Code verwenden, wenn wir solche Methoden haben, würde das nicht gut aussehen. – soulcoder

Verwandte Themen