浏览 20829 次
锁定老帖子 主题:Ruby Quiz
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-04-13  
zkj_beyond 写道
脚本语言可以写出十分灵活的代码。可它比较难懂

通常不会比Java程序更难懂,我觉得
0 请登录后投票
   发表时间:2006-04-13  
gigix 写道
zkj_beyond 写道
脚本语言可以写出十分灵活的代码。可它比较难懂

通常不会比Java程序更难懂,我觉得


是。代码难不难懂,取决于写程序的人,不在于语言本身。只有在编写者过分追求技巧的时候,才会产生那种写10分钟,看明白需要1个小时的代码
0 请登录后投票
   发表时间:2006-04-13  
跟语言还是有关系的,这就是语言的表达能力了

刚刚我看到小伙子在写一个函数,其中的参数表示超时,但是有一个缺省值,他写到:
if (options["timeout"]);
  @timeout = options["timeout"]
else
  @timeout = DEFAULT_TIMEOUT
end

但是如果写成

  @timeout = options["timeout"] || DEFAULT_TIMEOUT




是不是更可读一点呢?
0 请登录后投票
   发表时间:2006-04-13  
 @timeout = options["timeout"] || DEFAULT_TIMEOUT

这个是最简单的,但未必是最可读的。
毕竟,需要了解 null等于false这个特性。
从可读性来讲,不如:
int timeout = options.contains("timeout");? options["timeout"]:DEFAULT_TIMEOUT

当然,罗嗦了一些。
一般在条件语句中的各个条件中加括号的意思也是一样的,可以避免考察读者判断逻辑运算符的优先级的能力。
0 请登录后投票
   发表时间:2006-04-13  
charon兄你狡辩了,你这段代码明显没有potian代码更可读呀
0 请登录后投票
   发表时间:2006-04-13  
@timeout = options["timeout"] || DEFAULT_TIMEOUT

按我这个行业的习惯,这样写真的很成问题.一来||的左右求值序到底是那种并不确定,依赖于语言和编译器解释器的实现.第二,如果  options["timeout"] 如果是一个函数运算,这个函数是不是执行依赖于||另外一端的求值以及编译器是不是进行截断求值,非常的可怕的写法.
0 请登录后投票
   发表时间:2006-04-13  
Trustno1 写道
@timeout = options["timeout"] || DEFAULT_TIMEOUT

按我这个行业的习惯,这样写真的很成问题.一来||的左右求值序到底是那种并不确定,依赖于语言和编译器解释器的实现.第二,如果  options["timeout"] 如果是一个函数运算,这个函数是不是执行依赖于||另外一端的求值以及编译器是不是进行截断求值,非常的可怕的写法.


在c是个问题, 在ruby不是问题, 呵呵.
0 请登录后投票
   发表时间:2006-04-14  
写习惯就好了(意味着读者也习惯了)。C写法: flag |= option 不一样也习惯了吗:D

要是更多值在后面,差距就明显了。比如取a.b.c,如果链中有一个是空则返回空:

x = a && a.b && a.b.c

用if或那个三元运算符不给人郁闷死。

对于这种情况还是groovy的安全导航爽
x = a->b->c (语法总变来变去的,不知现在这样还行不)
0 请登录后投票
   发表时间:2006-04-14  
cookoo 写道
Trustno1 写道
@timeout = options["timeout"] || DEFAULT_TIMEOUT

按我这个行业的习惯,这样写真的很成问题.一来||的左右求值序到底是那种并不确定,依赖于语言和编译器解释器的实现.第二,如果  options["timeout"] 如果是一个函数运算,这个函数是不是执行依赖于||另外一端的求值以及编译器是不是进行截断求值,非常的可怕的写法.


在c是个问题, 在ruby不是问题, 呵呵.


c 有问题吗,10多年用下来好像还是第1次听说
0 请登录后投票
   发表时间:2006-04-14  
robbin 写道
charon兄你狡辩了,你这段代码明显没有potian代码更可读呀

不一定啊。
@timeout = options["timeout"] || DEFAULT_TIMEOUT

这句代码,其实缺少了几个必要的信息,而且,如果用在动态语言上的话,有可能带来其它的意外
1. 没有直接传递关于@timeout的类型信息
当然,写代码的人是知道的。而读代码的人,只能根据名称做直觉判断。虽然这里比较明确,但多数情况下,是不能够根据变量名准确判断出类型的,当然,严格的匈牙利命名法除外。
按照对称性的做法,如果options["timeout"]非null,则其类型应当为DEFAULT_TIMEOUT.但是这里没有给出DEFAULT_TIMEOUT的类型,所以需要跳转或前向索引.
这就相当于代码编写者为了把这个类型信息传递给代码阅读者,而迫使阅读者搜索这段语句之外的位置
2. 这里用到了逻辑操作中null等同于false的特性。这是一个双棱剑。当为null时,直接变成了
@timeout = null || DEFAULT_TIMEOUT,然后变成 false || DEFAULT_TIMEOUT,实际上已经破坏了前面的那种对称性。
不过这个不是最重要的。
问题是对于动态语言,实际上并不能判断出options到底是一个映射还是普通的类实例(此时timeout是一个属性),那么也不知道这是一个属性还是一个索引得到的值。如果options是一个映射,那不会有问题(其实也有问题,但只是类型一致性的事情)。否则,这里就必须对missing-property有一个隐含一致的处理方式,即必然返回null/false. 这在有些场合下是有问题的。
对于代码阅读者而言,必须确认这一点(毕竟去阅读代码的情形,或者是去理解,或者是去发现问题)。因此,需要对options对象作一个了解。
另外一个问题,接着前面前面T1大大的,这个options的属性求值会不会有副作用(一般是在missing-property的时候会作一些其它处理). 不过这个比较少见。


int timeout = options.contains("timeout");? options["timeout"]:DEFAULT_TIMEOUT

则没有上述两点的问题(当然了,上面这一段实际上也不是合法的java代码,不过改一下很快的),实际上是把隐含的东西明确化了。
罗嗦,但提高了可读性。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics