Ruby:安排更大的类/文件

时间:2014-09-06 19:34:41

标签: ruby

我知道ruby类文件通常应该很小,但有时候我会在类中找到逻辑(a)并不真正保证自己的文件,但是(b)如果我可以将它们分组则更具可读性不知。

例如,在某些类中,我可能有(比方说)10种确定路径的方法。目前,我倾向于在它们周围添加几行装饰性的“### PATHS ###”类型注释,以区别于其他组。我想知道是否有更好的方法(?)

我是否正确地认为在类中实现子类/模块只是为了提高可读性有点过分,或者其他人是否这样做?任何其他的想法赞赏。

2 个答案:

答案 0 :(得分:2)

也许他们保证他们自己的文件 - 思考单一责任原则。由于您还没有向我们展示任何代码,因此这里有一个处理对象路径的单独类的想法:

class FooPaths
  def initialize(foo)
    @foo = foo
  end

  def path_one
     # code to calculate path using @foo
  end

  def path_two
    #code to calculate another path using @foo
  end
end

这个想法是你的班级Foo可能做了太多事情。创建在初始化程序中接受@foo的较小的类,然后该较小的类可以处理涉及Foo的较小的操作子集。它也更容易测试。

答案 1 :(得分:0)

当我有一堆类似的辅助方法时,这意味着两件事之一。

  1. 我有一个需要定义的业务概念(读取:对象)
  2. 我有一堆以类似方式行事的商业概念。
  3. 对于第一种情况,通常,传递给方法的第一个参数是业务概念的名称

    class User < ActiveRecord::Base
      # active record attributes :first_name, :last_name
    
      def self.full_name(first_name, last_name)
        [first_name, last_name].compact.join(" ") 
      end
    
      def self.extract_first_name(full_name)
        full_name.split.first
      end
    end
    

    所以我会为full_name创建一个概念:

    class User << ActiveRecord::Base
      # active record attributes :first_name, :last_name
      def full_name
        FullName.from_parts(first_name, last_name)
      end
    
      def full_name=(val)
        if val
          self.first_name, self_last_name = val.partsfirst_name, val.last_name
        else
          self.first_name = self.last_name = nil
        end
      end
    end
    
    class FullName
      attr_accessor :first_name, :last_name
      def to_s
        parts.join(" ") 
      end
    
      def parts
        [first_name, last_name].compact
      end
    
      def eq(other)
        to_s.eq(other)
      end
    
      def self.from_parts(first_name, last_name)
        # [...]
      end
      def self.from_full_name(full_name)
        # [...]
      end
    end
    

    我知道这个例子是人为的,但我发现很多观点逻辑和帮助者围绕着这个概念。因此,如果您最终找到可以带入其中的更多概念,或者您注意到您经常将这些概念分组传递,那么它就是一个很好的候选者。此外,如果您与业务用户围绕用户的全名进行了多次对话,那么这就是说您想要一个业务概念。

    对于第二种情况,有时您希望将“相同”属性添加到一堆不同的业务对象中。它们碰巧以不同的方式计算。章节书和字典的路径是不同的。介绍章节书和字典的概念,两者都有路径参数。如上所述,如果您发现自己经常不与用户一起使用这些商业概念,那么这可能不是正确的方法。