[解決済み】RailsでOOデザイン。どこにものを置くか
質問
私はRailsをとても楽しんでいて(一般的にRESTlessですが)、RubyがとてもOOであることを楽しんでいます。それでも、巨大なActiveRecordのサブクラスや巨大なコントローラを作る傾向はごく自然なことです(リソースごとにコントローラを使うとしても)。もし、より深いオブジェクトの世界を作るとしたら、クラス(とモジュール、でしょうか)はどこに置くのでしょうか?ビュー(ヘルパー自体にも?)、コントローラ、モデルについて聞いています。
Libは大丈夫で、私が見つけたのは 開発環境でリロードさせるための解決策をいくつか紹介します。 でも、もっといい方法があったら教えてほしいです。クラスが大きくなりすぎるのが本当に心配なんです。また、Engineについてはどうでしょうか、どのようにフィットするのでしょうか?
どのように解決するのか?
RailsはMVCという構造を提供しているので、最終的には自然に のみ モデル、ビュー、コントローラのコンテナが提供されています。初心者(そして一部の中級者)の典型的なイディオムは、アプリ内のすべてのロジックをモデル(データベースクラス)、コントローラ、またはビューに詰め込むというものです。
ある時、誰かが「fat-model, skinny-controller" パラダイム」を指摘すると、中級開発者は急いでコントローラから全てを取り出してモデルに放り込み、アプリケーションロジックの新しいゴミ箱となり始めます。
スキニーコントローラーは、実際、良いアイデアなのですが、その逆で、すべてをモデルに入れるのは、実はベストなプランではないのです。
Rubyでは、物事をよりモジュール化するために、いくつかの良いオプションがあります。かなりポピュラーなのは、モジュールを使うことです。
lib
メソッドのグループを保持し、そのモジュールを適切なクラスに含めます。これは、複数のクラスで再利用したい機能のカテゴリがあり、その機能がまだ概念的にクラスと結びついている場合に役立ちます。
モジュールをクラスに取り込むと、そのメソッドはクラスのインスタンスメソッドになるので、結局は トン のメソッドが、複数のファイルにうまく整理されているだけです。
この解決策は、ある場合にはうまくいくのですが、他の場合には、コード内で ではなく モデル、ビュー、コントローラのいずれかを使用します。
このことを考える良い方法は、「単一責任の原則」(quot;single responsibility principle)で、クラスは単一(または少数)の事柄に責任を持つべきであるというものです。モデルは、アプリケーションからデータベースへのデータの永続化に責任を持ちます。コントローラは、リクエストを受け取り、実行可能なレスポンスを返すことに責任を持ちます。
これらのボックスにうまく収まらない概念(永続性、リクエスト/レスポンス管理)がある場合は、おそらく する をモデル化します。モデル化しないクラスは app/classes や他の場所に保存し、そのディレクトリをロードパスに追加することで実行できます。
config.load_paths << File.join(Rails.root, "app", "classes")
passenger や JRuby を使用している場合は、イーガー・ロード・パスにあなたのパスを追加することも必要でしょう。
config.eager_load_paths << File.join(Rails.root, "app", "classes")
要するに、Railsでこの質問をするようになったら、Rubyのスキルを上げて、Railsがデフォルトで提供するMVCクラスだけではないクラスのモデリングを始める時期が来たということです。
更新しました。 この回答は、Rails 2.x以降に適用されます。
関連
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Ruby/RailsでHashからキーを削除して残りのHashを取得する方法は?
-
[解決済み] Railsで404にリダイレクトする方法とは?
-
[解決済み] Railsのscaffoldingを元に戻す
-
[解決済み] Rails 3.1 を使用して、「ページ固有」の JavaScript コードをどこに置くか?
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コレクションをDESCで並べる方法
-
[解決済み】Webpacker::Manifest::MissingEntryError【クローズド
-
[解決済み] Rubyの文字列から日付への変換
-
[解決済み] rake db:migrateを使って1ステップだけロールバックする方法
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] DestroyとDeleteの違い
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] Devise Admin Roleの追加【終了しました
-
[解決済み] Railsでグループとカウント
-
[解決済み] ActionController::RoutingError: 初期化されていない定数MicropostsController