Si nous mettons en cache params dans un var local dans une action, il va aider ou son même?

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

Question

Nous courons un outil de qualité du code appelé puent de temps en temps dans le cadre de notre projet. L'outil semble essentiellement pour les odeurs code et les rapports. Ici, nous avons constaté que nous obtenons « Duplication » odeur chaque fois que nous essayons d'accéder à une clé dans params plus d'une fois (comme si nous faisons une méthode d'appel deux fois avec les mêmes paramètres ou nous dupliquant une condition if etc). Cependant, params est juste un Hash, non? D'autres hash ne reçoivent pas l'odeur de duplication lorsque leurs clés sont accessibles plus d'une fois.

Pourquoi est-ce donc? Qu'est-ce que sont params exactement? Est-il judicieux de mettre en cache params dans une variable locale puis les utiliser? Il va aider ou son même? Ou est-il quelque chose de mal avec l'outil? Aide!

Était-ce utile?

La solution

Avec la version actuelle, il est préférable d'exécuter Reek uniquement sur votre dossier app / modèles, car il soulève des faux positifs contre des vues et des contrôleurs.

params est une sorte de DTO (objet de transfert de données) à proximité de la limite du système, et donc ses caractéristiques devraient être différente de celle du code régulier. Mais Reek ne sait pas (encore). Je prévois d'améliorer Reek dans un proche avenir afin qu'il joue mieux avec Rails. Pour l'instant cependant, votre meilleur pari est de le limiter à regarder app / models (et peut-être app / aides et lib).

Autres conseils

params est un appel de méthode qui fait un @params ||= @request.params

Il est peut-être qu'il pense params est une méthode complexe, donc il veut que vous essayez et le cache dans une variable, mais ne pense pas que cela vaut la peine d'autant plus qu'il est memoized (basé sur mon rack_process.rb de Rails 2.2)

params[:foo] est un appel à Hash#[], de sorte reek est correct. Je ne suis pas familier avec puent, donc je ne peux pas dire pourquoi d'autres accès Hash ne sont pas comptés les mêmes. Hash#[] devrait être assez rapide que vous n'avez pas besoin de le stocker dans une variable locale, sauf si vous êtes dans une performance très partie essentielle de votre code.

La seule différence entre le Hash params et un Hash régulier est qu'il utilise with_indifferent_access, ce qui signifie que vous pouvez accéder à une touche avec une chaîne ou un symbole.

Je crois que chaque fois que vous appelez params, il y a une étape d'initialisation qui génère des appels de méthode, je suppose que vous pouvez essayer de créer un params et de vérifier le nombre d'appels. cela pourrait être guess aveugle. : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top