写点什么

Effective Ruby LiveLessons——Sam Phippen 访谈

2015 年 12 月 15 日

Sam Phippen 制作的 Effective Ruby LiveLessons ,是一系列讲解了专业的 Rubyists 的最佳实践的视频教程,它针对各个阶层的 Ruby 程序员。这个系列的视频基于 _Effective Ruby__,_Peter Jones 所著的有效的软件开发系列丛书之一。

视频教程包含了亲自示范,来帮助观看者理解每个项目是如何实行的。InfoQ 和制作者谈了一些有关视频中可以学到的课程,以及 Ruby on Rails 的最佳实践。

InfoQ: Nil被许多的Ruby程序员用于检查方法的返回值。你认为在检查方法的返回值时,是抛出异常好还是使用nil**** 好?

我之前确实有谈过这个主题;可以点击这里查看幻灯片。在这里使用 nil 的核心问题是 nil 没有一些其他对象含有的操作。这导致了从一个方法返回它的时候是有问题的。这样做强迫了调用方注意到你的方法调回对象没有按照相同的接口。这是非常有问题的。

说到抛出异常,我也并不非常确定这是一个好的解决方法。这完全取决于上下文。对我来说,这个问题提出的两个分支并不是很准确。当你在面对执行一个不可靠的方法时,我认为会有其他更好的选择。我会寻找一些明显意味着“空容器”或“默认值”的这类型的方法。如果不可能的话那我会看一些类似于选项类型实现的方法作为替代。

InfoQ: 你对于方法链以及遵从得墨忒耳定律的建议是什么?

得墨忒耳定律,是一项定律。但是,要注意:得墨忒耳定律经常被人误解。在我的 LiveLessons 上,我特别指出的是,这个定义让你在同一类型中点链。当我对得墨忒耳渐渐有更多了解时,对我而言它真正的意义在于:不要跨越体系结构的边界传递信息。这是比“不要点链”更难以表达解释的概念的一种方式。举例来说,我完全可以接受用方法链来建立活动记录范围。在那种情况下,你不仅不能跨越体系结构的边界,你事实上还只是在一个单独对象上修改状态。

所以我猜想,对,遵循得墨忒耳定律,但在你对它过于虔诚之前先了解它意味着什么。

InfoQ: RoR运用于网络空间的很大一部分。你认为它已经影响了多少在Ruby**** 和其他更严格类型化的语言中的异常相关最佳实践?

Ruby on Rails 使用各式各样的技术来处理异常情况。我不确定我是否赞同 Ruby 使用异常作为最佳实践。我会说,类型系统给了我们提前于运行时间的大量安全性,这是 Ruby 所不能提供给我们的,并且在那些地方,异常可以变得相当方便。

InfoQ:一个Ruby**** 开发者在测试他们的代码时应该更多依靠部件或行为测试吗?

当谈到写测试的时候,专注于建立一个为你和你的团队工作的测试结构是很重要的。确实,现代测试练习就是敏捷的一个方面。敏捷可以带给我们的最好的东西就是一套用来修改随着时间推移修改我们团队工作方式的工具。这就意味着我们的测试练习也应该随着时间不断变化。换句话来说,我认为各个应用程序和团队会影响是什么做出了最好的测试,而不是一些社区指令。

InfoQ:你可以给Ruby on Rails apps**** 中的数据资源使用监控提些建议吗?

使用 New Relic。New Relic 是让我成为一个好的顾问的秘诀所在。能够弹出那些图表以及获得大量的洞悉力是十分有帮助的。

InfoQ:你是如何看待在RubyRails中测试的?有抱负的程序员应该坚持使用RubyRails**** 提供的默认测试工具或者接触其他测试框架?

我在 RSpec 的核心团队中,所以很显然我这里的答案是很有偏倚的。我对“我应该使用哪一种测试框架?”的典型反应是:“这是视情况而定的。” Minitest 有一套非常集中和限制的功能,但是这对你没有关于 RSpec 的应用程序有一定的限制。也许你会发现那些限制有用,并且其本身应该使用 minitest。RSpec 是测试框架的一个强有力的庞然大物。我喜欢说,如果你能想象一个测试,你就可以在 RSpec 上写出来。为此目的,RSpec 让你编写和测试你想要的任何代码。这里可能会有的问题就是,你的设计是弱于它的。RSpec 也擅长于测试遗留代码,所以如果你有一个遗留的应用程序,这可能是好事。再次地,警告和取舍。选择一个适合自己的。

