看了好多个 rails 开源项目,全部都没注释 这是从哪里流行出来的编程习惯啊 顺便想问一下,大家写 ruby 和 rails 代码有写注释的习惯吗
代码所呈现的是:以什么样的方式,完成了什么功能 注释所补充的是代码无法呈现的信息,比如“为什么要这样”,“为什么要以这种方式”
如果注释在描述“做了什么”,是一种代码坏味道,因为说明代码不够清晰了,就会导致
回头看以前代码的时候觉的累
以这种思路去实践,开发时更多的是代码重构,而不是加注释。
又来了,以前提倡写代码必须写注释,后来提出使代码能直接表达其意(特别是像 ruby 这样强表达力的),然后就干脆啥注释都不写了。
每个人(团队)都有自己的原则,我的原则是尽量少些,用代码表达,当然一定会有那些有注释更便于理解的时候就写点。
#16 楼 @ghjcumt2008 很多 java 开源项目是 Apache 协议,Apache 协议要求每个源文件开头都要带 license, 而 github 上的 ruby 项目多是 BSD 或者 MIT, 注释量大减 XD
我觉得注释还是有必要的。 尤其是那些关于具体 业务 的代码,靠逻辑根本解释不清楚,这时候最好有注释,最起码也要标明当时写的文档的位置吧,要不然下个程序员脑袋想炸也不知道它们为什么会这样。 亲身经历。
#8 楼 @ghjcumt2008 我说的是:在注释里面描述对应的代码在做什么,是一种坏味道
没人说不需要注释。但在你开始注释之前,再审视一遍。
https://github.com/bbatsov/ruby-style-guide#comments http://blog.csdn.net/horkychen/article/details/6322152
接下来的讨论希望能有代码范例,否则很空的。
我们就以 shopqi 为例,纯粹技术探讨哈
https://github.com/saberma/shopqi/blob/master/app/models/shop.rb#L193
after_destroy do # 删除对应的目录
FileUtils.rm_rf self.path
FileUtils.rm_rf self.public_path
end
protected
def init_valid_date
self.deadline = Date.today.advance months: 1 unless self.plan_free?
end
def init_currency
self.currency ||= 'CNY' # 初始化为人民币
set_currency_format
end
def set_currency_format # 设置币种显示格式
data = KeyValues::Shop::Currency.find_by_code(currency)
self.money_with_currency_format = data.html_unit
self.money_format = data.html
self.money_with_currency_in_emails_format = data.email_unit
self.money_in_emails_format = data.email
end
这里 3 个注释都在解释代码做了什么,说明有优化的空间
我会这样改:
after_destroy :rm_directories
protected
def rm_directories
FileUtils.rm_rf self.path
FileUtils.rm_rf self.public_path
end
def init_valid_date
self.deadline = Date.today.advance months: 1 unless self.plan_free?
end
def init_currency
self.currency ||= 'CNY'
set_currency_format
end
def set_currency_display_format
data = KeyValues::Shop::Currency.find_by_code(currency)
self.money_with_currency_format = data.html_unit
self.money_format = data.html
self.money_with_currency_in_emails_format = data.email_unit
self.money_in_emails_format = data.email
end
# 这里用 alias_method 向前兼容
alias_method :set_currency_format,
:set_currency_display_format
最后一个注释是解释 为什么
没必要大量写注释的 第一 写这段代码的原因可以写在 git commit message 里。第二 公司项目一般还有 ticket 管理工具,可以把更详细的文档写在 ticket 里,然后在注释里或是 git commit message 里引用。 大规模写注释的方法早就走进历史了。。LZ 老了。。
这不是一个人的问题,都是这样,刚开始也有这样的疑问,但现在习惯了,写了注释都会删掉,因为在 ruby 代码中出现 注释 真的影响美观啊,看着就不爽
#34 楼 @ghjcumt2008 你还是没理解问题的关键。注释不是免费的,它需要维护,如果它和代码一同演化,那么这是维护人员的负担,而如果它不幸没有和代码一同演化(这是最大的可能),那几乎就是误导了。而且,由于注释不能被测试(所以没法用测试用例保护),后来的维护者如果没有把握,是不敢随便修改注释内容的,这使得问题变得更纠结。
这么说并不是要完全取消注释,但是你必须认识到——注释有成本,使用需谨慎
做了 N 年维护的人来说说,注释这东西,写的多了,不维护,就是各种坑,代码写到不需要注释,才是关键,对于关键的接口方法,需要有详细的注释,详细的使用说明,和各种情况的说明,我是很不推荐在代码中间放太多的注释的
当然要写注释!并且很多情况下代码是不能说明问题的!几种状况:
解释做了什么
# 把选项设为真
option = false
解释为什么这样做
# 网上拷过来的
print "hello world"
修复 bug
# 修复 method missing 的 bug
class Object
def method_missing *args
end
end
技术背景
# 请阅读 Intel x86 手册
code << "\x55\x8B\xEC"\
<< function_body\
<< "\x5D\xC3"
Proof of work
# 如果作了修改, 请也更改下一行的数字, 以保证这个源文件的 SHA2 摘要的末 64 bit 为 0
# 20391
...