论坛首页 编程语言技术论坛

一知半解用ruby开发

浏览 7206 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-23  
  从第一次接触ruby & rails到现在有段时间了,本着一贯快学快用习惯,看了一遍书之后就开始用ROR做了些小项目,边做边查,边学边忘,到现在还是没有记住几个ROR的特征关键字,比如什么约定阿,约束什么的,也分不清为啥有symbol这么奇怪的物件。更加不清楚yield到底怎么起作用的。
  不过这些并不妨碍用ROR去开发项目。我只要知道怎么用就行. 接下来说说我是怎么用ROR的.觉得乱的就跳过好了.因为不完全懂得ROR,如果有用错词,见谅.想到那里写那里
 
   each, each的使用频率很高,如果代码中需要循环,基本上就是each,偶尔用用times,在极为少见的情况下才用step.虽然我知道each在语义上是一个迭代器, 不过我都是当作循环函数来看待的,一个用起来简单的循环函数.
 

   大部分情况,我的each代码都会写成 each do ...end 最近才开始用 each {|x| ...}这样的简单用法,想想也奇怪,明明后面的写法可以少打很多字,为啥一定要固执的用前面的那种写法呢.
  
   我知道有其他的循环代码的写法,不过我没有记住怎么做的,反正不知道也没有关系. each time,step几个够用了.

   unit test,一开始的时候我还耐着心思写了不少的unit test,不过到后来,越写越迷糊.这个单元测试的粒度到达多大才合适,以及unit test到底测试什么,为什么要测试那么的代码成功被执行是怎么样的,不成功执行又是如何如何。最终也就不了了之了,现在倒是考虑需要一个整体的功能性的测试脚本。

   运行环境,一开始依然是顽固的采用了windows环境,现在还有个项目一直运行在windows环境上,运行了也有2年了吧。虽然也没有出什么意外吗,不过不比不知道,linux环境下,这个运行速度居然相差如此之大。
 
   YAML,ruby有不少的地方用到这个,我第一次考虑在代码中用这个,是因为需要保存一些类似脚本的数据,需要额外配置,配置的时候甚至还需要设置一些简单的逻辑。于是用YAML,初期还是可以凑合着用的,不过一旦配置文件的逻辑复杂起来,这个就不行了。YAML保存数据还行,加入过多的逻辑就不行了。

   DSL,于是接下来就是DSL了,网络上搜索了一大堆的Ruby DSL的教材,最后突然发现,我要的是类似AR的DSL写法 has_one,has_many,直接的把AR::Base的文件结构复制了一份,去掉不需要的代码,保留了一个has_one,然后开始写自己的DSL,然后很长一段时间内,都是has_one这样用法的DSL脚本。

  DSL的加载,development模式下,其他的rb文件都是修改后马上可以生效的,页面刷新下就可以了。不过DSL加载后,修改对应的rb文件,刷新页面无用。每次都是关掉WEBrick,再开才有效。
 
  这样写好像过于流水帐了,下面的开始选择项目中的某个方面,讲讲从项目初期到最终的时候是怎么变化过来的。
 
   讲讲项目中log输出的前后变化
   发表时间:2008-10-24  
ruby开发和rails开发毕竟不一样,rails经验丰富的人对ruby开发也不一定了解。
0 请登录后投票
   发表时间:2008-10-24  
jack 写道
  ...大部分情况,我的each代码都会写成 each do ...end 最近才开始用 each {|x| ...}这样的简单用法,想想也奇怪,明明后面的写法可以少打很多字,为啥一定要固执的用前面的那种写法呢....
 

用do...end可以避免歧义。因为如果是空的{}既可以理解为空的hash也可以理解为空的block。当然在这里each不接受参数因此就没有歧义。用do...end可以显式说明是block。

例如以下这段代码,不同版本的ruby可能有不同结果:

def test(a = nil)
  puts "hash" if a
  puts "block" if block_given?
end

test {}
test{}




jack 写道

   YAML,ruby有不少的地方用到这个,我第一次考虑在代码中用这个,是因为需要保存一些类似脚本的数据,需要额外配置,配置的时候甚至还需要设置一些简单的逻辑。于是用YAML,初期还是可以凑合着用的,不过一旦配置文件的逻辑复杂起来,这个就不行了。YAML保存数据还行,加入过多的逻辑就不行了。
 

