26

前回の質問から、 Rails はリクエストごとにコントローラー インスタンスを作成することがわかりました。

私の質問は、この主題は私が取り組んでいるプロジェクトの設計に関連しているためです。

Rails が新しいインスタンスを作成するのはなぜですか?

class SomeController < ApplicationController; end

すべての受信リクエストを処理するには? シングルトンオブジェクトを作成してリクエストをこれに転送しないのはなぜですか? リクエストに対するオブジェクトの割り当てとクリーニングにリソースを浪費しないので、これはより効率的ですか?

4

1 に答える 1

40

新しいコントローラ インスタンスをインスタンス化するオーバーヘッドはわずかであり、まったく関係のない 2 つのリクエスト間で状態が誤って共有されることはありません。プロセッサ時間の「節約」は、壊滅的なバグを生み出す可能性によって相殺される以上のものです。

コントローラーはリクエスト固有の状態を保存するためのものであることを思い出してください。@variableコントローラーを再利用するには、すべてのアクションの開始時に、設定したすべてをリセットする必要があります。そうしないと、次のようなもの@is_admin = trueが設定されてしまい、クリアされない可能性があります。あなたが実際に持ち込むであろう不自然でないバグは、はるかに微妙であり、開発者の時間を浪費するでしょう.

何もないところに最適化が見られます。何かが状態を維持し、リクエスト間でそれをリセットする必要があります。そうしないと、誤って状態が共有されるという悪夢に見舞われます。リクエスト間でコントローラ インスタンスを永続化する場合、状態を維持/リセットするジョブをより低いレベルにプッシュするだけです。その場合でも、リクエストごとに何らかの状態管理クラスの新しいインスタンスをインスタンス化することが答えになる可能性があります。コンピューターはリソースの割り当てと解放に非常に優れているため、ボトルネックであることが実際にわかるまでは心配する必要はありません。この場合、リクエストごとに新しいコントローラーをインスタンス化することは、簡単に正しい選択です。

Rails の場合、使用できること@variable = valueはコードの明快さと使いやすさの観点から大きな利点であり、リクエストが完了したときにコントローラーの各インスタンスを多かれ少なかれ破棄する必要があります。

于 2013-01-05T15:32:41.233 に答える