0

モデル、コントローラー、およびビュー コンポーネントを含む 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

まだいくつかの明るいアイデアを探しています。

4

2 に答える 2

2

FWIW、これを書き直すことができます

module Application
  module Namespace
    class Model
      def name
        'Mr. Model'
      end
    end
  end
end

これに

# do this once
module Application
  module Namespace
  end
end

class Application::Namespace::Model
  def name
    'Mr. Model'
  end
end

主観的な「醜さ」を取り除きませんか?

于 2013-03-20T07:51:39.080 に答える