モデル、コントローラー、およびビュー コンポーネントを含む gem を作成しています。レールのような mvc パターンをエミュレートする必要があります。2 つの選択肢が頭に浮かび、そのうちの 1 つを選択する必要があります。次のコードは、問題を簡単に抽出したものです。
パターン1
プロジェクト/model.rb
module Application
module Namespace
class Model
def name
'Mr. Model'
end
end
end
end
プロジェクト/controller.rb
module Application
module Namespace
class Controller
def action
Model.new.name
end
end
end
end
プロジェクト/アプリケーション.rb
require_relative 'controller'
require_relative 'model'
module Application
class Runner
def run
Namespace::Controller.new.action
end
end
end
パターン2
プロジェクト/model.rb
class Model
def name
'Mr. Model'
end
end
プロジェクト/controller.rb
class Controller
def action
Model.new.name
end
end
プロジェクト/アプリケーション.rb
module Application
module Namespace
module_eval File.read(File.expand_path '../controller.rb', __FILE__)
module_eval File.read(File.expand_path '../model.rb', __FILE__)
end
class Runner
def run
Namespace::Controller.new.action
end
end
end
irb(main):001:0> require 'project/application'
=> true
irb(main):002:0> Application::Runner.new.run
=> "Mr. Model"
どちらのパターンにも名前空間の下にモデルとコントローラーが含まれていますが、pattern1では、新しいファイルを追加するたびに、醜いモジュラー ネストを複製する必要があります。pattern2は、アプリケーションで追加のマジックを実行して、よりクリーンなモデルとコントローラーを作成します。
これらのアプローチに関する提案、または問題に対するより良い解決策があるかどうかを教えてください。とにかく mvc パターンが必要な理由などの質問は、答えるのが難しいでしょう。mvc パターンが必要であると仮定して、それをエミュレートする最もクリーンな方法は何かを考えてみましょう。
編集:
さらに考えてみると、Rails はサブクラスを使用します。これで 3 番目のパターンができました。
パターン3
project/application_controller.rb
module Application
module Namespace
class ApplicationController
end
end
end
project/active_model.rb
module Application
module Namespace
class ActiveModel
end
end
end
プロジェクト/model.rb
class Model < Application::Namespace::ActiveModel
def name
'Mr. Model'
end
end
プロジェクト/controller.rb
class Controller < Application::Namespace::ApplicationController
def action
Model.new.name
end
end
プロジェクト/アプリケーション.rb
module Application
require_relative 'active_model'
require_relative 'application_controller'
require_relative 'controller'
require_relative 'model'
class Runner
def run
Controller.new.action
end
end
end
まだいくつかの明るいアイデアを探しています。