浅析Ruby的源代码布局及其编程风格

使用 UTF-8 作为源文件编码。

每个缩进级别使用两个 spaces (又名软 tabs). 不要硬 tabs

  # bad - four spaces
  def some_method
    do_something
  end

  # good
  def some_method
   do_something
  end

使用 Unix-风格 换行符。(*BSD/Solaris/Linux/OSX 用户被为默认涵盖,Windows 用户必须特别小心.)

  • \n是换行,英文是LineFeed,ASCII码是0xA。
  • \r是回车,英文是Carriage Return ,ASCII码是0xD。
  • windows下enter是 \n\r,unix下是\n,mac下是\r

如果你正在使用 Git 你可能会想要添加下面的配置设置来保护你的项目(避免)Windows 蔓延过来的换行符:

  $ git config --global core.autocrlf true

不用使用 ; 来分割语句和表达式。以此推论 - 一行使用一个表达式

 # bad
  puts 'foobar'; # superfluous semicolon

  puts 'foo'; puts 'bar' # two expression on the same line

  # good
  puts 'foobar'

  puts 'foo'
  puts 'bar'

  puts 'foo', 'bar' # this applies to puts in particular

对于没有内容的类定义,尽可能使用单行类定义形式.

 # bad
  class FooError < StandardError
  end

  # okish
  class FooError < StandardError; end

  # good
  FooError = Class.new(StandardError)

避免单行方法。即便还是会受到一些人的欢迎,这里还是会有一些古怪的语法用起来很容易犯错.
    无论如何 - 应该一行不超过一个单行方法.

# bad
  def too_much; something; something_else; end

  # okish - notice that the first ; is required
  def no_braces_method; body end

  # okish - notice that the second ; is optional
  def no_braces_method; body; end

  # okish - valid syntax, but no ; make it kind of hard to read
  def some_method() body end

  # good
  def some_method
   body
  end

空方法是这个规则的例外。

  # good
  def no_op; end

操作符旁的空格,在逗号,冒号和分号后;在 { 旁和在 } 之前,大多数空格可能对 Ruby 解释(代码)无关,但是它的恰当使用是让代码变得易读的关键。

  sum = 1 + 2
  a, b = 1, 2
  1 > 2 ? true : false; puts 'Hi'
  [1, 2, 3].each { |e| puts e }

唯一的例外是当使用指数操作时:

  # bad
  e = M * c ** 2

  # good
  e = M * c**2

{ 和 } 值得额外的澄清,自从它们被用于 块 和 hash 字面量,以及以表达式的形式嵌入字符串。
    对于 hash 字面量两种风格是可以接受的。

  # good - space after { and before }
  { one: 1, two: 2 }

  # good - no space after { and before }
  {one: 1, two: 2}

第一种稍微更具可读性(并且争议的是一般在 Ruby 社区里面更受欢迎)。
    第二种可以增加了 块 和 hash 可视化的差异。
    无论你选哪一种都行 - 但是最好保持一致。

目前对于嵌入表达式,也有两个选择:

  # good - no spaces
  "string#{expr}"

  # ok - arguably more readable
  "string#{ expr }"

第一种风格极为流行并且通常建议你与之靠拢。第二种,在另一方面,(有争议)更具可读性。
    如同 hash - 选取一个风格并且保持一致。

没有空格 (, [之后或者 ], )之前。

  some(arg).other
  [1, 2, 3].length

  ! 之后没有空格 .

  # bad
  ! something

  # good
  !something

when和case 缩进深度一致。我知道很多人会不同意这点,但是它是"The Ruby Programming Language" 和 "Programming Ruby"中公认的风格。

# bad
  case
   when song.name == 'Misty'
    puts 'Not again!'
   when song.duration > 120
    puts 'Too long!'
   when Time.now.hour > 21
    puts "It's too late"
   else
    song.play
  end

  # good
  case
  when song.name == 'Misty'
   puts 'Not again!'
  when song.duration > 120
   puts 'Too long!'
  when Time.now.hour > 21
   puts "It's too late"
  else
   song.play
  end

  case
  when song.name == 'Misty'
   puts 'Not again!'
  when song.duraton > 120
   puts 'Too long!'
  when Time.now > 21
   puts "It's too late"
  else
   song.play
  end

