Articles tagged 'ruby'

从测试中找到更好的面向对象设计(四)

继续前一篇文章,我们实现了 EmailRepliesController ,但是我们抽取了一个新的类 EmailHandler。接下来,我们来完成这个新的类。

#handle-test

和刚才的思路一样,我们不在乎它是如何做 validation 的,我们只需要知道有效的时候会创建 comment,无效的时候不会创建 comment。

......

Read more →

从测试中找到更好的面向对象设计(三)

到目前为止我们还没有写任何一行代码,但是 test 让我们望而却步无法继续。很多时候大家讨厌写 test ,或者放弃决定不做 test 都是从此时开始。一开始说过,测试将会反映出我们的设计模式,那么此时我们从测试中可以发现些什么呢?

Test reflect the design.

我们严格按照业务逻辑写完的 specs ,在这里每一个 context 都意味着在我们的实现代码中会产生一个 if statement ,每一个嵌套的 context 也就意味着 if statement 的嵌套。

每一个在描述中提到的 object 就将是我们实现代码中需要与之交互作用的。

所以经过我们按照我们目前想像的业务逻辑可以画出这样一张图:

test-reflect-design

在这里我们把所有的业务都交给 EmailRepliesController#create 来做,所以就会有这样的结果。具体的问题大致如下:

  • Structural Coupling!
  • Controller 做了太多太多的事情。
  • Controller 知道了太多太多的细节。

发现问题,解决问题。越早的发现问题,我们就会越少的面临难题。在我们还没有写任何一行实现代码的时候就开始重构(Structural Refactoring),或者我更愿意称之为重新设计(Re-Design)。

......

Read more →

从测试中找到更好的面向对象设计(二)

Working Flow of the new feature of pragmatic.ly

working-flow

  • 在 Pragmatic.ly 项目中当有一个 Comment 被创建后,我们的 Web Server 会告诉 SendCloud (第三方 Email 服务,类似于 Mailgun) 给我们的用户发送提醒邮件。
  • 当用户回复这封提醒邮件的时候,首先这封邮件会被 SendCloud parse 后,发送一个 post request 到 Pragmatic.ly 设置好的 Callback url.
  • Pragmatic.ly 接收到这个 Pull request 后会做一些 verification 和 validation ,然后在 Web Server 上创建一个 Comment records 。

我们 TDD 开发主要是在第三步,当 Web Server 接收到 pull request 后的业务逻辑。那么当一个 pull request 被发送到 Web Server 后,我们需要什么样的业务逻辑呢?

1. Verification 首先我们需要判定,这个 pull request 是来自与 SendCloud 。

......

Read more →

从测试中找到更好的面向对象设计(一)

OO © thumbs.dreamstime.com

Discovering Better Object Oriented Design with Test. 我知道很多团队中不写 Test, 不是因为不会写测试,而是觉得测试写起来很麻烦、很痛苦, 不愿意写测试;我也知道很多程序员不关心设计模式,什么面向对象之类的都不在乎,只要代码能工作就好。

我从 PHP 转过来的时候就是这样的感觉,当时 PHP 也没有学好,不懂得什么叫面向对象,更不知道什么叫做测试。只是写代码,写完后在浏览器上看一下,如果可以工作,大功告成!

转到 Ruby 后,接触到了 Object Oriented Design Pattern 和 TDD,开始觉得这些我都不再乎,但是随着不断的深入以及项目复杂度的不断提升。我发现这些技能非常受用。

Hate to write Tests.

首先我们来聊聊 Test. 一说到 Test, 第一反映就是测试可以保护我们代码的有效性。那么我们又为什么不愿意写测试呢?

  • 有时候业务逻辑太复杂不知道怎么写。
  • 有些时候测试写到一半的时候由于太复杂枯燥,写不下去了。

因为这两个因素导致我经常会在写测试上浪费大把大把的时间。所以我相信有很多人跟我一样会选择在写完实现代码后,再去补上我们的测试。但是 TDD 强调的是测试先行,那为什么很多人愿意忍受这样的痛苦去在测试中浪费那么多的时间和精力呢?

......

Read more →