赛迪网 > IT技术 热点推荐 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Martin上海演讲实录2:现场演示Ruby编程

发布时间:2006.06.26 17:25     来源:赛迪网    作者:

2006-6-6,上海交通大学,Martin Fowler先生神采奕奕,精神状态比在北京的敏捷技术大会要好了很多。下午2:00,他准时赶到“上海敏捷专家论坛”现场。讲台上的他,一边激情的做着演讲,一边现场演示着程序,一边响应着专家们的提问,还不时的还接受着粉丝们的签名合影请求。

以下内容由韩锴翻译整理。

早已是大师的Martin,现场与观众一起体验了Ruby编程。

现场演示Ruby编程

我们现场有多少人使用过ruby进行开发?很惊讶,只是个别人。所以很多人还没有见过ruby,这就是我带笔记本来的原因了。我将演示一下我们究竟能用ruby做什么。这样的话,我们将会对这个语言有一个认识。我现在把话筒放在一边,放好我的笔记本电脑。

Ruby是一种立即执行的脚本语言。接下来在编辑器环境中新建一个源代码文件。

这个控制台的窗口不会被经常用到,不用担心,我可以键入这个文件的名称,然后运行它。我同样可以在编辑器里做这件事情,把它打印在其他的文件里面。我们现在要做一个小程序。这里是一些数据图表,把它想象成是每个国家的图表,包括:失败图表(fails figures),执行图表(operating figures)等等。这些可能是业务人员每天要关注的事情。现在我们把第一项想象成地区,第二项想象成预期的销售额,第三项,想象成实际情况。那么现在这些业务人员提出了一个要求,让我打印出这些数据,并且显示出预期值与真实值之间差别的百分比。所以我们需要花一些时间完成这个工作。

我们要做的第一项工作是读出这个文件,并且把它显示出来。我在一开始会比较慢的展示应该怎样做。(输入代码)这会是一个比较简单的版本。它现在能够把文件的内容显示出来了。我下面来解释一个这里的语法。这里有一个File类,有个方法是open。在这里并没有在参数外面加上括号,不过如果需要的话可以在这里加上,程序依然能工作。括号在ruby编程中是可以选择的,这看起来不是一个很重要的语法点,但是很多时候,这是非常重要的,比如在接下来的编码中,或者是其他的一些脚本。之后这里有一个非常简单的while循环。我们结果一个局部变量line. 同过getline得到这个变量。记住,只有在需要的时候才去声明这个变量,我们不预先声明。之后我们输出这一行,然后关闭文件。

但是,我已经说了,这不是用ruby实现这个功能的方式。通常,你会这样做。这里出了一个错误。Ruby有一个非常好的帮助系统。我们在这里察看一下错误究竟出在哪里。我确实记不起来了。不过可以看一看以前写过的。这样的编程是非常危险的,因为你需要知道你在做什么,同时要把你正在做的东西表达出来。这是非常难的,我很少这样做。所以这里,我正在做的这个事情,就这个语言来说是非常老练的(sophisticated)。这里对于文件的每一行进行了操作。这一部分是文件的closure. 这里是说,在do和end之间执行这一段非常短的代码。在每次执行命令的时候,都执行一次。把一段代码作为参数传入一个function,这在编程语言中是非常常见的。在smalltalk中是如此,那么在java中的也是,匿名方法(anonymous method)。C#中的代理从根本上来说也是这个道理。closure是ruby的一个特点非常强大的特点。如果你经常使用ruby的话,你会发现,这种closure有非常非常多的应用。在这里使用这种方式的好处是,它可以对你传入文件名的每一个文件的每一行执行这个操作,在执行完之后会关闭文件。如果不用这种方法,你必须要每次执行完操作就关闭文件,这就形成了一系列的事务,在做完一件事情的时候要去做下一件。使用这种匿名方法的方式就可以避免这个问题。

接下来要做的事情是,把这一行输出放入一个对象里。在这里建立一个类,名字是performance. 现在给这个类建立我们需要的figure, 名字是attr_assessor, 然后定义name amount 和actual, 这里实际上定义了我们需要显示的三个值。这里我就可以对我的循环里的代码进行改变了。

P = performance.new

p.name = line.split(‘,’)[0] 这里行可以用逗号分隔,然后我们得到其中的第一个。之后我们输出p,这里我们看到输出的是p这个对象本身,而不是我们希望的值。在java中,我们可以定义一个字符串类型。但是在ruby里面,我们定义一个def to_s函数, 使它返回name的值。现在,我们在输出结果里面,就看到我们真正想要的name了。所以,我们可以看到,建立一个我们需要的类是非常容易的。接下来,我们可以把这个类改为真正的面向对象风格。我们需要结果返回一个数组。Read方法的是返回result这个数组。(进行了一系列代码的动作,调试,忘记把p加入到result数组中了)这样就得到了正确的结果。我们有一些值需要放入我们的这个类里。通过这样做,我们就可以实现了。这里line.split(‘,’)会返回一个数组。这一句代码执行了复合的操作。每一个变量,对应到数组中的不同的值。这是脚本语言的一个特点。所以,在返回字符串的函数里加上plan,加上actual. 再次查看结果,我们就可以看到我们想得到的所有值了。

现在来看我们的代码是很有条理的。那么我们可以加入计算的功能了。定义一个variance方法。返回(actual -plan)/plan * 100,这样我们就得到了百分比。(写了一系列代码)这时候我可以确定代码是不能运行的,因为现在这些值都还是字符类型(写了一系列代码)。所有的脚本语言都有一个共同的问题:没有异常机制的。但是可以通过其他方式处理错误。现在来看一看结果,我得到了极限值。这里是因为我忘了加入浮点。这样的话结果就是正确的了。不过,我们得到的输出是很难看的。我们即将使用Ruby的格式化字符串的机制。(写了一些代码使输出变为小数点后一位。)接下来输出国家名,这样我们就可以看到完整的显示了。在格式化字符串输出的这段代码里面,就像C语言里面一样,可以对输出进行格式化。

现在程序还是有一些问题,不过我们要继续看下一部分了。在perfs加入排序。这里通过variance进行排序。(写了一些代码)现在显示的结果是按照variance进行排序的了。我们需要知道的最重要的是这一行代码。这是ruby中closure的使用。我把数组放在raw_perfs里,它按照特殊的域进行了排序,然后对他进行了另一个操作。在集合上进行了操作的叠加。在ruby里,对collection的这种操作,使ruby成为一个非常简洁的语言。无论是对smalltalk还是对list,对对象这样的操作都是相似的。但是,当你还没有使用这种语言的时候,它看起来并不普遍。但是你一旦开始利用这种特性,它将会变得非常强大,因为你可以方便的使用你的meta进行操作。


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· Martin上海演讲实录1:Ruby是一个非常好的开 (06-26) · 郭晓主题演讲:敏捷技术在中国 (06-26)
· 软件开发教父Martin Fowler敏捷技术专家论坛 (06-26) · 敏捷成就软件价值:软件工程大师传道软博会 (06-05)
· 网上直播:首届“敏捷中国”开发者大会 (06-03) · Scott Shaw主题演讲:SOA塑造敏捷企业 (06-03)
· Liv Wild主题演讲:一种高效的项目启动方式— (06-03) · 现场互动问答 (06-03)
· Martin Fowler 简介 (06-03) · 聊天:Martin敏捷释放软件价值 (06-03)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管