0

我有以下型号:

module Core
  class Conditioner
    include Mongoid::Document

    field :operator, type: String, default: '' # can be !=, ==, <, >, <=, >=, =
  end
end

module Core
  class Count < Conditioner
    field :threshold, type: Integer, default: 0 # a simple threshold
  end
end

module Core
  class Time < Conditioner
    UNITS = %w(seconds minutes hours days weeks months years)

    # will be use like this: Time.value.send(Time.unit) Ex: 3.minutes
    field :value, type: Integer, default: 0    # 3
    field :unit,  type: String,  default: ''   # minutes

    validates :unit,  presence: true, inclusion: { in: UNITS }
  end
end

想知道我是否应该使用命名空间CountTimeConditioner?像这样:

module Core
  class Conditioner::Time < Conditioner
  end
end

Time.now既然我现在必须这样打电话::Time.now

编辑

关于答案,也许这应该是一个更好的主意:

module Core
  module Conditioner
    class Base
    end
  end
end

module Core
  module Conditioner
    class Count < Conditioner::Base
    end
  end
end

module Core
  module Conditioner
    class Time < Conditioner::Base
    end
  end
end

由于定义一个名为的类Core::Time可能过于通用并且没有多大意义。

你怎么看?不确定这里的最佳实践。

4

3 回答 3

1

您不必为它命名,但如果您愿意,您可以。

您是否应该或不应该取决于您要建模的内容(而不是您是否必须使用 ::Time 来处理 Time ......)。看起来您的 Core::Time 已经是 Core::Conditioner 的子类,因此将其作为超类的内部类没有多大意义。在您的情况下,最好不要命名它。

与 ruby​​ 具有相同的类名在这里不是问题,因为您已经使用 Core 对其进行了命名空间。

于 2013-08-14T07:57:05.250 回答
0

在我看来,不要使用 Ruby 或 Rails 使用过的类名,这可能是个问题。每次使用时都必须小心。我认为这是不必要的。除非您有许多模型需要维护,否则不要使用命名空间。保持简单,维护会更容易:)

于 2013-08-14T07:37:14.580 回答
0

Conditioner您通过添加前缀来更改的唯一一件事Time是模块的常量查找在查找Core时不会看到您的Conditioner::TimeTime。所有其他类 ( Count, Conditioner) 仍会认为Conditioner::Time正在取代Time

module Core
  def time
    Time.now
  end
  class Conditioner
    def time
      Time.now
    end
  end
end

module Core
  class Count < Conditioner
    def time
      Time.now
    end
  end
end

module Core
  class Conditioner::Time < Conditioner
    def time
      Time.now
    end
  end
end

任何类似的电话Core::Count.new.time都会失败,但是

class A
  include Core
end

A.new.time将输出当前时间,而在这种情况下:

module Core
  def time
    Time.now
  end
  class Conditioner
    def time
      Time.now
    end
  end
end

module Core
  class Count < Conditioner
    def time
      Time.now
    end
  end
end

module Core
  class Time < Conditioner
    def time
      Time.now
    end
  end
end

class A
  include Core
end

A.new.time也会失败。现在,原因相当简单:常量查找总是查找当前命名空间 ( Core) 中可用的常量,然后爬上当前命名空间的祖先链,然后再查找Object(Time也可以称为命名空间Object::Time。 '不要在子命名空间中搜索(您通过放置Conditioner::before创建Time),这就是为什么将您的类重命名TimeConditioner::Time仅更改Core模块的查找,而不更改Core.

因此,在这种情况下寻求最佳实践:只需将其留在调用您的课程Time并引用Object::Timeby ::Time。这是一种众所周知的做法,避免使用额外命名空间的好处是微不足道的。

于 2013-08-14T07:55:02.243 回答