【问题标题】:Using Sinatra and DataMapper, are classes one and the same?使用 Sinatra 和 DataMapper,类是否相同?
【发布时间】:2015-02-26 20:58:13
【问题描述】:

在 sinatra 应用程序中为数据映射器声明类时,我知道它看起来像这样:

class Thing
  include DataMapper::Resource

  property :id,     Serial
  property :name,   String
  property :num,    Integer
end

如果这不是一个网络应用程序,而只是桌面 ruby​​ 程序,你可能会这样做:

class Thing
  def initialize(name, num)
    @name = name
    @num = num
  end
  def doTheThing(num)
    num * 2
  end
end

那么这样做有意义吗...

class Thing
  include DataMapper::Resource

  property :id,     Serial
  property :name,   String
  property :num,    Integer

  def initialize(name, num)
    @name = name
    @num = num
  end
  def doTheThing(num)
    num * 2
  end
end

(编辑)忘了我的问题:这有效吗?我在这里错过的任何意见或事情?谢谢!

我目前正在处理我的第一个半大型 sinatra 项目,希望能得到帮助。

在相关说明中,任何关于学习代码的好示例(sinatra/ruby 网络应用程序等)的建议都将不胜感激!

谢谢!

【问题讨论】:

  • 你的问题有点模糊。更愿意提出相当具体的问题。询问一般提示或示例通常是不受欢迎的。试着解释你想做什么,你尝试过什么,以及这种尝试如何没有满足你的期望。

标签: ruby class sinatra datamapper


【解决方案1】:

您提供的不同实现与 Sinatra 或 Web 或桌面应用程序没有本质上的关系。桌面应用可以使用 Datamapper 来持久化对象,而 Sinatra 应用可以使用任何类型的普通旧 Ruby 对象。

也就是说,第三个实现可能会导致问题。原因是 DataMapper::Resource defines a method called initialize 然后你用你自己的版本覆盖它。

模型类包含您自己编写的其他方法并不少见。例如,这些可以封装某种基于持久属性的业务逻辑。

所以试着回答你的问题:你所有的课程都是有效的,但最后一个可能不是很明智。

【讨论】:

  • 感谢您的回答 - 非常模糊。所以你是说除了initialize,这个类会像一个普通的ruby类?
  • 一个普通的ruby类。 所有您的课程都是常规的 ruby​​ 课程。混入一个模块不会使您的课程与普通的 ruby​​ 课程不同。覆盖initialize 不会让你的类变得不那么“常规”,但由于包含的模块还定义了initialize,你可能会因为覆盖它而遇到意外行为。例如,模块中的其他代码段可能依赖于 initialize 的特定实现,但我不确定。
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2011-01-18
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多