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

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 →

新的起点:远程创业团队

Road

9月初的时候,很幸运的加入了 Pragmatic.ly,随后来到了杭州,和偶像吃、住、工作在一起。啥感觉呢?看过中国好声音吧,就像一个学员加入某个导师的团队后,并且和他吃住在一起的那种感觉!

Pragmatic.ly 不是一个远程团队吗?怎么会在一起办公呢?我是暂时过来杭州,和大家在一起增进大家互相了解的。

享受工作

来到杭州后,感觉在这样一个团队里特别爽!我一直很崇拜这3位创始人,因为仅仅三个程序员就可以做出如此好的一个项目。他们的技术实力和经验就不用我介绍了,相信很多人都很了解。

团队氛围

3个人都特别好相处,没有架子、没有脾气、非常和蔼。在工作中遇到问题,他们不会责备,更不会埋怨,当然也不会很直接的告诉我解决方案。他们会给我一些引导,或者给我提供一些可选择的方案让我自己去摸索。因为我刚刚加入,有些地方还不适应,很多地方需要去学习和了解,而且自己很容易去钻牛角尖,效率非常低。他们从来都不催促我,就如此耐心的等着我自己去发现问题,解决问题,然后带着自己的想法和他们去讨论。

在讨论中,带着自己的认识,然后再去听听大家的建议和想法后记忆深刻。而且他们的热情爆棚,刚来杭州的一周,我每天拉着 Terry 讨论问题,各种各样的话题,从技术到产品、再到业界动态、技术圈的新闻。。。真的好多时候分不清是工作还是休息,那一个星期每天和 Terry 从天黑聊到清晨,直到发现太阳出来了才意识到该睡觉了。这段时间,真的成长了很多。

工程师文化

大家在工作中互相平等,尤其是在 code review 的时候。任何人写的代码都是要别其他成员 review 的,不论你在负责什么,不论你是不是创始人,不论你的技术有多么过硬,此时只有纯粹的技术和自己思路。很多时候需要指出别人代码中的不足,或者在讨论中坚持自己的思路。对于我来说,这可是对老大评头论足呀!这可是在老大面前坚持己见、顶撞老大哎!

......

Read more →

Spine Mobile --- Events

300ms click event

一个手机开发人员经常会出的错误是使用 click 事件。正确的做法:不要使用 click event。 因为 Mobile Safari 会有300毫秒的延迟来判定是否为点击操作还是可能有后续操作。

tap

使用 tap 来代替 click

直接使用 tap 来代替 click 事件:

class ContactsList extends Panel
  #Replace 'click' with 'tap'
  events:
    'tap .item': 'select'

  select: (e) ->
    item = $(e.target).item()
    @navigate('/contacts', item.id, trans: 'right')

当用户的手不离开的时候这个事件将不会被激活,同样这个事件可以被手指滑动所取消。

Events

......

Read more →

Spine Mobile --- Transitions

Activating Panels

激活 Panels ,正如我们在之前在关于Controller中使用 active() 函数完成。

calss ContactsList extends Panel
  # ...

list = new ContactsList
list.active()

默认情况下,它将不使用任何 transitions , 只是简单的显示 controller 。使用 transition , 需要把 trans 传入到 active() :

# Transition in form left
list.active(trans: 'left')

# Or, transition in from right
list.active(trans: 'right')

目前只支持两种 transitionleftright

Routes

Panels 经常由 routes 激活。Spine 允许传入一个自定的对象作为 @navigate() 的最后一个参数来激活 routes

@navigate('/contacts', trans: 'left')

{trans: 'left'} 然后将会被传入到 route callback

@routes
  '/contacts': (params) ->
    assertEqual( params.trans, 'left')

......

Read more →