2010-09-17 3 views
9

Ich benutze rescue für alles, nicht nur für "Rettung" Ausnahmen. Ich meine, ich liebe einfach die Art und Weise, wie es mir die Verifizierung erspart und Daten doppelt überprüft.missbrauche ich "Rettung" für Nullkontrollen?

Zum Beispiel, sagen wir, ich habe ein Modell Item was kann oder nicht eine User haben. Dann, als ich den Namen des Eigentümers des Elements erhalten möchten, schreiben I:

item.user.name rescue "" 

statt so etwas wie

item.user.nil? ? "" : item.user.name 

es das gleiche denken lässt, da nil.name Auslöser eine Ausnahme, die ich mit "" retten , aber ich bin mir nicht sicher, ob das eine gute Praxis ist. Es macht, was ich will, und es macht es mit weniger Code, aber ... Ich weiß nicht, all diese Worte hier und da macht mich unsicher.

Ist es eine schlechte Praxis oder ist es gültig Missbrauch der rescue Schlüsselwort?

+1

Avdi Grimm argumentiert, dass "try" ist ein Code-Geruch http://devblog.avdi.org/2011/06/28/do-or-do-not-there-is-no-try/ und http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/, also ist es nicht nur so, dass es schlecht ist, sondern das was du versuchst zu tun, ist schlecht. –

+1

@AndrewGrimm keine Beziehung? – ybakos

+1

@ybakos Ich weiß es nicht, aber wir sind nicht [Brüder] (http://en.wikipedia.org/wiki/Brothers_Grimm). –

Antwort

7

Ich denke, Sie missbrauchen Rettung ein wenig, obwohl in Rails gibt es eine spezifische Methode für diese Probleme: try. Documentation

In Ihrem Fall könnte item.user.try(:name) ein netterer Ansatz sein.

+1

Eigentlich, weil er sagte, ein 'Element' könnte oder kann nicht einen' Benutzer' haben, glaube ich, dass er 'item.try (: user) .try (: name)' benötigt:] –

+1

Ich glaube nicht . Wenn er keinen Gegenstand hat, dann hast du Recht. Aber wenn der Gegenstand einen Benutzer haben kann oder nicht, ist das der ganze Punkt der Benutzung von "try", um jene Situationen zu finden, in denen "item.user" anstelle von "Benutzer" nil zurückgibt. – theIV

1

Wie in den meisten anderen Sprachen wird die Überprüfung selbst schneller ausgeführt als mit der Rettung.

3

Ich würde sagen, das ist nicht wirklich eine gute Angewohnheit. Ich habe dieses Feature in Ruby nie wirklich benutzt, da es sich anfühlt, als würde ich nur Fehlerfälle verstecken. Es ist auch erwähnenswert, dass Sie alle Ausnahmen retten, ohne irgendeine Art von erwartetem Fehler anzugeben. Es sah einfach immer so aus, als würde etwas das Debugging härter machen, als es sein müsste, obwohl ich, wie ich schon sagte, mich nie darum gekümmert habe, es selbst zu benutzen.

1

Als Alternative zu Ihrem rescue Missbrauch, überprüfen Sie die andand Edelstein. Es ist ähnlich wie die try ein anderer vorgeschlagen vorgeschlagen, aber schöner. andand können Sie sagen:

item.user.andand.name 

Der Ausdruck wird nil wenn item.usernil ist.

Verwandte Themen