在Java8的Lambda出现以前,编写一个Strategy策略模式可能要写多达5个类以上,即使使用了匿名类能把类的数量压缩到3个,但是其中的缛节代码(boilerplate code,如创建匿名类时必须要写的啰嗦代码)也会让程序员不胜其烦。2014年3月新推出的Java8所提供的Lambda函数式编程特性,则能让上述工作所需要的类减少到1个,且把其中的缛节代码减少到像数学公式那样简洁。
另外,Lambda表达式在操作集合数据的挑选(挑苹果)、处理(贴标签)和计算(榨果汁)方面,能像编写SQL查询语句那样,仅仅表达所要做的意图,而无需关注具体实现,从而让集合数据操作代码大大减少,且富有表达力。
8位程序员在bjdp的第19次编程道场针对上述两个方面的编程操练中,亲身体会到Java已经峰回路转,面目一新,变得前所未有的轻盈和畅快。
感恩ThoughtWorks的肖然、方婷婷、任蕙和李小康帮忙为本次活动提供场地与支持!
* 时间:2014.10.19, 2:00-6:00pm
* 地点:ThoughtWorks北京办公室
* 参加人数:8人
* 活动主题:用变得更轻盈的Java8重构到Lambda
* 编程环境:Java8, Maven3.2.2, JUnit 4.11, Fest 1.4, IntelliJ IDEA
* 伍斌完成该题目的源代码链接:https://github.com/wubin28/katas-java8/tree/2014-10-17
* 编程操练题目描述:本次活动的编程题目取材自Raoul-Gabriel Urma, Mario Fusco和Alan Mycroft所著的新书Java 8 in Action。题目1:将从一堆苹果中挑出绿苹果和大苹果的需求,用Java代码实现,并重构到Lambda;题目2:用Lambda表示式实现“显示重于90克的苹果的品种名称,并按重量的倒序排序”。
活动过程
1. 各位匠友自我介绍与编程中所面临的问题收集
2. 伍斌现场编程演示,并邀请匠友结对编程,从零开始编写代码 -> 去除重复代码浮现出Template Method设计模式 -> 再重构至Strategy设计模式 -> 再用Anonymous class进行重构以消除2个实现类 -> 再用Method Reference进行重构以消除缛节代码 -> 再用Lambda表达式进行重构 -> 最后使用Java8提供的Predicate接口来将类的数量减少到1个。
3. 伍斌 现场编程演示用Lambda表示式实现“显示重于90克的苹果的品种名称,并按重量的倒序排序”。
回顾要点
Well
* 开阔了眼界。
* 实践、pair非常好。
* 根据代码来进行活动,直接,感觉好。
* 讲如何根据问题进行TDD编码以及如何跑测试非常好。
* 从实践入手,将编程习惯从原始改为先进,较透彻。
* 主题清晰,结合实际。
* 实战。解决理解不深入的问题。
Less Well
* Pair过程中时间紧张,需要和周围其他人交流,7分钟不很够。(Ben嘴Ben舌:7分钟是一个肯定做不完题目的时间,所以这个过程的重点不在于编了多少代码,而在于是否刻意地操练了某些技能。)
* 分享中互动环节稍微少了些。
* 其间所举的例子可以更接近实际项目需求。
* 能否把过程录下来以后看?因为过程比较长,时间久了会分神。(Ben嘴Ben舌:以后会融入更多的匠友的结对编程。)
* 设计模式的强调不够力度,或者需要参与者具备较强的设计模式的掌握能力。对新技术追求较深,但不一定适用于当前实际。
Puzzles
* 到了职业生涯十字路口该如何选择?是走技术路线,还是业务路线?
Ben嘴Ben舌:自己适合走那条路线,只有自己尝试过才知道。尽管去尝试,不喜欢再换。比如我,曾经尝试走管理路线,但发现自己不喜欢,就回过头来继续走技术路线。
* 开发很混乱,管理有问题,领导拍脑袋,这些该如何解决?
Ben嘴Ben舌:佛家说,人有三毒“贪、嗔、痴”,即贪婪、易怒和无知。而贪婪和易怒都来自无知。我认为,开发和管理的混乱,也同样来自领导和团队成员的无知。所以要解决这些问题,需要“戒、定、慧”,即戒贪、专注和悟道,这里的关键是领导和团队成员都要努力悟出软件开发的大道。
* TDD如何用在工期紧和团队水平参差不齐的情况下?
Ben嘴Ben舌:团队水平参差不齐,需要创造结对编程的环境和条件来传播知识,以达到水平一致。当TDD的水平提高后,自然会加快进度和质量,以应对工期紧的挑战。磨刀不误砍柴工。参见:"TDD能让软件开发变快的三个理由":http://mp.weixin.qq.com/s?__biz=MjM5MjEwNTEzOQ==&mid=200021327&idx=1&sn=25edf67035d060dd9481f89ef6dc575e#rd
* 遗留系统如何运用TDD?在遗留大系统上编写自动化测试代码,感觉无从下手,该怎么办?
Ben嘴Ben舌:从为遗留系统添加新特性和修复bug入手,先根据与其相关的用户意图编写测试代码,必要时编写stub或mock,修复编译和运行错误来编写生产代码,让测试运行通过,然后在测试代码的保护下识别代码腐臭,重构生产代码,最后根据“道”全面重构测试代码和生产代码。详见Ben的拙作《驯服烂代码:在编程操练中悟道》正在china-pub.com互动出版网上预售(http://product.china-pub.com/3770634#sz),2014年11月6日前后能到货。
* Lambda如何运用于Java?
Ben嘴Ben舌:这次操练能看到Lambda能够帮助Java程序员简化Strategy模式和集合操作的代码。
* 程序员不写单元测试该怎么破?
Ben嘴Ben舌:首先需要分析他们不写单元测试的原因,然后根据原因对症下药。主要的原因大概有3个:1)缺乏编写单元测试的技能,此时可以通过结对编程、参加编程道场活动和阅读TDD书籍来解决;2)缺乏编写单元测试的观念,此时可以用一些比喻和带有感性而不是理性的观念来影响开发人员,比如“对付耍流氓:编程不先写测试会出人命!”(http://mp.weixin.qq.com/s?__biz=MjM5MjEwNTEzOQ==&mid=200701791&idx=1&sn=050ef36a0230cec53aa10499ac4b1928#rd);3)缺乏编写单元测试的土壤,比如公司濒临倒闭,士气低落,此时就好比一个病人病入膏肓,无可救药了。
* bjdp.org的活动能否持续办?有关Java8方面的内容可以多办几次。
Ben嘴Ben舌:bjdp.org的活动从2013年4月开始搞起,到现在已经办了一年半,共计19次活动,到2014年底之前计划还有两次活动。这些活动逼迫我进行刻意的编程操练,在提高编程技艺的同时,也悟出了一些编程心得,捧出了拙作《驯服烂代码:在编程操练中悟道》,结交了许多同道匠友。这些实实在在的好处,都在不断鼓励我继续把活动办下去,而且永远免费。Java8乃至以后版本的新特性一直都是我密切关注的,会在以后的活动中得以体现。
* 能否对当下流行的应用较多的项目,做一下应用示例和对比,如MangoDB vs Cassandra,来研究一下这样深入些的话题?
Ben嘴Ben舌:好建议。我会继续关注流行的技术,并融入编程道场中。
* 将TDD应用于项目级的应用和我们在编程道场中的这种小例子的应用,应该注意哪些地方?
Ben嘴Ben舌:徐志摩翻译英国诗人布莱克的诗句:“一沙一世界,一花一天堂”。通过一个小例子,就能体悟到大项目的“道”,两者是相通的。
* 感觉对新技术的理解只能停留在表面如何使用上,需要回去消化。如果能有演变历史的介绍最好。
Ben嘴Ben舌:最好的消化就是自己动手编程操练。
* 自组织团队需要具备的客观条件是什么?
Ben嘴Ben舌:个人认为是团队上下对“我们工作中的问题更多属于社会学范畴,而非技术范畴。”观点的认同。详见:“工作问题更多属于社会学而非技术范畴——评《人件》第3版”,http://mp.weixin.qq.com/s?__biz=MjM5MjEwNTEzOQ==&mid=200666981&idx=1&sn=87f944737d76e8feb63940aad9e9380a#rd
* 好像每期语言并不固定,这样一来持续性怎么办?
Ben嘴Ben舌:bjdp.org的编程道场活动,不是培训,而是分享。分享就好比大自然的果实,根据环境的变化,其形态是不固定的。但果实到了适当的时令,就总会有的。:-)
--------------------
操练成就匠艺。全栈开发者的公益编程操练社区:bjdp.org北京设计模式学习组。微信订阅号:bjdp_org,QQ群号:235913915。