InfoQ: 你可不可以提供更多关于Ruby中的 ****lambda proc**** 的信息以及为什么两者只能择其一呢?

如果我必须要自己实际建立一个,我会一直使用 lambda。这就是去处理 lambda 如何得到堆栈帧相对于 proc。当你在 ruby 中创建一个块时,你总是要去分配一个 proc,所以那就是你要日复一日要去使用它们的地方。

InfoQ: 在编程中处理日期是在每种语言中最困难的问题之一。你对于日期时间库以及最佳实践给有抱负的 Ruby 程序员的建议是什么?

在我的 LiveLessons 上我给出了一个建议,但真实的答案会稍微复杂一点。这取决于你的应用程序、数据库以及一堆其他因素。更重要的是,最佳实践会随着时间不断变化。因此,我会建议查找目前的最佳实践并且实施它。

InfoQ:记忆—在Ruby中,这和其他设计模式对有抱负的程序员都非常感兴趣。你会给想提高自己的编程技能的新手到中级Ruby开发者除了LiveLessons**** 系列以外推荐什么呢?

看 Sandi Metz 的 Practical Object-Oriented Design in Ruby: An Agile Primer 。然后,再看一遍。当谈到处理对象时,Sandi 毫无疑问地搞定了。这本书将改变你如何永久编写 Ruby 并且向好的方向发展。

InfoQ:你看有哪些其他语言的坏习惯在大部分时间折磨着RoR**** 程序员呢?

过于势在必行。我认为这导致人们会认为他们不能提取对象并且导致系统设计不佳。每当我与初学者 / 刚进入 Ruby 的人工作时,我让他们比在其他方面我会做到的更经常地提取对象。这只是为了确保他们知道这样做是可以的并且它将铸成一个更好的系统。

InfoQ:你可以讨论一下在Ruby中隐藏继承层次如何运作以及如何与其他语言比如Java,在继承上进行比较?

简单地说,每一个对象都会得到一个单例类,这个单例类在继承链中是看不见和直接的。他可以被用来在不修改该类型的所有其他对象的前提下,在单独对象中添加方法。Java 没有这个,我猜测,因为你通常不会在 Java 中动态修改类?一个更完整的解释大概需要一千个单词,并且会覆盖 Ruby 中的大部分元编程架构。在未来,我可能会有一本书来把这个解释包含在内。

InfoQ:你能谈一谈Ruby**** 中的分代垃圾收集器以及在配置它时,开发者需要考虑的任何因素吗?

我真的从来没有配置过垃圾收集器。说实话,从我看到的来说,Ruby 核心团队一直在持续不断的工作,为了常见的(阅读 Rails)工作量来优化它。因此,对于内部构件我不知道太多。但是,这是关于 Ruby 的一件很好的事情。为了能够编写语言,我不需要去知道 GC 的内部构件。

关于作者

Sam Phippen是来自英国伦敦的一名传奇的电脑黑客。他在 Fun and Plausible Solutions 有限公司修正了各种大小的数据问题。他作为 RSpec 核心团队的成员,帮助争取正义的力量。他很难过,他不能拥抱每一只猫。

查看英文原文: Effective Ruby LiveLessons - An Interview with Sam Phippen


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015 年 12 月 15 日 17:095308
用户头像

发布了 217 篇内容, 共 51.4 次阅读, 收获喜欢 69 次。

关注

评论

