0

我正在创建一个包含一些模型、控制器和视图组件的 gem。我需要为它模拟像 mvc 模式这样的导轨。我想到了两个选项,我需要从中选择一个。以下代码是对问题的更简单提取。

模式1

项目/模型.rb

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

项目/控制器.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

项目/模型.rb

class Model
  def name
    'Mr. Model'
  end
end

项目/控制器.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

项目/application_controller.rb

module Application
  module Namespace
    class ApplicationController
    end
  end
end

项目/active_model.rb

module Application
  module Namespace
    class ActiveModel
    end
  end
end

项目/模型.rb

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

项目/控制器.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 回答
0

在这种情况下,使用 Rails 引擎可能会更好。它将为您正确命名事物。

https://guides.rubyonrails.org/engines.html

于 2019-11-25T22:43:10.297 回答