我正在创建一个包含一些模型、控制器和视图组件的 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
仍在寻找一些更聪明的想法。