当赋值一个条件表达式的结果给一个变量时,保持分支的缩排在同一层。

  # bad - pretty convoluted
  kind = case year
  when 1850..1889 then 'Blues'
  when 1890..1909 then 'Ragtime'
  when 1910..1929 then 'New Orleans Jazz'
  when 1930..1939 then 'Swing'
  when 1940..1950 then 'Bebop'
  else 'Jazz'
  end

  result = if some_cond
   calc_something
  else
   calc_something_else
  end

  # good - it's apparent what's going on
  kind = case year
      when 1850..1889 then 'Blues'
      when 1890..1909 then 'Ragtime'
      when 1910..1929 then 'New Orleans Jazz'
      when 1930..1939 then 'Swing'
      when 1940..1950 then 'Bebop'
      else 'Jazz'
      end

  result = if some_cond
        calc_something
       else
        calc_something_else
       end

  # good (and a bit more width efficient)
  kind =
   case year
   when 1850..1889 then 'Blues'
   when 1890..1909 then 'Ragtime'
   when 1910..1929 then 'New Orleans Jazz'
   when 1930..1939 then 'Swing'
   when 1940..1950 then 'Bebop'
   else 'Jazz'
   end

  result =
   if some_cond
    calc_something
   else
    calc_something_else
   end

在方法定义之间使用空行并且一个方法根据逻辑段来隔开。

 def some_method
   data = initialize(options)

   data.manipulate!

   data.result
  end

  def some_methods
   result
  end

避免在一个方法调用的最后一个参数有逗号,特别是当参数不在另外一行。

 # bad - easier to move/add/remove parameters, but still not preferred
  some_method(
         size,
         count,
         color,
        )

  # bad
  some_method(size, count, color, )

  # good
  some_method(size, count, color)

当给方法的参数赋默认值时,在 = 两边使用空格:

 # bad
  def some_method(arg1=:default, arg2=nil, arg3=[])
   # do something...
  end

  # good
  def some_method(arg1 = :default, arg2 = nil, arg3 = [])
   # do something...
  end

虽然几本 Ruby 书建议用第一个风格,不过第二个风格在实践中更为常见(并可争议地可读性更高一点)。

避免在不需要的时候使用行继续符 \ 。实践中,
    除非用于连接字符串, 否则避免在任何情况下使用行继续符。

  # bad
  result = 1 - \
       2

  # good (but still ugly as hell)
  result = 1 \
       - 2

  long_string = 'First part of the long string' \
         ' and second part of the long string'

采用连贯的多行方法链式风格。在 Ruby 社区有两种受欢迎的风格,它们都被认为很好
    - . 开头(选项 A) 和 尾随 . (选项 B) 。

(选项 A) 当一个链式方法调用需要在另一行继续时,将 . 放在第二行。

# bad - need to consult first line to understand second line
    one.two.three.
     four

    # good - it's immediately clear what's going on the second line
    one.two.three
     .four

(选项 B) 当在另一行继续一个链式方法调用,将 . 放在第一行来识别要继续的表达式。

  # bad - need to read ahead to the second line to know that the chain continues
    one.two.three
     .four

    # good - it's immediately clear that the expression continues beyond the first line
    one.two.three.
     four

在这里可以发现有关这两个另类风格的优点的讨论。

如果一个方法调用的跨度超过了一行,对齐它们的参数。当参数对齐因为行宽限制而不合适,
    在第一行之后单缩进也是可以接受的。

 # starting point (line is too long)
  def send_mail(source)
   Mailer.deliver(to: 'bob@example.com', from: 'us@example.com', subject: 'Important message', body: source.text)
  end

  # bad (double indent)
  def send_mail(source)
   Mailer.deliver(
     to: 'bob@example.com',
     from: 'us@example.com',
     subject: 'Important message',
     body: source.text)
  end

  # good
  def send_mail(source)
   Mailer.deliver(to: 'bob@example.com',
           from: 'us@example.com',
           subject: 'Important message',
           body: source.text)
  end

  # good (normal indent)
  def send_mail(source)
   Mailer.deliver(
    to: 'bob@example.com',
    from: 'us@example.com',
    subject: 'Important message',
    body: source.text
   )
  end

