home 首页 » 精彩日志 » 日志查看

再论代码之美——PHP实战

 2008-11-08 13:40:13 

原文地址:http://www.reiersol.com/blog/1_php_in_action/archive/169_more_beautiful_code.html

wulijun01234 译

自前些日子发表代码之美一文以来,收到了很多有趣的评论,一些人对我的观点提出了强烈的质疑。

那么我错了?是我扯远了?是我的判断能力出问题了?我承认我有时候会有意强调事物的优点而忽略了它的负面影响(或反过来,对一个谨慎的人而言,这是一个很好的练习)。

无论如何,我没有满口胡言。让我再次仔细地分析一下这行以前分析过的代码:

 

$this->assertThat($form->hasSelect(withName('statusConfirm'))->hasValues(),
    array('Yes','No'));
 

 

我的主要观点是它非常接近于简单的英语。不是所有的人都认为这是一个好事情,但是我认为人类更易于理解自然语言(事实上这是基因遗传决定的),而不是程序代码。因此,当代码接近于自然语言和表达式时,就能够方便人们的理解。我们正致力于创造或仿真出一种领域语言(DSL),它可以确切的表达出领域的需求,而不是技术实现的要求。

因此,我们做一个类似的试验,把这行代码翻译为一个简单的英语句子:

断言这个Form包含一个名为statusConfirm的选择菜单,它包含两个值:yes和no。

把这句英语句子重新翻译会代码,它可能像下面这样子:

 

$this->assertThat($form)->hasSelect()->withName('statusConfirm')->andValues('yes','no');
 

 

对于我而言,这行代码比原先的更接近于自然语言。我认为我们刚才解决的是一些和实现细节有关的语法问题,并没有让这个API变得更加易于使用。

同时它也说明了代码的实现方法:这些函数应该全部位于一个断言对象,它们接收各自的参数进行处理,并且最后返回对象自身,从而可以实现链式调用。这也就是众所周知的流式接口。

收藏:

评论:共 
7
 条
said   chill_gun 发表于2009-03-09 01:27:50

这一般都是用来动态加载config,setXXX()之类最后加上一个return $this, 怎么会出现楼上说的不能正常返回this. 你要再不放心自己加个异常抛出不久ok了
said   xxyyaabb 发表于2009-04-07 18:20:06

果然是高手!!!
said   zjstandup 发表于2009-04-08 14:42:12

js就用这种写法,php还没见过
said   haohappy 发表于2008-11-08 15:37:21

这种写法在单元测试里面可以用到,其它地方还是尽量不用。这种所谓流畅接口,写太长了代码一样不容易理解。
said   Altair 发表于2008-11-08 22:16:54

要是中间某个方法出错不能正确返回this对象的话调试起来挺麻烦的。这个写法看起来很爽用起来要特别小心
said   test 发表于2009-06-26 16:57:26

其实这个方法就是smalltalk 和 objective C的风格
said   zchare 发表于2009-09-02 15:18:38

不喜欢这么写代码 很浪费人的精力 并非那么好想象 还是规范的好
发表评论:
大名:*
网址:   http://sitename
评论:*