Wenn wir params in eine lokale var in einer Aktion zwischenspeichern, wird es helfen, oder ist es das gleiche?

StackOverflow https://stackoverflow.com/questions/1164472

Frage

So führen wir ein Codequalität Tool namens rejek hin und wieder als Teil unserer Projekt. Das Werkzeug sieht grundsätzlich für Code riecht und meldet sie. Hier haben wir festgestellt, dass wir „Vervielfältigung“ Geruch jedes Mal, wenn wir versuchen, bekommen einen Schlüssel in params für den Zugriff auf mehr als einmal (als ob wir ein Verfahren-Aufruf zweimal mit gleichen Parametern zu machen oder wir sind ein, wenn die Bedingung etc Duplizieren). Allerdings params ist nur ein Hash, nicht wahr? Andere Hashes nicht bekommen, Vervielfältigung Geruch, wenn ihre Schlüssel zugegriffen werden mehr als einmal.

Warum ist das so? Was genau params? Ist es sinnvoll params in einer lokalen Variablen zwischenzuspeichern dann sie verwenden? Wird es sein die gleiche helfen oder? Oder gibt es etwas falsch mit dem Werkzeug? Hilfe!

War es hilfreich?

Lösung

Mit der aktuellen Version ist es am besten Reek läuft nur auf Ihren app / model Ordner, weil es Fehlalarme gegen Ansichten und Controller erhöht.

params ist eine Art von DTO (Datentransferobjekt) in der Nähe der Systemgrenze, und so sollten seine Eigenschaften anders als regulärer Code. Aber Reek weiß nicht, dass (noch) nicht. Ich plane Reek in naher Zukunft zu verbessern, damit es besser spielt mit Rails. Vorerst aber Ihre beste Wette ist es bei app / models (und vielleicht app / Helfer und lib).

auf der Suche zu beschränken

Andere Tipps

params ist ein Methodenaufruf, der eine @params ||= @request.params tut

Es könnte sein, dass es denkt, params ist ein kompliziertes Verfahren, so dass es Sie will es in einer Variablen, um zu versuchen und zwischenzuspeichern, aber glaube nicht, dass es wert wäre es vor allem, da es memoized wird (basierend auf meiner rack_process.rb aus Rails 2.2)

params[:foo] ist eine Methode-Aufruf Hash#[], so stinken korrekt ist. Ich bin nicht vertraut mit stinken, also kann ich nicht sagen, warum andere Hash-Zugriffe das gleiche werden nicht gezählt. Hash#[] sollte schnell genug sein, dass Sie es nicht in einer lokalen Variablen speichern müssen, wenn Sie in einem sehr leistungskritischen Teil des Codes sind.

Der einzige Unterschied zwischen dem params Hash und einer regelmäßigen Hash ist, dass es with_indifferent_access verwendet, dh Sie können eine beliebige Taste mit einem String oder ein Symbol zugreifen können.

Ich glaube, jedes Mal, wenn params nennen, da ein Initialisierungsschritt ist die Methodenaufrufe generiert, nehme ich Sie versuchen können, eine params Erstellung und Überprüfung Anzahl der Anrufe. dies könnte blinde Vermutung. : -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top