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

Ruby 编程风格介绍(5)

来源:ruby-china 作者:网络 发表于:2012-06-20 09:50  点击:
异常处理 尽量不要抑制异常被正常抛出. begin # an exception occurs hererescue SomeError # the rescue clause does absolutely nothingend 不要使用异常来代替流程控制语句. # badbegin n / drescue ZeroDivisio

异常处理

  • 尽量不要抑制异常被正常抛出.
    begin
      # an exception occurs here
    rescue SomeError
      # the rescue clause does absolutely nothing
    end
    
  • 不要使用异常来代替流程控制语句.
    # bad
    begin
      n / d
    rescue ZeroDivisionError
      puts "Cannot divide by 0!"
    end
    
    # good
    if n.zero?
      puts "Cannot divide by 0!"
    else
      n / d
    
  • 应该总是避免拦截最顶级的Exception异常类.
    # bad 
    begin
      # an exception occurs here
    rescue
      # exception handling
    end
    
    # still bad
    begin
      # an exception occurs here
    rescue Exception
      # exception handling
    end
    
  • 将更具体(或特殊的)的异常处理代码放在通用的异常处理代码之前.
    否则, 这些异常处理代码永远不会被处理.
    # bad
    begin
      # some code
    rescue Exception => e
      # some handling
    rescue StandardError => e
      # some handling
    end
    
    # good
    begin
      # some code
    rescue StandardError => e
      # some handling
    rescue Exception => e
      # some handling
    end
    
  • 使用ensure语句, 来确保总是执行一些特地的操作.
    f = File.open("testfile")
    begin
      # .. process
    rescue
      # .. handle error
    ensure
      f.close unless f.nil?
    end
    
  • 除非必要, 尽可能使用Ruby现有的异常类. (而不是总派生自己的异常类)

集合

  • 总是使用%w的方式来定义字符串数组.(译者注: w表示英文单词word, 而且定义之间千万不能有逗号)
    # bad
    STATES = ['draft', 'open', 'closed']
    
    # good
    STATES = %w(draft open closed)
    
  • 避免直接引用靠后的数组元素, 这样隐式的之前的元素都被赋值为nil.
    arr = []
    arr[100] = 1 # now you have an array with lots of nils
    
  • 如果要确保元素唯一, 则使用Set代替Array.Set更适合于无顺序的, 并且元素唯一的集合, 集合具有类似于数组一致性操作以及哈希的快速查找.
  • 尽可能使用hash代替字符串作为哈希键.
    # bad
    hash = { 'one' => 1, 'two' => 2, 'three' => 3 }
    
    # good
    hash = { one: 1, two: 2, three: 3 }
    
  • 避免使用易变对象作为哈希键.
  • 应该尽可能的使用Ruby1.9的新哈希语法.
    # bad
    hash = { :one => 1, :two => 2, :three => 3 }
    
    # good
    hash = { one: 1, two: 2, three: 3 }
    
  • 记住, 在Ruby1.9中, 哈希的表现不再是无序的. (译者注: Ruby1.9将会记住元素插入的序列)
  • 当遍历一个集合的同时, 不要修改这个集合.

字符串

  • 优先使用字符串插值来代替字符串串联.
    # bad
    email_with_name = user.name + ' <' + user.email + '>'
    
    # good
    email_with_name = "#{user.name} <#{user.email}>"
    
  • 当不需要使用字符串插值或某些特殊字符时, 应该优先使用单引号.
    # bad
    name = "Bozhidar"
    
    # good
    name = 'Bozhidar'
    
  • 当使用字符串插值替换实例变量时, 应该省略{}.
    class Person
      attr_reader :first_name, :last_name
    
      def initialize(first_name, last_name)
        @first_name = first_name
        @last_name = last_name
      end
    
      # bad
      def to_s
        "#{@first_name} #{@last_name}"
      end
    
      # good
      def to_s
        "#@first_name #@last_name"
      end
    end
    
  • 操作较大的字符串时, 避免使用+, 如果需要修改被操作字符串, 应该总是使用<<作为代替.
    # good and also fast
    html = ''
    html << '<h1>Page title</h1>'
    
    paragraphs.each do |paragraph|
      html << "<p>#{paragraph}</p>"
    end
    

正则表达式

  • 如果只是需要查找普通字符串, 不要使用RE. 例如: string['text'] (译者注: 示例什么意思?)
  • 针对简单的结构, 你可以直接使用string[/RE/]的方式来查询. (译者注: string[]难道是新添加的语法?)
    match = string[/regexp/]             # get content of matched regexp
    first_group = string[/text(grp)/, 1] # get content of captured group
    string[/text (grp)/, 1] = 'replace'  # string => 'text replace'
    
  • 当无需引用分组内容时, 应该使用(?:RE)代替(RE). (会提高性能)
    /(first|second)/   # bad
    /(?:first|second)/ # good
    
  • 避免使用$1-$9风格的分组引用, 而应该使用1.9新增的命名分组来代替.
    # bad
    /(regexp)/ =~ string
    ...
    process $1
    
    # good
    /(?<meaningful_var>regexp)/ =~ string
    ...
    process meaningful_var
    
                

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