主页 > 知识库 > 网络编程 > Ruby >

Ruby 编程风格介绍(3)

来源:ruby-china 作者:网络 发表于:2012-06-20 09:50  点击:
do...end 。不在链式调用时使用 do...end 。 names = [Bozhidar, Steve, Sarah]# 好的names.each { |name| puts name }# 不好的names.each do |name| puts nameend# 好的names.select { |name| name.start_with?(S)
do...end。不在链式调用时使用do...end
names = ["Bozhidar", "Steve", "Sarah"]

# 好的
names.each { |name| puts name }

# 不好的
names.each do |name|
  puts name
end

# 好的
names.select { |name| name.start_with?("S") }.map { |name| name.upcase }

# 不好的
names.select do |name|
  name.start_with?("S")
end.map { |name| name.upcase }
有些人可能认为在跨行进行链式调用时使用{...}是可行的,但是他们需要问问自己的是 - 这样的代码是否真的具有良好的可读性 and can't the blocks contents be extracted into nifty methods。
  • 在不必要的情况下,避免显示的使用return进行返回。
    # 不好的
    def some_method(some_arr)
      return some_arr.size
    end
    
    # 好的
    def some_method(some_arr)
      some_arr.size
    end
    
  • 在设置具有默认值的参数时,在=两边添加空格。
    # 不好的
    def some_method(arg1=:default, arg2=nil, arg3=[])
      # do something...
    end
    
    # 好的
    def some_method(arg1 = :default, arg2 = nil, arg3 = [])
      # do something...
    end
    
    有些Ruby书籍提倡使用第一种风格,但是第二种在实际使用时往往具表现得更好(有些证据可以证明它们具有更好的可读性)。
  • 在不必要的情况下,不使用行连接符(\),实际上,在任何情况下都不需要使用它们。
    # 不好的
    result = 1 - \
             2
    
    # 好的(但其实还是很糟糕)
    result = 1 \
             - 2
    
  • 使用=(赋值符号)的返回作为表达式的值是可以的,但是记得在记得在两边加上括号。
    # 好的 - 表明了赋值的意图
    if (v = array.grep(/foo/)) ...
    
    # 不好的
    if v = array.grep(/foo/) ...
    
    # 好的 - 不仅表明了赋值,还表明了正确的优先级
    if (v = self.next_value) == "hello" ...
    
  • 尽可能的使用||=来初始化变量。
    # 如果name的值为nil或false,则将name的值设为Bozhidar,否则将name的值设为name本身的值(即不进行赋值)。
    name ||= 'Bozhidar'
    
  • 不要在初始化布尔型变量时使用||=(想想如果变量本身的值是false是会是什么情况)。
    # 不好的 - 会将enabled设为true,即使enabled本身的值是false。
    enabled ||= true
    
    # 好的
    enabled = true if enabled.nil?
    
  • 避免使用Perl风格的特殊变量(如$0-9$`等)。它们看起来很神秘,不鼓励在除了单行脚本以外的地方使用它们。
  • 在调用方法时,永远不要在方法名和开括号之间添加空格。
    # 不好的
    f (3 + 2) + 1
    
    # 好的
    f(3 + 2) + 1
    
  • 如果方法的第一个参数以开括号打头,则在调用时总是使用括号包裹全部参数,如f((3 + 2) + 1)
  • 在使用Ruby解释器时总是为其添加-w参数,它可以提醒你以上的规则!
  • 当Hash的键为Symbol时,使用Ruby 1.9的字面量语法来表示。
    # 不好的
    hash = { :one => 1, :two => 2 }
    
    # 好的
    hash = { one: 1, two: 2 }
    
  • 使用最新的lambda字面量语法。
    # 不好的
    lambda = lambda { |a, b| a + b }
    lambda.call(1, 2)
    
    # 好的
    lambda = ->(a, b) { a + b }
    lambda.(1, 2)
    
  • 使用_来表示无用的代码块参数。
    # 不好的
    result = hash.map { |k, v| v + 1 }
    
    # 好的
    result = hash.map { |_, v| v + 1 }
    
  • 命名

    The only real difficulties in programming are cache invalidation and
    naming things.
    -- Phil Karlton
    • 方法及变量名使用诸如snake_case的形式。
    • 类及模块名使用诸如CamelCase的形式(保持HTTP,RFC,XML等采用首字母缩写表示的单词为全部大写的形式)。
    • 其它常量名使用诸如SCREAMING_SNAKE_CASE的形式。
    • 在表示断言的方法名(返回真或者假)的末尾添加一个问号(如Array#empty?)。
    • 可能会造成潜在“危险”的方法名(如修改self或者在原处修改变量的方法,exit!等)应该在末尾添加一个感叹号。
    • 在较短的代码块中使用reduce时,为其参数起名为|a, e|()When using reduce with short blocks, name the arguments |a, e| (accumulator, element)。
    • 在定义二元操作符方法时,将其的参数取名为other
      def +(other)
        # body omitted
      end
      
    • map优先于collectfind优先于detectselect优先于find_all
      reduce优先于injectsize优先于length。以上的规则并不绝定,如果
      使用后者能提高代码的可读性,那么尽管使用它们。押韵的方法名(如collect
      detectinject)继承于SmallTalk语言,它们在其它语言中并不是很通用。
      鼓励使用select

    有帮助
    (0)
    0%
    没帮助
    (0)
    0%