类 (Classes)

类 (Classes)

  • 避免使用类变量(@@),
    因为在继承的时候它们会有 “淘气” 的行为。
    [link]
  class Parent
    @@class_var = 'parent'

    def self.print_class_var
      puts @@class_var
    end
  end

  class Child < Parent
    @@class_var = 'child'
  end

  Parent.print_class_var #  => 会输出"child"

你可以看到在这个类的继承层级了,所有的类都共享一个类变量。 尽量使用实例变量而不是类变量。

  • 用 def self.method 来定义单例方法(singleton
    methods). 这样在需要改类名的时候更方便.
    [link]
  class TestClass
    #  错误
    def TestClass.some_method
      ...
    end

    #  正确
    def self.some_other_method
      ...
    end
  • 除非必要,避免写 class << self,
    必要的情况比如 single accessors 和 aliased attributes。
    [link]
  class TestClass
    #  错误
    class << self
      def first_method
        ...
      end

      def second_method_etc
        ...
      end
    end

    #  正确
    class << self
      attr_accessor :per_page
      alias_method :nwo, :find_by_name_with_owner
    end

    def self.first_method
      ...
    end

    def self.second_method_etc
      ...
    end
  end
  • public, protected, private 它们和方法定义保持相同缩进。 并且上下各留一个空行。[link]
  class SomeClass
    def public_method
      #  ...
    end

    private

    def private_method
      #  ...
    end
  end