私は自分のプロジェクトのバックエンドとして MongoDB を使用していますが、後で変更することを決定した場合や、データベースなしで単体テストが簡単になる場合に備えて、プロジェクトの存続期間中は特に Mongo に依存する必要はありません。ただし、書かれているように、私のコントローラーは厳密に MongoDB に依存しています。
主にMongoDB チュートリアルから取得したもので、ファイルに次のものがありconfig/initializers/mongo.rb
ます。
MongoMapper.connection = Mongo::Connection.new('localhost')
MongoMapper.database = 'database'
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
MongoMapper.connection.connect if forked
end
end
米国の州を照会するためのコントローラーには、次のコードがあります。
class StateController < ApplicationController
def index
states = MongoMapper.connection.db('database').collection('state').find()
render :json => states
end
end
すぐにわかる問題がいくつかあります (おそらくもっとあるでしょう)。
- 前述のように、コントローラーは MongoDB に強く依存しています。
- 私は
database
MongoMapper クラスのプロパティを使用していません (コントローラーにハードコーディングされています)。 - 状態のコレクションへの参照が必要になるたびに、必ずしも HTTP エンドポイントを経由したいとは限りませんが、このオプションを利用できるようにしておきたいと思います。たとえば、サインアップ ページにユーザーが自宅の状態を選択するためのドロップダウン リストがある場合、クライアント側の jQuery.get() で状態のリストを入力する必要があるのはばかげているように思えます。サーバー側で状態をプリフェッチし、サーバー上にドロップダウンリストを作成する方が理にかなっているように思えます。
#3 については、状態のリストを必要とするビューをレンダリングし、それらを @states (または類似のもの) に保存する任意のアクション メソッドで状態をクエリすることはできますが、これは多くの重複コードになります。
カップリングを減らし、コードの再利用を増やすためにこれを設計する最良の方法は何でしょうか?