2011-06-24 5 views
36

Railsヘルパーがコントローラのインスタンス変数を使用するべきではなく、関数のパラメータなどの変数を受け取るべきであるというアイデアをサポートする特定のプログラミングの原則(Demeter?)があるのでしょうか?たとえば、私のChickensController#squawkアクションが@eggというインスタンス変数を作成すると仮定します。さらに、squawkビューはそうのように実装cockadoodledooと呼ばれるヘルパーへの呼び出し、含まれているとします。ビューは​​を呼び出すように、パラメータとして@eggを渡すためにRailsヘルパーは、インスタンス変数が存在すると仮定するか、パラメータを受け取るべきですか?

def cockadoodledoo 
    @egg.to_s 
end 

はそれが良いか、不必要に冗長になるだろうをし、ヘルパーのための似ているように:私はあなたの1が幸せを願って、ハッカー

def cockadoodledoo(egg) 
    egg.to_s 
end 

は答えを主張するために金曜日の午後に十分に退屈しています。 Cockadoodledoo!

This question here is similar, but was never accurately answered.

+0

多くの素晴らしい回答と唯一のチェックマークがあります....ありがとうございます。 – ybakos

答えて

29

はPARAMとしてそれらを受信します。それ以外の場合は、アプリケーションが大きくなるにつれて、リファクタリング、トラブルシューティングなどの際にインスタンス変数が設定されている場所をトレースすることが非常に困難になります。

また、初期のビュー内でのみインスタンス変数を使用するのが一般的なベストプラクティスですtemplate ...そこから、varをヘルパーや他の部分に渡すべきです。私はあなたが常に2つの理由のためにあなたのヘルパーに明示的に変数を渡す必要があるでしょうね

+0

このベストプラクティスのどこに言及しているのか、その名前は何ですか? – ybakos

+2

ベストプラクティスの公開と命名は90年代です... –

+5

Fabio、私は同意しません。確かに、Art of Programmingでは厳しいルールを強制するのではなく、名前を付けることに大きな価値があります。例えば、「DRY原理」。 – ybakos

16

  • あなたは上記のすべての

  • を行い、正確に内容を制御、あなたはヘルパー

  • をテストすることができます
+3

私はテスト容易性について考えなかった。ああ、私はちょうど私のズボンを持っていた? (はい、より多くのテストを書く必要があります) – ybakos

+0

ここでヘルパーをテストする能力を向上させることが重要です。これを明示的に呼び出してくれてありがとう – kries

7

ヘルパーメッセージはすべてのコントローラに組み込まれているため、すべてのビュー(パーシャルやレイアウトを含む)で利用できるため、明確な契約を結ぶことが常に賢明です - パラメータ。

私が考えることができる唯一の例外は、インスタンス変数がメニューや同様のもののようなすべてのビューとコントローラで利用可能な場合です。

+0

なぜ例外ですか? – ybakos

+2

私はただ一つ見つけようと努力していましたが(すべてのルールには例外があります)、私はあまりにも難しいと思っていました。 –

11

この種のものを支配する名前付きの原則があるかどうかわかりませんが、私は引数を渡します。引数はヘルパーのテストを容易にするだけでなく、アプリケーションのデータフローを追跡するのが簡単になるだけでなく、単一のインスタンスとリストに対して1つのヘルパーを使用できるようになります。引数を渡す場合、両方:

<%= cockadoodledoo @egg %> 

と:予想通り

<% @eggs.each do |egg| %> 
    <%= cockadoodledoo egg %> 
<% end %> 

@eggsではなく、単一の@eggでリストを扱うことcockadoodledoo特別を導入することなく動作します。

+2

これはいくつかの自由度のある多様性のおかげです。 – ybakos

関連する問題