Der Operator add der Klasse set gibt einen Booleschen Wert zurück, der true ist, wenn das Element (das hinzugefügt werden soll) noch nicht vorhanden ist, andernfalls false. Schreibt
if (set.add(entry)) {
//do some more stuff
}
als guter Stil in Bezug auf das Schreiben von sauberem Code? Ich frage mich, da Sie zwei Dinge gleichzeitig tun. 1) Hinzufügen des Elements und 2) Überprüfen, ob das Element vorhanden ist.
java
coding-style
clean-code
Andreas Braun
quelle
quelle
java.util.Set
, der wahr ist,add
wenn das Element noch nicht da war, oder?if (!set.add(entry)) {// entry already present, possibly a case you want to handle}
Antworten:
Ja ist es.
Wenn eine Operation einen Booleschen Wert zurückgibt, können Sie ihn normalerweise verwenden, um Entscheidungen zu treffen, z
if
Konstrukts. Die einzige andere Möglichkeit, dieses Potenzial zu realisieren, besteht darin, den Rückgabewert in einer Variablen zu speichern und ihn dann sofort in einer wiederzuverwendenif
, was einfach albern und dem Schreiben keineswegs vorzuziehen istif(operation()) { ... }
. Also mach einfach weiter, wir werden dich nicht beurteilen.quelle
Set.add
als einzelne Operation zu verwenden, ohne eine Alternative zu nennen. Wenn die beabsichtigte Operation darin besteht, ein einzelnes Element hinzuzufügen und herauszufinden, ob es hinzugefügt wurde, besteht keine Notwendigkeit für eine leistungsfähigere Alternative, die die Operation immer noch ohne Nutzen verkompliziert. Ich hoffe, Sie wissen, dassSet.add
es sich um eine integrierte JRE-Methode handelt, die verwendet werden kann, ohne zuvor ein Buch mit mehr als 700 Seiten zu studieren.Ich würde sagen, es ist nicht so sauber wie möglich, weil es den Betreuer zwingt, entweder bereits zu wissen oder nachzuschlagen, was der Rückgabewert bedeutet. Bedeutet dies, dass der Wert bereits vorhanden war, noch nicht vorhanden war und erfolgreich eingefügt wurde? Wenn Sie es nicht oft benutzen, werden Sie es nicht wissen, und selbst wenn Sie es tun, ist es eine viel größere mentale Belastung.
Ich würde folgendes bevorzugen:
Ja, ein bisschen ausführlicher, aber der Compiler sollte so ziemlich den gleichen Bytecode generieren, und selbst Leute, die seit Jahren keine Java-Sets mehr verwendet haben, können der Logik folgen, ohne etwas nachzuschlagen.
quelle
add
Gibt true zurück, wenn das Element noch nicht vorhanden war. (Der Wortlaut der Frage ist irreführend.)Set.add
, sind Sie unerfahren und sollten diese Methoden ausprobieren, um sie zu erlernen und erfahrener zu werden.notAlreadyPresent
ist nicht die beste Formulierung. Ich würde verwendenadded
und erwarten, dass der Leser weiß, warum ein Wert nicht zu einem Set hinzugefügt wird.Wenn wahr Erfolg bedeutet, dann ist es guter, klarer Code.
Es gibt eine weit verbreitete Konvention, dass eine Funktion oder Methode bei Erfolg true (oder etwas, das als true ausgewertet wird) zurückgibt. Solange Ihr Code dem folgt, denke ich, dass es in Ordnung ist, die Methode in die Bedingung zu setzen.
Code wie dieser ist aus meiner Sicht unnötig unübersichtlich:
Es fühlt sich an, als würdest du dich wiederholen.
Die Frage ist jedoch zweideutig in Bezug auf die Bedeutung des Rückgabewerts. Sie sagen "ein Boolescher Wert, der angibt, ob das hinzugefügte Element bereits vorhanden war". Dies könnte bedeuten, dass true bedeutet, dass das Element vorhanden war (und add nicht aufgetreten ist). In diesem Fall würde ich das Rückgabeverhalten der Methode im Idealfall konventioneller gestalten. Wenn dies nicht möglich ist, würde ich eine zusätzliche Zwischenvariable hinzufügen, mit der Sie das Rückgabeergebnis in Ihrem Code eindeutig kennzeichnen können (wie von anderen vorgeschlagen).
quelle
false
dass das Element nicht hinzugefügt wurde, weil es bereits enthalten war, undtrue
dass das Element noch nicht enthalten war. Asadd()
fügt das Element der Menge hinzu, wenn die Menge es noch nicht enthält.true
Dies bedeutet, dass das Element erfolgreich zur Menge hinzugefügt wurde.add
gelingt dies, ohne dass etwas getan werden muss. Wenn das Element noch nicht im Set enthalten war, wirdadd
es durch Hinzufügen des Elements zum Set erfolgreich abgeschlossen. Welche Interpretation richtig ist, ist willkürlich. Die weniger willkürliche Definition von Erfolg stammt aus der Sprache: Die Methode ist erfolgreich, wenn sie normal zurückgibt.firstLessThanSecond(int l, int r)
und sie zurückgibt,true
wennl > r
oderfalse
wennl <= r
, dann ist diese Methode nicht erfolgreich, obwohl sie normal zurückgibt.add
ist eine strenge Abkürzung des Vertrages. Die Dokumentation beginnt mit "Fügt das angegebene Element zu dieser Gruppe hinzu, falls es noch nicht vorhanden ist". Dies ist zufriedenstellend, unabhängig davon, ob das Element bereits in der Gruppe enthalten war. Sie können den Rückgabewert frei interpretieren, aber letztendlich ist es nur Ihre Interpretation. In Ihrem zweiten Beispiel wertet die Methode aus, ob eine Bedingung erfüllt ist. Wenn die Bedingung falsch ist, ist die Methode sicherlich nicht fehlgeschlagen, da sie die Bedingung erfolgreich ausgewertet hat.Ich würde sagen, es ist sehr C-like. Die meiste Zeit würde ich es vorziehen, eine beschreibend benannte Variable für ein Mutationsergebnis zu haben, und keine Mutation, die in einer auftritt
if
Bedingung auftritt.Ein Compiler entfernt diese Variable, wenn sie sofort wiederverwendet wird. Ein Mensch wird es leichter haben, die Quelle zu lesen. Für mich ist es wichtiger.
Sollte jemand die Bedingung durch Hinzufügen einer
and
/or
-Klausel zur if-Bedingung erweitern müssen, kann dies dazu führen, dass er.add()
in bestimmten Fällen aufgrund einer Kurzschlussbewertung nicht anruft . Wenn nicht ausdrücklich ein Kurzschluss erwartet wird, kann dies zu einem Fehler führen.quelle
if (set.contains(entry)){set.add(entry); //do more stuff}
wird das auch vom Compiler beseitigt?contains
undadd
. Außerdem erledigt es die doppelte Arbeit,entry
im Set nachzuschauen. Dies kann bei sehr großen Sets und sehr leichten Loops eine Rolle spielen.if (set.contains(entry)){set.add(entry); //do more stuff}
sondern z. B. mit Karl Bielefeldts Antwort gehen?Ihr Code scheint die Trennung von Befehlsabfragen zu unterbrechen . Dies wird im Clean Code-Buch und im Funktionsstruktur- Video erläutert . Aus der Perspektive von Clean Code denke ich, dass dies nicht als guter Stil angesehen wird.
Für mich ist die Absicht Ihres Codes unklar. Wird das if both ausgeführt, wenn der Eintrag erfolgreich hinzugefügt wurde oder auch wenn er bereits vorhanden ist? Was kehrt
add()
zurück? der Gegenstand? Der Fehlercode?quelle
if (set.contains(entry)){set.add(entry); //do more stuff}
was irgendwie albern erscheint. Wie sehen Sie das?Collection
Codeüberprüfung durchführt , die API kennt .