对齐多行跨度的 array literals 的元素。

 # bad - single indent
  menu_item = ['Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam',
   'Baked beans', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam']

  # good
  menu_item = [
   'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam',
   'Baked beans', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam'
  ]

  # good
  menu_item =
   ['Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam',
    'Baked beans', 'Spam', 'Spam', 'Spam', 'Spam', 'Spam']

大数值添加下划线来提高它们的可读性。

  # bad - how many 0s are there?
  num = 1000000

  # good - much easier to parse for the human brain
  num = 1_000_000

使用 RDoc 以及它的惯例来撰写 API 文档。注解区块及 def 不要用空行隔开。

每一行限制在 80 个字符内。

避免行尾空格。

不要使用区块注释。它们不能由空白引导(=begin 必须顶头开始),并且不如普通注释容易辨认。

  # bad
  == begin
  comment line
  another comment line
  == end

  # good
  # comment line
  # another comment line

在 API 文档中使用 RDoc和它的公约。不要在注释代码块和def之间加入空行。

保持每一行少于80字符。

避免尾随空格。

(0)

相关推荐

  • Ruby中编写类与模块的风格指南

    在 class 定义里使用一致的结构. class Person # extend and include go first extend SomeModule include AnotherModule # constants are next SOME_CONSTANT = 20 # afterwards we have attribute macros attr_reader :name # followed by other macros (if any) validates :name

  • Ruby编程中的命名风格指南

    用英语命名标识符. # bad - identifier using non-ascii characters заплата = 1_000 # bad - identifier is a Bulgarian word, written with Latin letters (instead of Cyrillic) zaplata = 1_000 # good salary = 1_000 使用snake_case的形式给变量和方法命名. # bad :'some symbol' :Some

  • Ruby编程中的语法使用风格推荐

    使用 :: 引用常量(包括类和模块)和构造器 (比如 Array() 或者 Nokogiri::HTML()).     永远不要使用 :: 来调用方法. # bad SomeClass::some_method some_object::some_method # good SomeClass.some_method some_object.some_method SomeModule::SomeClass::SOME_CONST SomeModule::SomeClass() 使用括号将de

  • GitHub倡导的Ruby代码编写风格总结

    源代码布局方面: 1.所有源文件以UTF-8编码 2.使用2个空格的缩进 3.使用Unix风格的换行符(\n),windows(\r\n).可使用git config --global core.autocrlf true 防止产生windows风格的换行符. 4.在',',':'后,操作符(除指数操作之外),'{','}'的前后增加空格,增加代码的可读性. 5.在'(',')','[',']'符号后不要加空格. 6.Case和When处于同一代码层次. 7.2个def之间使用一个空行隔开 8.

  • 你应该知道的Ruby代码风格

    一.空格与tab使用空格缩进(95.364%)使用Tab缩进(4.636%)基于 1,001,987 次提交二.最大行宽80字符(92.618%)120字符(5.893%)150字符(1.489%)基于 1,057,374 次提交三.运算符.冒号.花括号周围,逗号.分号后是否使用空格不使用空格(73.366%) 复制代码 代码如下: sum = 1 +2a,b = 1, 21>2 ? true : false;puts 'Hi'[1, 2, 3].each {|e| puts e} 使用空格(2

  • 浅析Ruby的源代码布局及其编程风格

    使用 UTF-8 作为源文件编码. 每个缩进级别使用两个 spaces (又名软 tabs). 不要硬 tabs # bad - four spaces def some_method do_something end # good def some_method do_something end 使用 Unix-风格 换行符.(*BSD/Solaris/Linux/OSX 用户被为默认涵盖,Windows 用户必须特别小心.) \n是换行,英文是LineFeed,ASCII码是0xA. \r是

  • 浅析Ruby中继承和消息的相关知识

    继承允许你创建一个类,作为另一个类的精炼(refinement)和特化(specialization).例如,在我们的自动点唱机系统中,有"歌曲"这一概念,被封装在Song类中,然后,随着市场的成长,我们需要提供卡拉OK的支持.一首卡拉OK歌曲和其他歌曲没什么两样(它只是没有主唱的音轨,对此我们不必关心).不过,它还包括对于的一套歌词以及时间信息.当我们的自动点唱机在播放一首卡拉OK歌曲时,歌词应该随音乐滚动显示在点唱机前的屏幕上. 解决这个问题的一种方法是定义一个新的类Karaoke

  • 浅谈Javascript编程风格

    Douglas Crockford是Javascript权威,Json格式就是他的发明. 去年11月他有一个演讲,谈到了好的Javascript编程风格是什么. 我非常推荐这个演讲,它不仅有助于学习Javascript,而且能让你心情舒畅,因为Crockford讲得很幽默,时不时让听众会心一笑. 下面,我根据这个演讲和Crockford编写的代码规范,总结一下"Javascript编程风格". 所谓"编程风格"(programming style),指的是编写代码的

  • PHP编程风格规范分享

    说明:本规范由 EasyChen 借鉴 SINA网络应用开发部<C++开发规范>和互动技术部<PHP4开发规范>,以及phpDocument规范 整理出的开发规范.我觉得非常不错, 适合PHP的开发,给大家参考,养成一个良好的编程风格是非常有必要的. 第1章 命名规范 1.1变量 1.1.1全局变量 全局变量使用$g_开头,如$g_data_list. 1.1.2 一般变量 一般的变量使用小写字母命名,单词之间使用下划线分隔. 变量名字应该使用名词或者形容词+名词的方式.如$val

  • 小议Java的源文件的声明规则以及编程风格

    Java源文件的声明规则 当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则: 一个源文件中只能有一个public类. 一个源文件可以有多个非public类. 源文件的名称应该和public类的类名保持一致.例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java. 如果一个类定义在某个包中,那么package语句应该在源文件的首行. 如果源文件包含import语句,那么应该放在package语句和类定义之间

  • 实例详解jQuery的链式编程风格

    链式编程的实现原理 jQuery可以让我们开发者一直使用点语法调用自身方法的原理,主要原因是jQuery内部利用了js的对象来实现. 在jQuery中,如果一直对同一个元素或元素的其他关系元素(兄弟元素,父子元素)进行操作,那么可以使用 .语法(点语法),一直写下去. $("#box").css("background", "pink").css("font-size":"29px"); $("#

  • 现代 JavaScript 开发编程风格Idiomatic.js指南中文版

    你为项目所择风格都应为最高准则.作为一个描述放置于你的项目中,并链接到这个文档作为代码风格一致性.可读性和可维护性的保证. 一.空白 1.永远都不要混用空格和Tab.2.开始一个项目,在写代码之前,选择软缩进(空格)或者 Tab(作为缩进方式),并将其作为最高准则.a).为了可读, 我总是推荐在你的编辑中设计2个字母宽度的缩进 - 这等同于两个空格或者两个空格替代一个 Tab.3.如果你的编辑器支持,请总是打开 "显示不可见字符" 这个设置.好处是:a).保证一致性b).去掉行末的空格

  • 浅析Ruby中的类对象的概念

    面向对象的程序涉及类和对象. 一个类是蓝本,从个别对象被创建.在面向对象的术语,我们说小明的自行车是被称为自行车类的对象实例. 任何车辆的例子.它包括轮子,马力,燃油或燃气罐容量.这些特点形成的类车辆的数据成员.可以从其他车辆区分这些特征. 车辆也有一定的功能,如停止,驾驶,超速驾驶.即使这些功能形成的类车辆的数据成员.因此,可以定义一个类作为一个组合的特点和功能. 车辆类可以被定义为: Class Vehicle { Number no_of_wheels Number horsepower

  • 浅析Ruby中的Profiling工具的用法

    内置的profiler实现的很简单,在ruby2.2中只有150行代码,大家可以看看它的实现profile.rb .内置的profiler使用起来非常的方便,只需要加上-rprofile参数即可.例如: 执行: ruby -rprofile test.rb 输出结果为: 通过打印出的结果能够很明显的看出耗时的方法.内置的profiler很简单,只能打印出这样的结果,没有 其他输出格式的选项,下面介绍的其他几种都有丰富的格式输出. ruby-prof repo: https://github.co

  • 浅析PHP程序设计中的MVC编程思想

    PHP的MVC编程思想目前已经被广泛使用于各种大型项目的开发,很多成熟的MVC框架也逐渐被大家所熟知并被广泛应用于各类项目中,比较常见的如ThinkPHP.codeigniter.Symfony.yii.cakePHP等等.本文就来简述一下php的MVC程序设计思想. 一.什么是MVC 简单的说就是将网站源码分类.分层. MVC三个字母的含义: M:Model 模型,负责数据库操作. V:View 视图,负责调用Model调取数据,再调用模板,展示出最终效果. C:Controller 控制器,

随机推荐