OO设计中的Rails:在哪里把东西OO设计中的Rails:在哪里把东西(OO Design in

2019-05-14 10:12发布

我真的很喜欢Rails的(尽管我通常安定),我喜欢红宝石是非常OO。 不过,趋势做出巨大的ActiveRecord子类和巨大的控制器是很自然的(即使你使用的每个资源控制器)。 如果您要创建更深的对象世界,你会在哪里把类(和模块,我想)? 我想咨询一下意见(在帮助者自己?),控制器和模型。

库是好的,我发现了一些解决方案,让它在开发环境重装 ,但我想知道是否有更好的方法来做到这一点的东西。 我真的只是关心变得太大类。 此外,他们是否适合什么引擎以及如何?

Answer 1:

由于Rails在MVC方面提供的结构,它的自然落得使用提供了您的模型,视图和控制器的容器。 对于初学者(甚至一些中间程序员)的典型成语是填满在应用中的所有逻辑到模型(数据库类),控制器,或视图。

在某些时候,有人指出“胖模型,瘦控制器”的模式,和中间开发商贸然切除一切从自己的控制器,把它扔进了模型,它开始成为一个新的垃圾桶应用程序逻辑。

瘦控制器,其实是个好主意,但推论 - 把一切在模型中,是不是真的是最好的方案。

在Ruby中,有一对夫妇为使事情更加模块化不错的选择。 一个相当普遍的回答是只使用模块(通常藏匿lib持有的方法组,然后包括模块插入适当的类)。 这有助于在您有想在多个班级重复使用的功能类案件,但如果功能上还是概念上附着的类。

记住,当你有一个模块插入一个类,方法成为类的实例方法,所以你还是落得含有一的方法的类,他们只是很好地组织成多个文件。

该解决方案可在某些情况下很好地工作-在其他情况下,你将要考虑使用你的代码, 不是模型,视图或控制器类。

想想它的一个好方法是“单一职责原则,”它说,一类应该是对事物负责一个(或少数)。 你的模型是负责从应用程序到数据库保存数据。 你的控制器负责接收请求和返回一个可行的应对。

如果您有不完全满足需要的那些箱子(持久性,请求/响应管理)的概念,你可能要想想你如何有问题的想法建模。 您可以存储非模型类在app /班,或其他任何地方,并通过这样做,目录添加到您的负载路径:

config.load_paths << File.join(Rails.root, "app", "classes")

如果您使用的乘客或JRuby中,你可能也想你的路径添加到急于负载路径:

config.eager_load_paths << File.join(Rails.root, "app", "classes")

底线是,一旦你在你发现自己问这个问题Rails的一个点,它的时间来加强你的Ruby排骨和开始建模是不只是MVC类,导轨让你默认类。

更新:这个答案适用到Rails 2.x和更高。



Answer 2:

更新 :使用关注已确认为轨道4新的默认 。

这真的取决于模块本身的性质。 我通常放置在有/文件夹的担忧控制器/模型扩展的应用程序中。

# concerns/authentication.rb
module Authentication
  ...
end    

# controllers/application_controller.rb
class ApplicationController
  include Authentication
end



# concerns/configurable.rb
module Configurable
  ...
end    

class Model 
  include Indexable
end 

# controllers/foo_controller.rb
class FooController < ApplicationController
  include Indexable
end

# controllers/bar_controller.rb
class BarController < ApplicationController
  include Indexable
end

/ lib目录是我的通用库首选。 我总是有LIB项目的命名空间,我把所有的应用程序特定库。

/lib/myapp.rb
module MyApp
  VERSION = ...
end

/lib/myapp/CacheKey.rb
/lib/myapp/somecustomlib.rb

的Ruby / Rails核心扩展通常发生在初始化配置,使库仅on Rails的自举加载一次。

/config/initializer/config.rb
/config/initializer/core_ext/string.rb
/config/initializer/core_ext/array.rb

对于可重用的代码片段,我经常创建(微)插件,这样我可以在其他项目中重复使用。

辅助文件通常保持辅助方法,有时当对象旨在由护理人员(例如表格助洗剂)一起使用的类。

这是一个非常一般的概述。 如果你想获得更加个性化的建议,请提供具体示例的更多细节。 :)



Answer 3:

...使巨大的ActiveRecord子类和巨大控制器的倾向是很自然的...

“巨大的”,是一个令人担忧的字... ;-)

如何你的控制器成为巨大的? 这件事情你应该看看:理想情况下,控制器要薄。 选择一个规则的拇指凭空,我建议,如果你经常有比说,5条或6号线的每个控制器方法(行动)的代码越多,那么你的控制器可能是太胖了。 是否有重复,可能进入一个辅助函数或过滤器? 是否有可能被推迟,下入款业务逻辑?

你的模型如何获得是巨大的? 你应该寻找方法,以减少每个类的职责是多少? 在那里,你可以提取到任何混入常见行为? 或功能区,你可以委托给助手类?

编辑:努力扩大一点,希望不是什么扭曲得太厉害...

助手:住在app/helpers和大多用来做简单的看法。 他们是控制器的具体(也可到该控制器的所有视图)或一般可用(或module ApplicationHelper在application_helper.rb)。

过滤器:假设你有代码的几个动作在同一行(很多时候,使用对象的检索params[:id]或类似)。 该复制可以完全由在类定义声明一个过滤器被第一到一个单独的方法,然后执行的动作的抽象,例如before_filter :get_object 。 见第6 ActionController的Rails的指南让声明式编程成为你的朋友。

重构模型是多一点的宗教的事情。 弟子Bob大叔会建议,例如,您遵循的五个指令SOLID 。 乔尔和杰夫可以推荐一个更,呃,“务实”的做法,虽然他们似乎是一个多一点不甘心随后。 发现,在明确界定其属性的子集操作类中的一种或多种方法是尝试可能被重构出你的ActiveRecord的派生模型的识别类的一种方式。

Rails的模型不必须的ActiveRecord :: Base的子,顺便说一句。 或者换一种说法,一个模式并不一定是一个表的模拟,甚至与存储在所有的东西。 更妙的是,只要你的名字你的文件中app/models根据Rails的约定(致电#underscore在类名找出Rails会寻找什么),Rails会发现它没有任何require S是必要的。



Answer 4:

下面是关于重构脂肪车型,似乎从“瘦控制器”哲学来产生一个优秀的博客文章:

http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/

基本消息是,使用服务类“不要从脂肪中提取的型号混入”来代替,笔者提供7个图案这样做



文章来源: OO Design in Rails: Where to put stuff