发布
暂无评论
  • 如何管理第三方包?从包管理工具 luarocks 和 opm 说起

    本节我们就来一起了解下,应该从什么渠道来找到这些第三方库。

    2019 年 6 月 3 日

  • JRuby GUI MVC 框架 Monkeybars 1.0 发布

    很多JRuby程序库构建在Java GUI工具之上。Monkeybars就是一个用于构建GUI应用程序的JRuby MVC框架,目前已经发布了1.0版本。为此,我们采访了James Britt,来了解一下Monkeybars。

  • RubyEncoder:Ruby 混淆器和代码保护

    RubyEncoder可以编译和加密Ruby文件,以免他人盗用。也可以用来把应用程序限制到一个主域上或者设定一个期限,来创建试用版。InfoQ采访了RubyEncoder的领衔开发者Alexander Belonosov。

  • DevOps 中的工程师测试

    Clokie与 InfoQ进行了交流,讨论了她在测试领域看到的变化,以及拥抱DevOps原则对这一变化的进一步影响。

  • 重构到更深层的模型

    Paul Rayner使用一个案例分析了如何重构代码到更深层的领域模型。通过代码重构,结合模式实现,代码库更加粘合,也更容易推断,将一些常用任务的完成时间从几周或几个月缩短到几小时。

  • 如何避免移动测试自动化失败

    Nadya Denisenko说,移动开发中的测试自动化应该由Scrum团队完成;不要建立单独的测试自动化团队。

  • Rubinius 近期概况

    Rubinius正处在一个快速的发展的阶段,从最近的测试结果可以看出其性能的明显提升。JRuby团队成员的贡献了不少优秀的代码,并且对于Rubinius大肆褒奖,这种情况下是时候再次审视一下Rubinius当前的发展状态。

  • 不正经的计算机专业学生拍摄照片分享

    第一次参加InfoQ的活动,之前一直在其它平台发布一些自己的技术文章,很少有机会碰到这种照片分享的活动,至少在这类技术知识平台中,首先还是很感谢InfoQ的这次活动~希望InfoQ以后发展越来越好。

    2020 年 9 月 18 日

  • Ruby 之父:写 Ruby 时工作特别闲,总加班的人很难做出创造

    在近日于上海召开的 RubyConf China 站上,InfoQ 有幸采访了 Ruby 之父松本行弘先生。松本行弘先生是 Ruby 语言的设计者,投身编程行业已逾三十年。作为一门编程语言的创造者与推动者,他是怎么看待对于 Ruby 语言的褒奖与批评?又是怎么看待 Ruby 与 Java 语言的对比?对于日本的 IT 产业现状与 996 的加班问题,他又抱有怎样的看法?

  • 国庆策划 | 关于深度学习推荐系统,我有这些资料想推荐给你

    你在推荐、广告、搜索这些相关领域学习的时候,有没有读过一些非常不错的技术书?今天,我想和你分享一些我认为不错的学习资料。

    2020 年 9 月 30 日

  • Go 语言的过去、现在和未来(英文演讲)

    演讲嘉宾David Cheney,Heptio 资深工程师、著名Go语言专家内容介绍Go was introduced as a new open source language on November 10th, 2009. Go is a language for engineering teams who seek to build fast, scalable, and most importantly maintainable, software. This talk will reflect on the success Go has enjoyed over the past nine years, and give the audience an overview of the four new additions coming to Go 2.0; dependency management, error handling, error values, and generics.

    2018 年 11 月 9 日

  • ActiveHibernate:使用 JRuby 实现 ORM

    ActiveHibernate项目为JRuby带来Hibernate的强大特性——特别是对一些ActiveRecord力所不及的棘手ORM用例尤其有用。为此我们采访了项目的维护人Johan Andries,详细了解该项目的一些情况。

  • 第一篇 InfoQ 的博客

    简洁的InfoQ写作平台

    2020 年 5 月 7 日

  • 如何跨越 Ruby 团队沟通中的语言障碍?

    Charles Nutter在Ruby社区中指出:以日语和英语为母语的成员之间,依然存在着语言沟通的障碍。这引发了新的问题:什么样的工具可以帮助我们解决目前的语言沟通障碍?

  • Greg Finzer 谈 Compare .NET Objects

    编写对象比较的代码可能非常枯燥,特别是在处理大对象或者深度图的时候。在类变化的时候错误通常会偷偷的溜进去。减少潜在错误的一种方式是依赖于类库,例如Greg Finzer的Compare .NET Objects。该类库为多达1万个对象的比较提供合理的性能。

  • CodeGear 发布 Ruby/Rails IDE——3rdRail:纳入动态方法智能完成功能

    CodeGear刚刚发布了他们的Ruby/Rails IDE 3rd Rail。该IDE的关键功能有智能代码自动完成,支持重构,还提供一个能够感知项目名称的命令行界面。

  • 重塑“类型思维”

    2019 年 7 月 17 日

  • MagLev:Gemstone 基于 Smalltalk 虚拟机构建 Ruby 运行时

    OODB厂商Gemstone正致力于名为MagLev的Ruby虚拟机的开发。来自Seaside和DabbleDB的Avi Bryant帮助Gemstone来基于Smalltalk虚拟机的Ruby运行时,以提供性能和强大的持久性等特性。我们访问了Avi Bryant和来自Gemstone的Bob Walker,了解到MagLev背后的技术以及今后的计划。

  • Go 语言简介:历史背景、发展现状及语言特性

    2019 年 3 月 4 日

  • Practical Go

    演讲嘉宾David Cheney,Heptio 资深工程师, 著名Go语言专家内容介绍Go is a language designed for engineering teams. It’s central themes are simplicity, readability, and maintainability. This talk will provide best practice real world advice for teams building projects in Go covering five areas; idiomatic code, package and api design, error handling, concurrency, and testing.内容大纲Identifiers Choose identifiers for clarity, not brevity Use a consistent declaraton style Package Design A good package starts with its name An identifier’s name includes its package name Prefer lower case package names and import paths Rather than nesting deeply, return early Make the zero value useful Eschew package level state. No package level variables. Avoid global side effects. Project Structure Consider fewer, larger packages Arrange code into files by import statements. Prefer nouns for file names. Eschew elaborate package hierarchies, resist the desire to apply taxonomy Keep package main small as small as possible API Design Design APIs that are hard to misuse. Design APIs for their default use case. Prefer var args to []T parameters Let callers define the interface they require Prefer streaming interfaces Use type assertions for optional behaviour Error handling Elminate handling by eliminating errors Only handle an error once Concurrency Never start a goroutine without when it will stop. When sending or receiving on a channel, consider what happens if the other party never receives the message Keep yourself busy while waiting for a goroutine. or, do the work yourself. Leave concurrency to the caller

    2018 年 12 月 18 日