如果配置文件逻辑负杂,干脆就直接用代码好了,用的时候load进来。

jack 写道
  DSL的加载,development模式下,其他的rb文件都是修改后马上可以生效的,页面刷新下就可以了。不过DSL加载后,修改对应的rb文件,刷新页面无用。每次都是关掉WEBrick,再开才有效。


在rails 1.x中,可以用include Reloadable, 2.x中好像可以通过配置解决reload问题。


既然选择使用Rails,那么就投入点精力好好研究一下Ruby还是很有必要的 :)



0 请登录后投票
   发表时间:2008-10-24  
多谢指点了,不过大部分情况我还是坚持够用就行的开发方式
0 请登录后投票
   发表时间:2008-10-24  
jack 写道

   大部分情况,我的each代码都会写成 each do ...end 最近才开始用 each {|x| ...}这样的简单用法,想想也奇怪,明明后面的写法可以少打很多字,为啥一定要固执的用前面的那种写法呢.

因为用each {|x| ...}方式来写的话一般比较简单的比如只有一行代码的可以这样用
否则,多行代码还是用each do ...end来写可读性比较好

jack 写道

   unit test,一开始的时候我还耐着心思写了不少的unit test,不过到后来,越写越迷糊.这个单元测试的粒度到达多大才合适,以及unit test到底测试什么,为什么要测试那么的代码成功被执行是怎么样的,不成功执行又是如何如何。最终也就不了了之了,现在倒是考虑需要一个整体的功能性的测试脚本。

你不用rspec吗?
Model、Controller、View、Helper、User Stories for Integration Testing这几个层次的测试都覆盖到了
Spec::Rails
0 请登录后投票
   发表时间:2008-10-24  
不是工具的问题,是测试粒度大小的问题,还有怎么测试。

model的函数,要测试吗,controller用到了这个model的这个函数,要测试吗,view中呢,都要一层一层测试吗。 测试那一层才是最有必要的?
0 请登录后投票
   发表时间:2008-10-24  
jack 写道
不是工具的问题,是测试粒度大小的问题,还有怎么测试。

model的函数,要测试吗,controller用到了这个model的这个函数,要测试吗,view中呢,都要一层一层测试吗。 测试那一层才是最有必要的?

一点个人感受:
1.如果非要选一个“最有必要”的层。我觉得肯定是model。
2.粒度方面。。各路神仙都说过了,单元测试,单元!model测试测model,测controller的时候,对model调用进行mock,只测controller的逻辑。view测试?貌似在目前国情条件下,可以放一放。只不过~到了现实环境,似乎大多是controller的测试都到model转了一圈。mock大家都懂,实际有多少人愿意mock controller中所有model的调用。直接调用下,多happy,慢就慢点吧。。。:)
3. 见1
0 请登录后投票
   发表时间:2008-10-25  
我记得在ruby cookbook上写到
each do ... end主要是注重循环的过程,而each{}好象注重循环的结果吧

PS:有个问题想问问大家,是不是rails开发都要写测试啊?只写过一次测试
0 请登录后投票
   发表时间:2008-10-25  
不是流氓 写道
我记得在ruby cookbook上写到
each do ... end主要是注重循环的过程,而each{}好象注重循环的结果吧

PS:有个问题想问问大家,是不是rails开发都要写测试啊?只写过一次测试


do ... end 和 {} 是一回事,只不过在ruby的代码风格上来说, 如果在block内部分行的话就用 do ... end,如果不分行的话就用 {}
0 请登录后投票
   发表时间:2008-10-25  
robbin 写道
不是流氓 写道
我记得在ruby cookbook上写到
each do ... end主要是注重循环的过程,而each{}好象注重循环的结果吧

PS:有个问题想问问大家,是不是rails开发都要写测试啊?只写过一次测试


do ... end 和 {} 是一回事,只不过在ruby的代码风格上来说, 如果在block内部分行的话就用 do ... end,如果不分行的话就用 {}


do ... end 和 {} 有优先级的区别,比如
foo p1,p2 do ... end
foo p1,p2 { ... }

do ... end的优先级比较低,它是作为foo的block被调用的
{...} 的优先级高,它是作为p2的block被调用的
0 请登录后投票
论坛首页 编程语言技术版

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