`
Readonly
  • 浏览: 151802 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

师傅领错门,害了你个人 - ruby/rails新手避免入错门

阅读更多
最近看到一位Ruby On Rails新手写的代码,简直是惨不忍睹,问了一下他竟然是用李刚写的那本<<Ruby on Rails敏捷开发最佳实践>>作为入门材料的,偶真是faint,啥也不多说了,为了让更多的Ruby On Rails的新手避免走弯路,偶觉得很有必要来评论一下这本书,以china pub上下载的第15章样章为例子:
http://www.china-pub.com/39348

这章是讲一个注册用户通过邮件注册激活的例子,偶们来看看所谓的最佳实践实际是如何成为绝佳反面教材:
1. 创建一个用户表
这里使用的是sql,而不是Rails最佳实践推荐的migration

2. 用户表中直接用明码保存用户的密码
请各位作实际开发新手注意:任何一个应用都不应该犯这样愚蠢的错误

3. 标示用户是否激活的字段名叫is_actived
这不符合rails的最佳实践写法,对于boolean类型的数据,应该省略前面的is_,ActiveRecord会自动加个?号,映射成actived?

4. User模型的校验功能用errors.add这样手工的方法
最佳实践是使用Validation DSL,除非ActiveRecord提供的DSL不能满足你的特殊校验需求,否则毫无必要自己手工处理
就算你有很特殊的校验需求,在这段代码里面也应该使用errors.add_to_base,而不是用errors.add_base,跟一个空白的字符串

5. 设置用户的默认激活为false:@user.is_activated = false
Rails的理念是COC和DRY,这种初始默认值的设定应该在创建数据库定义的时候指定,而且默认的boolean都是false,这里的赋值完全是多此一举

让我们先休息和回顾一下,上面提到的5个绝佳反面教材竟然是出现在一个章节中的一个小段:15.4.1基本注册功能,错误之密集真是令人咋舌。
如果你和偶一样,还能忍受下去,恭喜你,你具备了给烂代码作Code Review的基本要求:耐力

偶们来继续往下看:
6. 看看发送邮件的代码
@sent_on = Time.now
@headers = {}


@sent_on指定的是邮件头信息中的Date,默认就是使用当前时间,这里的赋值也是多此一举
@headers指定的是邮件头信息的hash,这里也是也是多此一举
结合之前的问题5,李刚老师您这是用无用代码来充书本厚度么?


7. if user != nil && user.is_activated == false
user.is_activated == false ??? 这叫啥代码阿? 偶的天哪,李刚老师可能是为了保持风格统一,后面果然还有 user.is_activated == true ,这是偶看到搞笑的代码了...

8. pro_activate Action的代码写得及其冗长
综合前面的错误,偶想李刚可能压根不懂一些ruby和rails的惯用法,偶好为人师一下,符合ruby风格的代码应该是这样:
def pro_activate
  user = User.find_by_name_and_active_code(params[:name], params[:active_code])
  if user 
    if user.actived?
      flash[:notice] = "您的账户已经处于激活状态,请勿重复激活!"		
    else
      user.update_attribute(:activated , true)
      flash[:notice] = "恭喜您,您已经成功激活了您的账户!"
    end
  else
    flash[:notice] = "激活失败!"
  end
end

而且在实际开发中,作为最佳实践,最后一个else判断完全是不必要的,大家可以想想什么情况下会出现跑到最后一个else?嗯,只有在恶意构造url攻击的情况下,这样我们完全可以改成:
User.find_by_name_and_active_code_and_active(params[:name], params[:active_code], false)
在之后的pro_login action里面的代码就不多说了,和前面一样,也有user != nil && user.is_activated == false这样搞笑的代码出现。

看完了这个短短5页的样章中有那么多的错误,偶明白了为什么那个新手写的代码是如此的惨不忍睹,虽然俗话说,师傅领进门,修行在个人,但是也要晓得:师傅领错门,害了你个人
最后推荐了另外几本Ruby和Rails的书给他,让他好好改造去了...
分享到:
评论
80 楼 Readonly 2008-11-11  
gigix 写道

if(user.getActivated() == true) {
  return true;
} else {
  return false;
}
这样的你见过没?

这个确实要比李刚书中写的要强上一点
偶之前看过比较强的有:霹雳啪啦一堆代码,计算出一个值,偶好不容易看懂了那一堆代码,但是......发现那个值在下面的代码压根没有用到。事后询问那写代码的哥们,他很不以为然地回了偶一句:忘记删了 
79 楼 yehs220 2008-11-11  
buaawhl 写道
一叶孤鸿 写道

if(false) {
// 这里一大段代码
}
这样的你见过没?


这个确实很NB的说



这种代码方便白盒测试。
改成 true 就运行,改成 false 就不运行。


没错,我偶尔也这么干
78 楼 ddd 2008-11-11  
gigix 写道
ddd 写道
gigix 写道

if(false) {
// 这里一大段代码
}
这样的你见过没?

也许是注释掉代码的意思

说到注释,故事就更多了

一个class我随便拖一拖,两千多行,中间两三百行一大段是直接注释掉的
问这些人,为什么不删掉,说是不能删,再问为什么,一个人说不知道,另一个人说留着以后可能需要参考
参考你参考clearcase好不好,版本控制要来干嘛的呢?

还有,方法名不好好写,参数列表就是什么a1、a2、a3…到上面再去拉一堆注释,说这个方法是干嘛的,每个参数是干嘛的。有这工夫你直接写在方法签名里不好?

还有,一个方法拉出三四百行,中间注释出几大块。把注释直接就变成一个新方法的名字有那么难吗?用的还是Eclipse…

说得不好听点,会写注释的程序员我就见得不太多。见过太多程序员,写一行注释就是一个反模式。看他们的代码就搜注释,一行行注释看过去全都是毛病。

单就这一个案例(用if(false){}注释掉代码)来讲,在linux内核中也能见到
#if 0
一段代码
#endif
用c比较习惯的人对这种注释方法都能接受。
可能你见到的那个人从C过来的?还带着C的习惯?
-------add------------
不过这种不好看的东西可能也是被bsd内核维护者笑话的原因之一。
77 楼 gigix 2008-11-11  
ddd 写道
gigix 写道

if(false) {
// 这里一大段代码
}
这样的你见过没?

也许是注释掉代码的意思

说到注释,故事就更多了

一个class我随便拖一拖,两千多行,中间两三百行一大段是直接注释掉的
问这些人,为什么不删掉,说是不能删,再问为什么,一个人说不知道,另一个人说留着以后可能需要参考
参考你参考clearcase好不好,版本控制要来干嘛的呢?

还有,方法名不好好写,参数列表就是什么a1、a2、a3…到上面再去拉一堆注释,说这个方法是干嘛的,每个参数是干嘛的。有这工夫你直接写在方法签名里不好?

还有,一个方法拉出三四百行,中间注释出几大块。把注释直接就变成一个新方法的名字有那么难吗?用的还是Eclipse…

说得不好听点,会写注释的程序员我就见得不太多。见过太多程序员,写一行注释就是一个反模式。看他们的代码就搜注释,一行行注释看过去全都是毛病。
76 楼 ddd 2008-11-11  
gigix 写道

if(false) {
// 这里一大段代码
}
这样的你见过没?


也许是注释掉代码的意思
75 楼 buaawhl 2008-11-11  
一叶孤鸿 写道

if(false) {
// 这里一大段代码
}
这样的你见过没?


这个确实很NB的说



这种代码方便白盒测试。
改成 true 就运行,改成 false 就不运行。
74 楼 一叶孤鸿 2008-11-11  

if(false) {
// 这里一大段代码
}
这样的你见过没?


这个确实很NB的说

73 楼 playfish 2008-11-11  
QiaoDuanni 写道

weiqingfei 写道ahuaxuan 写道神作啊,神作,读"李老师"的书,如饮甘泉,又有如清风拂面,又有一种让人可以恍然大悟的感觉,原来代码还可以这样写:
if(user.isActivated() == false)
我大澈大悟,我有理由相信这种写法是某培训学校的最佳实践


"李老师"从java,到ruby,无所不知,无所不晓,我本人非常期待"李老师"的下一本神作"python on django敏捷开发最佳实践", 或者groovy on grails 敏捷开发最佳实践,或者"李老师"还会其他的东西

凡是是"李老师"写的书,都是好书,凡是"李老师"做的事,都是好事.




我想看李刚版的《倚天屠龙记》
余秋雨 写道
我想,比‘大’字等级更高的是‘老’字,一个人先成‘大人’才能成为‘老人’,那么,既然我已经做了大半辈子的‘老师’,那就后退一步叫叫‘大师’也可以吧。

我建议还是叫"李大师"


不能叫李大师,已经有李宏志了。会混淆的。这评论再下去就都水了。还是就此打住的好。。免得又出现什么门事件来
72 楼 gigix 2008-11-11  
Readonly 写道
就算不熟ruby,也没有人在java里面这样用:
if(user.isActivated() == false)把...

这种代码我看得多了
if(user.getActivated() == true) {
  return true;
} else {
  return false;
}
这样的你见过没?
if(false) {
// 这里一大段代码
}
这样的你见过没?

我都见过。这世界上不会写程序的程序员之牛逼远超过我之前最牛逼的想象──当然现在我又被颠覆了一次,不会写程序的程序员也可以写书教别人写程序。
71 楼 QiaoDuanni 2008-11-11  
weiqingfei 写道
ahuaxuan 写道
神作啊,神作,读"李老师"的书,如饮甘泉,又有如清风拂面,又有一种让人可以恍然大悟的感觉,原来代码还可以这样写:
if(user.isActivated() == false)
我大澈大悟,我有理由相信这种写法是某培训学校的最佳实践


"李老师"从java,到ruby,无所不知,无所不晓,我本人非常期待"李老师"的下一本神作"python on django敏捷开发最佳实践", 或者groovy on grails 敏捷开发最佳实践,或者"李老师"还会其他的东西

凡是是"李老师"写的书,都是好书,凡是"李老师"做的事,都是好事.




我想看李刚版的《倚天屠龙记》

余秋雨 写道

我想,比‘大’字等级更高的是‘老’字,一个人先成‘大人’才能成为‘老人’,那么,既然我已经做了大半辈子的‘老师’,那就后退一步叫叫‘大师’也可以吧。


我建议还是叫"李大师"
70 楼 tangjunchf 2008-11-11  
请推荐几本好书啊!
69 楼 weiqingfei 2008-11-11  
ahuaxuan 写道
神作啊,神作,读"李老师"的书,如饮甘泉,又有如清风拂面,又有一种让人可以恍然大悟的感觉,原来代码还可以这样写:
if(user.isActivated() == false)
我大澈大悟,我有理由相信这种写法是某培训学校的最佳实践


"李老师"从java,到ruby,无所不知,无所不晓,我本人非常期待"李老师"的下一本神作"python on django敏捷开发最佳实践", 或者groovy on grails 敏捷开发最佳实践,或者"李老师"还会其他的东西

凡是是"李老师"写的书,都是好书,凡是"李老师"做的事,都是好事.




我想看李刚版的《倚天屠龙记》
68 楼 ahuaxuan 2008-11-11  
神作啊,神作,读"老师"的书,如饮甘泉,又有如清风拂面,又有一种让人可以恍然大悟的感觉,原来代码还可以这样写:
if(user.isActivated() == false)
我大澈大悟,我有理由相信这种写法是某培训学校的最佳实践


"老师"从java,到ruby,无所不知,无所不晓,我本人非常期待"老师"的下一本神作"python on django敏捷开发最佳实践", 或者groovy on grails 敏捷开发最佳实践,或者"老师"还会其他的东西

凡是是"老师"写的书,都是好书,凡是"老师"做的事,都是好事.

"老师"千秋万代,一统江湖

67 楼 ycmhn 2008-11-11  
upheart 写道

if user != nil &amp;&amp; user.is_activated == false 佩服,就是java代码也不能这么写啊李刚好像什么都精通奥,在书店好像还看到他的一本flex的书

貌似我偶尔会写出 if(xxx===false){}
这样的啊。。。。晕了
66 楼 logo 2008-11-11  
上个月(10月份)李副教授在上海签名售书呢,我总觉得这个帖子出来的太晚了。现在烂书这么多,多一本不多少一本不少,就怕还当什么培训学校的教学总监,那才真是“造福一方百姓”阿!
65 楼 ddd 2008-11-11  
tanleihaoren 写道
啊!惨了。见证“刚门事件了”!希望不要发展成双方的人生攻击!

这得给对号了。
64 楼 fujohnwang 2008-11-11  
Readonly 写道
fujohnwang 写道
引用
if user != nil && user.is_activated == false


ruby 不熟,这行代码在ruby里面应该用什么套路?!


if user && user.is_activated

就算不熟ruby,也没有人在java里面这样用:
if(user.isActivated() == false)把...


呵呵,我想我是想知道前面那个部分...
63 楼 Readonly 2008-11-11  
fujohnwang 写道
引用
if user != nil && user.is_activated == false


ruby 不熟,这行代码在ruby里面应该用什么套路?!


if user && user.is_activated

就算不熟ruby,也没有人在java里面这样用:
if(user.isActivated() == false)把...
62 楼 jiachengxi38 2008-11-11  
一句话,,责任在何方。。。
61 楼 fujohnwang 2008-11-11  
引用
if user != nil && user.is_activated == false


ruby 不熟,这行代码在ruby里面应该用什么套路?!



相关推荐

    APICloud-Studio-RCP-Mac:APICloud提供的一款开源免费HTML编码工具,方便开发者进行应用的开发和调试,源码详见APICloud-Studio项目。 此为Mac版APICloud Studio的product

    不过,这并不意味着它不能与其他语言集成,开发者可以利用APICloud的API接口调用其他服务,如通过Ruby on Rails后端服务来实现数据交互和业务逻辑。 总的来说,APICloud-Studio-RCP-Mac为开发者提供了一个高效、...

    学习:边做边学CS!

    Ruby on Rails框架简化了Web开发,让新手能够快速搭建功能齐全的网站。理解面向对象编程(OOP)概念,如类、模块和元编程,是深入Ruby世界的钥匙。 Python则以其易读性和广泛的应用范围而闻名,它在数据科学、机器...

    养老院管理系统:SpringBoot与Vue前后端不分离架构的设计与实现

    内容概要:本文详细介绍了基于SpringBoot和Vue开发的养老院管理系统的具体实现细节。该系统采用前后端不分离的架构,旨在快速迭代并满足中小项目的开发需求。文中涵盖了多个关键技术点,如数据库设计(组合唯一约束、触发器)、定时任务(@Scheduled、@Async)、前端数据绑定(Vue的条件渲染和动态class绑定)、权限控制(RBAC模型、自定义注解)以及报表导出(SXSSFWorkbook流式导出)。此外,还讨论了开发过程中遇到的一些常见问题及其解决方案,如CSRF防护、静态资源配置、表单提交冲突等。 适合人群:具备一定Java和前端开发经验的研发人员,尤其是对SpringBoot和Vue有一定了解的开发者。 使用场景及目标:适用于需要快速开发中小型管理系统的团队,帮助他们理解如何利用SpringBoot和Vue进行全栈开发,掌握前后端不分离架构的优势和注意事项。 其他说明:文章不仅提供了详细的代码示例和技术要点,还分享了许多实用的小技巧和避坑指南,有助于提高开发效率和系统稳定性。

    家族企业如何应对人才流失问题?.doc

    家族企业如何应对人才流失问题?

    员工关怀制度.doc

    员工关怀制度.doc

    路径规划领域中基于排序搜索的蚁群算法优化及其应用

    内容概要:本文详细探讨了对传统蚁群算法进行改进的方法,特别是在路径规划领域的应用。主要改进措施包括:采用排序搜索机制,即在每轮迭代后对所有路径按长度排序并只强化前20%的优质路径;调整信息素更新规则,如引入动态蒸发系数和分级强化策略;优化路径选择策略,增加排序权重因子;以及实现动态地图调整,使算法能够快速适应环境变化。实验结果显示,改进后的算法在收敛速度上有显著提升,在复杂地形中的表现更加稳健。 适合人群:从事路径规划研究的技术人员、算法工程师、科研工作者。 使用场景及目标:适用于需要高效路径规划的应用场景,如物流配送、机器人导航、自动驾驶等领域。目标是提高路径规划的效率和准确性,减少不必要的迂回路径,确保在动态环境中快速响应变化。 其他说明:改进后的蚁群算法不仅提高了收敛速度,还增强了对复杂环境的适应能力。建议在实际应用中结合可视化工具进行调参,以便更好地观察和优化蚂蚁的探索轨迹。此外,还需注意避免过度依赖排序机制而导致的过拟合问题。

    基于PSO算法的配电网分布式光伏选址定容优化及其Matlab实现

    内容概要:本文详细介绍了利用粒子群优化(PSO)算法解决配电网中分布式光伏系统的选址与定容问题的方法。首先阐述了问题背景,即在复杂的配电网环境中选择合适的光伏安装位置和确定合理的装机容量,以降低网损、减小电压偏差并提高光伏消纳效率。接着展示了具体的PSO算法实现流程,包括粒子初始化、适应度函数构建、粒子位置更新规则以及越界处理机制等关键技术细节。文中还讨论了目标函数的设计思路,将多个相互制约的目标如网损、电压偏差和光伏消纳通过加权方式整合为单一评价标准。此外,作者分享了一些实践经验,例如采用前推回代法进行快速潮流计算,针对特定应用场景调整权重系数,以及引入随机波动模型模拟光伏出力特性。最终实验结果显示,经过优化后的方案能够显著提升系统的整体性能。 适用人群:从事电力系统规划与设计的专业人士,尤其是那些需要处理分布式能源集成问题的研究人员和技术人员。 使用场景及目标:适用于希望深入了解如何运用智能优化算法解决实际工程难题的人士;旨在帮助读者掌握PSO算法的具体应用方法,从而更好地应对配电网中分布式光伏系统的选址定容挑战。 其他说明:文中提供了完整的Matlab源代码片段,便于读者理解和复现研究结果;同时也提到了一些潜在改进方向,鼓励进一步探索和创新。

    Prius2004永磁同步电机设计:从Excel到MotorCAD的全流程解析与实战技巧

    内容概要:本文详细介绍了丰田Prius2004永磁同步电机的设计流程,涵盖从初始参数计算到最终温升仿真的各个环节。首先利用Excel进行基本参数计算,如铁芯叠厚、定子外径等,确保设计符合预期性能。接着使用Maxwell进行参数化仿真,通过Python脚本自动化调整磁钢尺寸和其他关键参数,优化电机性能并减少齿槽转矩。随后借助橡树岭实验室提供的实测数据验证仿真结果,确保模型准确性。最后采用MotorCAD进行温升仿真,优化冷却系统设计,确保电机运行安全可靠。文中还分享了许多实用技巧,如如何正确设置材料参数、避免常见的仿真错误等。 适合人群:从事电机设计的专业工程师和技术人员,尤其是对永磁同步电机设计感兴趣的读者。 使用场景及目标:适用于希望深入了解永磁同步电机设计全过程的技术人员,帮助他们在实际工作中提高设计效率和精度,解决常见问题,优化设计方案。 其他说明:文章提供了丰富的实战经验和具体的操作步骤,强调了理论与实践相结合的重要性。同时提醒读者注意一些容易忽视的细节,如材料参数的选择和仿真模型的准确性。

    基于DSP28335的单相逆变器设计方案与实现:涵盖ADC采样、PWM控制、锁相环及保护机制

    内容概要:本文详细介绍了基于DSP28335的单相逆变器的设计与实现,涵盖了多个关键技术模块。首先,ADC采样模块用于获取输入电压和电流的数据,确保后续控制的准确性。接着,PWM控制模块负责生成精确的脉宽调制信号,控制逆变器的工作状态。液晶显示模块则用于实时展示电压、电流等重要参数。单相锁相环电路实现了电网电压的频率和相位同步,确保逆变器输出的稳定性。最后,电路保护程序提供了过流保护等功能,保障系统的安全性。每个模块都有详细的代码示例和技术要点解析。 适合人群:具备一定嵌入式系统和电力电子基础知识的研发人员,尤其是对DSP28335感兴趣的工程师。 使用场景及目标:适用于单相逆变器项目的开发,帮助开发者理解和掌握各个模块的具体实现方法,提高系统的可靠性和性能。 其他说明:文中不仅提供了具体的代码实现,还分享了许多调试经验和常见问题的解决方案,有助于读者更好地理解和应用相关技术。

    SecureCRT安装包

    SecureCRT安装包

    C# WPF MVVM架构下的大屏看板3D可视化开发指南

    内容概要:本文详细介绍了如何利用C#、WPF和MVVM模式构建一个大屏看板3D可视化系统。主要内容涵盖WPF编程设计、自定义工业控件、数据库设计、MVVM架构应用以及典型的三层架构设计。文中不仅提供了具体的代码实例,还讨论了数据库连接配置、3D模型绑定、依赖属性注册等关键技术细节。此外,文章强调了项目开发过程中需要注意的问题,如3D坐标系换算、MVVM中命令传递、数据库连接字符串加密等。 适合人群:具备一定C#编程基础,对WPF和MVVM模式有一定了解的研发人员。 使用场景及目标:适用于希望深入了解WPF和MVVM模式在实际项目中应用的开发者,特别是那些从事工业控制系统、数据可视化平台开发的专业人士。通过学习本文,读者可以掌握如何构建高效、稳定的大屏看板3D可视化系统。 其他说明:本文提供的设计方案和技术实现方式,可以帮助开发者更好地理解和应用WPF和MVVM模式,同时也能为相关领域的项目开发提供有价值的参考。

    基于java SSM 框架的酒店管理系统.zip

    基于ssm的系统设计,包含sql文件(Spring+SpringMVC+MyBatis)

    非厄米超表面双参数传感器的COMSOL建模与应用

    内容概要:本文详细介绍了利用COMSOL进行非厄米超表面双参数传感器的设计与实现。首先,通过构建超表面单元并引入虚部折射率,实现了PT对称系统的增益-损耗交替分布。接着,通过频域扫描和参数化扫描,捕捉到了复频率空间中的能级劈裂现象,并找到了奇异点(Exceptional Point),从而显著提高了传感器对微小扰动的敏感度。此外,文章探讨了双参数检测的独特优势,如解耦温度和折射率变化的能力,并展示了其在病毒检测、工业流程监控等领域的潜在应用。 适合人群:从事光学传感器研究的专业人士,尤其是对非厄米系统和COMSOL仿真感兴趣的科研人员。 使用场景及目标:适用于需要高精度、多参数检测的应用场合,如生物医学检测、环境监测等。目标是提高传感器的灵敏度和分辨率,解决传统传感器中存在的参数交叉敏感问题。 其他说明:文中提供了详细的建模步骤和代码片段,帮助读者理解和重现实验结果。同时,强调了在建模过程中需要注意的关键技术和常见问题,如网格划分、参数设置等。

    怎样健全员工福利体系.docx

    怎样健全员工福利体系.docx

    离职证明范本.doc

    离职证明范本.doc

    6538b79724855900a9c930904a302920.part6

    6538b79724855900a9c930904a302920.part6

    员工离职单.doc

    员工离职单.doc

    COMSOL中超材料异常折射仿真的关键技术与实现

    内容概要:本文详细介绍了在COMSOL中进行超材料异常折射仿真的关键技术。首先解释了异常折射现象及其产生的原因,接着通过具体代码展示了如何利用相位梯度和结构色散精确计算折射角。文中还讨论了边界条件的设置、网格划分的优化以及参数化扫描的应用。此外,提供了多个实用脚本和技巧,帮助提高仿真的精度和效率。最后强调了验证结果的重要性和一些常见的注意事项。 适合人群:从事电磁仿真研究的专业人士,尤其是对超材料和异常折射感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要深入理解和解决超材料中异常折射问题的研究项目。主要目标是掌握COMSOL中异常折射仿真的完整流程,确保仿真结果的准确性并优化计算性能。 其他说明:文章不仅提供了详细的代码示例和技术细节,还分享了许多实践经验,有助于读者更好地应对实际仿真过程中可能出现的问题。

    招聘工作数据分析表.xls

    招聘工作数据分析表.xls

    platform-tools-latest-windows.zip

    platform-tools-latest-windows.zip

Global site tag (gtag.js) - Google Analytics