2009-07-22 8 views
2

プロジェクトの一環として、reekというコード品質ツールをしばらく実行します。このツールは基本的にコードの匂いを探して報告します。ここでは、paramsのキーに複数回アクセスしようとするたびに、「Duplication」という匂いが出ることがわかりました(同じパラメータでメソッド呼び出しを2回行っているか、if条件などを複製しているかのように)。ただし、paramsHashです。それらのキーに複数回アクセスすると、他のハッシュは重複の匂いを受けません。paramsをアクション内のローカル変数にキャッシュすると、それは役に立ちますか?

これはなぜですか? paramsとは何ですか?ローカル変数にparamsをキャッシュして使用するのは意味がありますか?それが助けられるか、それとも同じでしょうか?または、ツールに何か問題がありますか?助けて!

答えて

3

現在のバージョンでは、ビューとコントローラに対して偽陽性を引き起こすので、Reekをapp/modelsフォルダでのみ実行することをお勧めします。

paramsはシステム境界に近いDTO(データ転送オブジェクト)の一種であり、その特性は通常のコードとは異なるはずです。しかし、リークはそれを知らない(まだ)。 Reekを近い将来に改良して、Railsでうまくいくように計画しています。今のところ、あなたの最善の策は、アプリケーション/モデル(とapp/helpersとlib)を見ることに制限することです。

0

params[:foo]は、Hash#[]へのメソッド呼び出しであり、正しいことが正しいです。私は嫌なことに慣れていないので、なぜ他のハッシュアクセスが同じに数えられないのか分からない。 Hash#[]は、コードのパフォーマンスにとって非常に重要な部分でない限り、ローカル変数に格納する必要はありません。

ハッシュと通常のハッシュの唯一の違いは、with_indifferent_accessを使用していることです。つまり、文字列または記号で任意のキーにアクセスできます。

2

paramsがないメソッド呼び出しです@params ||= @request.params

それはそれはあなたがしようとすると変数にキャッシュすることを望んでいるので、複雑な方法がされparamsは考えていること、しかし、それは価値があるだろうと思ういけないかもしれません特にそれがメモされているからです(Rails 2.2の私のrack_process.rbをベースにしています)

+0

ありがとうオマール。 Kevinが指摘したように、paramsはDTOの一種であり、他のオブジェクトとは異なり、Reekはそれをまだ知りません。 – Chirantan

0

私はあなたがparamsを呼び出すたびに、メソッド呼び出しを生成する初期化ステップがあると信じています。あなたはparamsを作成し、呼び出し回数を調べることができます。 これは盲目的な推測かもしれません。 :-)

関連する問題