#10 楼 @yuan Spree 和大部分项目比起来质量算是不错的,但是,几个关键文件都一般般,比如最重要的 Order:https://github.com/spree/spree/blob/master/core/app/models/spree/order.rb
550 行的 class,维护成本太高。
有潜力。 假以时日,如果有优秀的团队或是“师傅”磨练,将成大气。:D
最简单的“偷窥”方式就是看 controller:
def update
params.require(:post)
post = Post.where(id: params[:id]).first
post.image_sizes = params[:image_sizes] if params[:image_sizes].present?
guardian.ensure_can_edit!(post)
# to stay consistent with the create api,
# we should allow for title changes and category changes here
# we should also move all of this to a post updater.
if post.post_number == 1 && (params[:title] || params[:post][:category])
post.topic.title = params[:title] if params[:title]
Topic.transaction do
post.topic.change_category(params[:post][:category])
post.topic.save
end
if post.topic.errors.present?
render_json_error(post.topic)
return
end
end
revisor = PostRevisor.new(post)
if revisor.revise!(current_user, params[:post][:raw])
TopicLink.extract_from(post)
end
if post.errors.present?
render_json_error(post)
return
end
post_serializer = PostSerializer.new(post, scope: guardian, root: false)
post_serializer.draft_sequence = DraftSequence.current(current_user, post.topic.draft_key)
link_counts = TopicLink.counts_for(guardian,post.topic, [post])
post_serializer.single_post_link_counts = link_counts[post.id] if link_counts.present?
post_serializer.topic_slug = post.topic.slug if post.topic.present?
result = {post: post_serializer.as_json}
if revisor.category_changed.present?
result[:category] = BasicCategorySerializer.new(revisor.category_changed, scope: guardian, root: false).as_json
end
render_json_dump(result)
end
#20 楼 @zhangjinzhu 啊 原来是放在一个文件里了,眼花没看见。。。老了老了。。。T__T
#17 楼 @zhangjinzhu 我指的是你的代码没有测试啊 =.=
测。。。试。。。咧。。。
删掉 :trollface:
开源的 rails 项目我至今没找到质量高的,包括我自己的 angel_nest 在内。:(
最重要的是如何写有效的测试,去年我的 RubyConf China 演讲里有稍微提到一点点。
我们团队的项目——
$ rake stats
+----------------------+-------+-------+---------+---------+-----+-------+
| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Decorators | 71 | 60 | 3 | 10 | 3 | 4 |
| Entities | 1181 | 984 | 31 | 44 | 1 | 20 |
| Inputs | 14 | 10 | 1 | 1 | 1 | 8 |
| Presenters | 467 | 420 | 21 | 30 | 1 | 12 |
| Repositories | 352 | 301 | 24 | 1 | 0 | 299 |
| Services | 738 | 589 | 38 | 59 | 1 | 7 |
| Uploaders | 55 | 13 | 1 | 3 | 3 | 2 |
| Validators | 149 | 128 | 7 | 16 | 2 | 6 |
| Controllers | 937 | 766 | 28 | 121 | 4 | 4 |
| Helpers | 85 | 68 | 0 | 18 | 0 | 1 |
| Models | 531 | 420 | 35 | 35 | 1 | 10 |
| Mailers | 0 | 0 | 0 | 0 | 0 | 0 |
| Javascripts | 351 | 258 | 0 | 73 | 0 | 1 |
| Libraries | 1042 | 860 | 31 | 110 | 3 | 5 |
| Controller specs | 559 | 460 | 0 | 0 | 0 | 0 |
| Decorator specs | 14 | 10 | 0 | 0 | 0 | 0 |
| Entity specs | 539 | 430 | 0 | 5 | 0 | 84 |
| Helper specs | 36 | 29 | 0 | 0 | 0 | 0 |
| Lib specs | 85 | 69 | 0 | 0 | 0 | 0 |
| Model specs | 124 | 95 | 3 | 0 | 0 | 0 |
| Presenter specs | 248 | 190 | 0 | 0 | 0 | 0 |
| Routing specs | 8 | 7 | 0 | 0 | 0 | 0 |
| Service specs | 599 | 487 | 3 | 2 | 0 | 241 |
| Validator specs | 269 | 210 | 1 | 3 | 3 | 68 |
| Javascript specs | 148 | 102 | 0 | 34 | 0 | 1 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total | 8602 | 6966 | 227 | 565 | 2 | 10 |
+----------------------+-------+-------+---------+---------+-----+-------+
Code LOC: 4979 Test LOC: 1987 Code to Test Ratio: 1:0.4
有 Hacker News 帐号的同学如果觉得这篇博文有点点用处的话欢迎 upvote 喔。:)
#10 楼 @jiyinyiyong 真正开始写代码是高中毕业后了…… T_T
这类事件近几年在西方世界频繁发生,所以很多人都提高了对这类事件的重视度。包括前阵子的某大会 promo 时拿女生当作“好处”的(perk)。
RubyChina 论坛上我观察到有几次情况差不多的招聘贴,果断皱眉并无视了——貌似大部分国内的程序员对这方面还没有足够的认识。
97 年开始摸电脑,当时还不知道如何正常关机。 97 年开始接触 BBS,“上海热线”之类的服务。 97 年开始自学做网页(好像是从“计算机硬件”之类的杂志里看到的)。 97 年初中还未毕业,出国来澳大利亚。 00 年回国,念高中。 00 年开始给各大计算机杂志撰稿,被当时的“未来数码动力”网站聘用。都是数码硬件相关,与程序和软件完全沾不上边。 01 年开始自己做网站。当时还不会写程序,视程序员为神。算是第一次“创业” 02 年开始把玩 Linux/BSD 兼 sysadmin(贩售虚拟主机),算是第二次“创业”。 04 年高中毕业后再次出国来澳大利亚,念多媒体专科,第一次开始学写程序(第一门语言 JavaScript,第二们语言 PHP)。 06 年开始 IT/多媒体本科。短暂的接触了 Assembly。 06 年获得第一份兼职的程序员工作(HTML/CSS/JS/PHP)。 06 年开始搭建自己的 blog 网站(Wordpress)。 07 年开始 freelance,程序与网站设计兼顾。 08 年本科毕业,获得第一份全职的程序员工作(仍然是 HTML/CSS/JS/PHP)。 10 年开始从 PHP 转向 Ruby(当时在 Envato 任职)。 10 年开始给 Rails 项目做贡献。 11 年开始带队(当时在 SitePoint 任职)。 13 年继续在带队。
比起从小就摸电脑写程序的,我算是半路出家,后起步的。所以,如果你觉得你起步的晚,看看我就可以啦!:D
Windows phone, Android 和 iPhone 都有的低调飘过…… =.=
class Person
def hello
yield
end
def world(&proc)
proc.call
end
def haha(&block)
instance_exec(&block)
end
end
p = Person.new
p.hello {puts self.class}
p.world {puts self.class}
p.instance_eval {puts self.class}
p.haha {puts self.class}
Object
Object
Person
Person
RSpec 如果 use_transactional_fixtures = true
的话,after_commit
不会被执行。
即便用 gem update cocoapods
也不一定能保证可以更新到新版本。唯一的方法是在 Gemfile 里指定版本。
#53 楼 @ckf513728912 这个方面的我不太熟悉哎不好意思……
let
都是 lazy-evaluated 的,所以当程序执行到 user
的时候 let(:user)
才会被赋值。
看美剧 ^___^
赞!
Cells 的作者 Nick Sutterer 今年在 RubyConf India 做的演讲中提及了 Cells。演讲里还有提及 Datamappify 哟!;)
以后都是 test suite running... -__,-
其实归根结底还是 基数大 的问题。
在袋鼠国,优秀的人才其实也不算多——我们公司现在还在招聘,已经几个月了还没有找到如意的人选,其间在 code test 这段被我拒掉的已经好几十人了。
“不思进取”的开发者到处都是,只是在国外的话,一般不那么明显,因为他们不会出现在技术社区…… 在国内的话由于东西方文化的不同,大家都喜欢泡在网上,于是技术论坛上就会出现很多奇奇怪怪的帖子……
我用的 Janus :)