发现更多内容

架构师训练营学习总结——面向对象的设计模式【第三周】

王海

极客大学架构师训练营

week02-总结

seki

架构师 0 期第二周作业(心得体会)

何伟敏

Mybatis-plus 之 DIP

无心水

极客大学架构师训练营

设计模式的主要原则

架构师培训第2周学习总结

Geek_165f3d

第二周学习总结

安阳

SOLID设计原则(第二周+作业)

林毋梦

极客大学架构师训练营

架构师训练营 0 期第二周

Blink

【架构】—回归本质(面向对象)

不二架构

面向对象 架构师 极客大学架构师训练营

第二章作业

小胖子

架构师如何去进行软件设计(设计原则篇)?

阿飞

极客大学架构师训练营

架构 0 期 -week2- 命题作业

陈俊

极客大学架构师训练营

第二周总结

阿布

软件架构的实现设计总结

mh

第二周 作业

尔东雨田

设计原则之依赖倒置和接口隔离

dapaul

架构师训练营-第二周学习总结

极客大学架构师训练营

【第二周作业】

黑莓

架构训练营第二章作业

mh

小师妹学JVM之:JDK14中JVM的性能优化

程序那些事

JVM 「Java 25周年」 小师妹 JIT JDK14

架构师训练营 - Task Week 2

brave heart

极客大学架构师训练营

一笔钱买两次东西?——双花安全问题分析

石君

数字货币 双花攻击 数字货币安全

依赖倒置及 Cache 重构设计

秤须苑

极客大学架构师训练营

架构师训练营 - Lesson Week 2

brave heart

极客大学架构师训练营

【架构课作业 - 第二周】

Nelson

极客大学架构师训练营

极客大学架构师训练营 框架设计、设计原则、设计模式 第四课 听课总结

John(易筋)

极客时间 极客大学 极客大学架构师训练营 设计原则 框架设计

【第二周学习总结】

黑莓

编程这件事

dapaul

架构师训练营-总结2

进击的炮灰

架构师训练营第二章 总结

尔东雨田

Effective Ruby LiveLessons——Sam Phippen访谈-InfoQ