3 Stimmen

Vermeiden Sie es, nach nil zu überprüfen, wenn Sie auf ein Unterelement zugreifen.

Dies ist vielleicht ein eher kosmetisches Problem, aber ich finde es wirklich ärgerlich, da ich immer mit hässlichem Code enden. Und Lesbarkeit ist immer wichtig, nicht wahr?

Ich möchte überprüfen, ob ein Wert in einem Hash innerhalb eines Hashs existiert. Also mache ich das hier.

already_exists_data[:data][:user_id]

Aber das kann eine Nullpointer-Ausnahme auslösen, wenn :data nil ist, und das Überprüfen von :data könnte eine Nullpointer-Ausnahme auslösen, wenn already_exists_data nil ist. Also lande ich am Ende damit:

if already_exists_data && already_exists_data[:data] && already_exists_data[:data][:user_id]
    # Mach etwas
end

Das ist jetzt ziemlich unschöner Code. Vielleicht sollte ich den Hash in ein Objekt ändern. Aber manchmal stoße ich auf dieses Problem und frage mich, wie ihr damit umgeht.

Ich programmiere derzeit in Ruby, hatte aber dieses Problem auch bei mehreren anderen Sprachen.

2voto

Hans Lub Punkte 5333

Wenn ich meinen Butler bitte, die Schachtel Pralinen auf dem Esstisch in der Victoria Street 34 abzuholen, bitte ich ihn nur darum. Ich will nicht sagen: Geh und finde die Victoria Street, und wenn du sie findest, suche bitte nach der Nummer 34, und wenn du sie findest ...

Ich kann das tun, weil er seine eigenen Fehler bemerkt: Wenn er die Straße nicht findet, kommt er einfach mit leeren Händen zurück.

Daher sollten Sie ein try mit einem leeren Ausnahmehandler verwenden. In Pseudocode:

try {chocolates = streets("Victoria")(34)("Esszimmer")("Tisch")}

In Sprachen (wie z.B. ruby), in denen Blöcke Ausdrücke sind, könnten Sie schreiben:

if try {already_exists_data(data)(user_id)}

do_stuff

Die Sprache selbst kann auch helfen: In perl ist $streets{Victoria}[34]{Esszimmer}{Tisch} undefiniert, wenn z.B. $streets es ist. Natürlich kann Ihr Butler jahrelang mit leeren Händen nach Hause kommen, bevor Sie feststellen, dass die Adresse falsch ist. Die try-Block-Lösung - und Ihr if .. && .... - haben den gleichen Nachteil: Verwenden Sie sie nur, wenn es Ihnen wirklich egal ist, ob die Victoria Street eine Nummer 34 hat oder nicht.

1voto

mindas Punkte 25933

Sprachenunabhängige Lösung: Verwenden Sie niemals Nullen. Erzwingen Sie diese Regel in all Ihren Projekten. Wenn Sie unbedingt müssen, umwickeln Sie sie in Entweder/Optional, was die Klarheit erhöht. Einige Sprachen, wie Scala, haben die Idee von Optional bereits eingebaut.

Java-spezifische Lösung: Wenn Sie Nullen verwenden müssen, kennzeichnen Sie Methodenargumente und Rückgabewerte mit @Nullable und @Nonnull. Anständige IDEs (wie IntelliJ) sind in der Lage, Ihren Code zu analysieren und mögliche null-Dereferenzierungen hervorzuheben, wenn ein Wert von einer solchen Methode abgerufen wird.

1voto

Attila Punkte 27065

Eine weitere Möglichkeit besteht darin, den Zugriff auf den Hash mit einem Funktionsaufruf zu umschließen und die "schmutzige" Arbeit innerhalb der Funktion zu erledigen. Dann sieht Ihr Code etwa wie folgt aus (Pseudocode-Syntax):

accessHash(bereits_vorhandene_daten, daten, benutzerid)

Hinweis: Sie können kreativ werden beim Zugriff auf verschachtelte Hashes basierend auf der Anzahl der Parameter, die an die Wrapper-Funktion übergeben werden, damit es in mehreren Situationen funktioniert.

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