2007-09-10
这样的TDD实践方式有问题?请教大家的TDD实施方式.
我一直都这么做,可是在一次实践交流(其实就是面试,一家号称采用敏捷开发的公司)之中,我这样的方式被称之为钻了牛角尖。”你是不是从书上随便看了一下TDD相关的资料之后,就认为你已经掌握了TDD了?”,我一直都这么做,目前已经有几个项目都是采用这样的开发方式,可是,在这次的交流之后我可是有点动摇了,我是不是做错了?我想知道大家都怎么样运用TDD的?而我是这样做的,就看看那次交流现场开发的吧:
以下称那个朋友为TDDer(可是两个人哦,连面试都是PP,)吧。
TDDer提的需求:把字符串"Tdd is a software devolopment technology" 按照单词反转为
"technology devolopment software a is Tdd"
在开始之前,我问了两次TDDer,确认需求是不是这样,确认需求如此之后,我就开始了:
1. 编写测试代码:
2. 编写产品代码
然后完成.
之后给TDDer说完成了,然后,TDDer问我,这样就完成了?
我说功能是实现了,可以说完成了,不过还有一步,重构,去除重复代码.TDDer仅仅看了一眼就直摇头,他说“你写这样的代码有什么用,如果我换另外一个字符串呢?你这个还能跑么?",我说"你的需求只是转那个字符串,而且我找你确认过,如果你要换另外一个字符串,那也就是说需求变更,那我调整代码罗,我说TDD不是这样的么?我平时工作中就这么做的。",TDDer只有一个劲的摇头了,而我也知道,这次没戏了.:D
其实,我知道我还有一步没做,那就是重构,我当时在白纸上写的,嘿嘿,根本没法运行测试,所以这一步也比较麻烦,尽管重构可以不依赖于测试,但我已经习惯于依赖测试。
谈论了一些话题之后:我收到的临别赠言是:
“钻了牛角尖。”
”你是不是从书上随便看了一下TDD相关的资料之后,就认为你已经掌握了TDD了?”
“Code Smell”
“你这个是十足的TDD的反模式,如果你这个给我们公司的xxxx看的话,这个一定是他培训时举的最好的反模式了”
于是,我向他们咨询他们是怎么实施TDD的?可是我最后还是没有答案.
终于,讨论结束了,我带着满腔困惑和不解回到家,打开笔记本,开始了这个征程:
1. 建立eclipse工程,然后编写测试代码,并运行测试,失败了。
测试代码:
产品代码:
2. 编写产品代码,确保测试通过:
3. 重构,消除重复代码:
完了,这样已经完了.
后来和一个朋友聊到这个事情,他也笑的不成样子,他认为我很懒,应该写完整点。而我始终认为我这样做是对的,而且现实中我也是这么做。我跟朋友说,如果要说有问题,那就是我本应该引导客户,他的需求的确是这个么?可是,当时TDDer要要看看我写的代码的风格,而不是于客户的沟通.当然我这个朋友并不是一个TDD的爱好者.而我是一个TDD迷恋者
我不知道我这样做是不是不对,因此到这里来请教大家,你们都是怎么做的?
我承认,对于TDD的理论,我的确是从书上看得,从网上学到,但是跟多的是从开源里面去体会,在项目产品中去实践。我已经在四个项目中采用这样的方式,一直都感觉很好.
因此,很是困惑,请大家指点指点,我想知道大家都是怎么实施TDD的.
在我的开发生活中,TDD,Refactor.CI是三个最重要也最常见的伙伴,我就是这样实践他们的.
虽然这个demo很简单,但是足以说明我的开发工程.
当然这里写起来这么麻烦,但是在开发这样的一个demo过程中其实是很快的。
这次的经历告诉我:在面试时,要看看一个人的TDD能力,一定要在电脑上做,真真实实的去做,这样才知道,事实上,当时我带了笔记本去了.
我永远不会忘记:Clean code that works.
PS:把数据库扔在一边!(请直接下载我最后回复中的详细文档和源代码吧) 曾引起强劲的反映,我现在在做的一个项目中,目前功能基本实现,现在正在处理扣费部分,到目前为止,都未考虑数据库,数据当前都是序列化到文件系统中的。:D 我只是想说的是,不说其他的,如果考虑数据库,单单我运行测试的时间都要浪费不少,效率都要低很多,只从这点上考虑,我已经非常不愿意在前期考虑数据库的设计了.在我看来,数据的存储方式本就不应该影响业务模型及业务逻辑.
附件是这个demo的源码.
以下称那个朋友为TDDer(可是两个人哦,连面试都是PP,)吧。
TDDer提的需求:把字符串"Tdd is a software devolopment technology" 按照单词反转为
"technology devolopment software a is Tdd"
在开始之前,我问了两次TDDer,确认需求是不是这样,确认需求如此之后,我就开始了:
1. 编写测试代码:
public class StringReverseTest {
@Test
public void testReverse(){
StringReverser sr=new StringReverser();
String str = "Tdd is a software devolopment technology";
Assert.assertEquals("technology devolopment software a is Tdd",sr.reverse(str));
}
}
2. 编写产品代码
public class StringReverser {
public String reverse(String str) {
return "technology devolopment software a is Tdd";
}
}
然后完成.
之后给TDDer说完成了,然后,TDDer问我,这样就完成了?
我说功能是实现了,可以说完成了,不过还有一步,重构,去除重复代码.TDDer仅仅看了一眼就直摇头,他说“你写这样的代码有什么用,如果我换另外一个字符串呢?你这个还能跑么?",我说"你的需求只是转那个字符串,而且我找你确认过,如果你要换另外一个字符串,那也就是说需求变更,那我调整代码罗,我说TDD不是这样的么?我平时工作中就这么做的。",TDDer只有一个劲的摇头了,而我也知道,这次没戏了.:D
其实,我知道我还有一步没做,那就是重构,我当时在白纸上写的,嘿嘿,根本没法运行测试,所以这一步也比较麻烦,尽管重构可以不依赖于测试,但我已经习惯于依赖测试。
谈论了一些话题之后:我收到的临别赠言是:
“钻了牛角尖。”
”你是不是从书上随便看了一下TDD相关的资料之后,就认为你已经掌握了TDD了?”
“Code Smell”
“你这个是十足的TDD的反模式,如果你这个给我们公司的xxxx看的话,这个一定是他培训时举的最好的反模式了”
于是,我向他们咨询他们是怎么实施TDD的?可是我最后还是没有答案.
终于,讨论结束了,我带着满腔困惑和不解回到家,打开笔记本,开始了这个征程:
1. 建立eclipse工程,然后编写测试代码,并运行测试,失败了。
测试代码:
package org.opensource.test;
import org.junit.Assert;
import org.junit.Test;
public class StringReverseTest {
@Test
public void testReverse(){
StringReverser sr=new StringReverser();
String str = "Tdd is a software devolopment technology";
Assert.assertEquals("technology devolopment software a is Tdd",sr.reverse(str));
}
}
产品代码:
package org.opensource.test;
public class StringReverser {
public Object reverse(String str) {
return null;
}
}
2. 编写产品代码,确保测试通过:
package org.opensource.test;
public class StringReverser {
public Object reverse(String str) {
return "technology devolopment software a is Tdd";
}
}
3. 重构,消除重复代码:
package org.opensource.test;
public class StringReverser {
private static final String SPACE = " ";
public String reverse(String str) {
String[] words=str.split(SPACE);
StringBuilder result=new StringBuilder();
for (int i = words.length-1; i >=0; i--) {
result.append(words[i]).append(SPACE);
}
return result.toString().trim();
}
}
完了,这样已经完了.
后来和一个朋友聊到这个事情,他也笑的不成样子,他认为我很懒,应该写完整点。而我始终认为我这样做是对的,而且现实中我也是这么做。我跟朋友说,如果要说有问题,那就是我本应该引导客户,他的需求的确是这个么?可是,当时TDDer要要看看我写的代码的风格,而不是于客户的沟通.当然我这个朋友并不是一个TDD的爱好者.而我是一个TDD迷恋者
我不知道我这样做是不是不对,因此到这里来请教大家,你们都是怎么做的?
我承认,对于TDD的理论,我的确是从书上看得,从网上学到,但是跟多的是从开源里面去体会,在项目产品中去实践。我已经在四个项目中采用这样的方式,一直都感觉很好.
因此,很是困惑,请大家指点指点,我想知道大家都是怎么实施TDD的.
在我的开发生活中,TDD,Refactor.CI是三个最重要也最常见的伙伴,我就是这样实践他们的.
虽然这个demo很简单,但是足以说明我的开发工程.
当然这里写起来这么麻烦,但是在开发这样的一个demo过程中其实是很快的。
这次的经历告诉我:在面试时,要看看一个人的TDD能力,一定要在电脑上做,真真实实的去做,这样才知道,事实上,当时我带了笔记本去了.
我永远不会忘记:Clean code that works.
PS:把数据库扔在一边!(请直接下载我最后回复中的详细文档和源代码吧) 曾引起强劲的反映,我现在在做的一个项目中,目前功能基本实现,现在正在处理扣费部分,到目前为止,都未考虑数据库,数据当前都是序列化到文件系统中的。:D 我只是想说的是,不说其他的,如果考虑数据库,单单我运行测试的时间都要浪费不少,效率都要低很多,只从这点上考虑,我已经非常不愿意在前期考虑数据库的设计了.在我看来,数据的存储方式本就不应该影响业务模型及业务逻辑.
附件是这个demo的源码.
评论
马伟
2008-03-06
gigix 写道
马伟 写道
也不准你递归 , 用递归就是把循环给转移了位置而已
你这说法就不对了。循环不是图灵完备语言的必备元素,而函数调用是。不允许递归,那不就是不允许函数调用么?
让我想起了小时候数学竞赛。
同学们,用循环是可耻的
gigix
2008-03-06
马伟 写道
也不准你递归 , 用递归就是把循环给转移了位置而已
你这说法就不对了。循环不是图灵完备语言的必备元素,而函数调用是。不允许递归,那不就是不允许函数调用么?
马伟
2008-03-06
gigix 写道
ball_cao 写道
这个帖子让我想起以前的一个面试题:给出n要求计算1到n的和
如果你用了循环那么就不合格了
标准答案是n*(1+n)/2
我们设计程序的时候过度的设计是应该避免的,这也是tdd的目标之一,但是完全不设计也是不可取的!书上举这样的例子是为了简明易懂,不是让你照这个样子行事啊!
如果你用了循环那么就不合格了
标准答案是n*(1+n)/2
我们设计程序的时候过度的设计是应该避免的,这也是tdd的目标之一,但是完全不设计也是不可取的!书上举这样的例子是为了简明易懂,不是让你照这个样子行事啊!
function accumulate(n) {
if(n == 1) {
return 1;
}
return n + accumulate(n-1);
}
不用循环还不简单
也不准你递归 , 用递归就是把循环给转移了位置而已
gigix
2008-03-05
ball_cao 写道
这个帖子让我想起以前的一个面试题:给出n要求计算1到n的和
如果你用了循环那么就不合格了
标准答案是n*(1+n)/2
我们设计程序的时候过度的设计是应该避免的,这也是tdd的目标之一,但是完全不设计也是不可取的!书上举这样的例子是为了简明易懂,不是让你照这个样子行事啊!
如果你用了循环那么就不合格了
标准答案是n*(1+n)/2
我们设计程序的时候过度的设计是应该避免的,这也是tdd的目标之一,但是完全不设计也是不可取的!书上举这样的例子是为了简明易懂,不是让你照这个样子行事啊!
function accumulate(n) {
if(n == 1) {
return 1;
}
return n + accumulate(n-1);
}
不用循环还不简单
雁行
2008-03-05
强帖
虽然我们不用TDD,连单元测试都不用(惭愧~)
一定要好好学习之,也体会一下其中无穷乐趣
虽然我们不用TDD,连单元测试都不用(惭愧~)
一定要好好学习之,也体会一下其中无穷乐趣
虚无的曾经
2007-12-28
哈哈 唉····
这个帖子太强了···
技术人员难免心高气傲自以为了不起···
但是承认错误虚心听取别人意见也是必不可少的啊···
这个帖子太强了···
技术人员难免心高气傲自以为了不起···
但是承认错误虚心听取别人意见也是必不可少的啊···
bookong
2007-12-25
dustinth 写道
gigix虽然语气重了点,但都说到点子上了.我这里总结一下:
1. 你的Requirement不是测试驱动出来的;
2. 你的两段代码严格意义上不叫重构,可你却拿"自己重构的步骤有点大"为自己辩护;
3. 在真实的世界,你的第一段代码根本不需要重构;
我再加一句, 面试你的人绝对不是在跟你讨论TDD的学术问题,你却自己钻到牛角尖(这句话他们评价的很对). 很多好心人给你指出这一点,你却认为他们不是在讨论学术,而是在人身攻击.你的虚心态度不光要用在学术上.
1. 你的Requirement不是测试驱动出来的;
2. 你的两段代码严格意义上不叫重构,可你却拿"自己重构的步骤有点大"为自己辩护;
3. 在真实的世界,你的第一段代码根本不需要重构;
我再加一句, 面试你的人绝对不是在跟你讨论TDD的学术问题,你却自己钻到牛角尖(这句话他们评价的很对). 很多好心人给你指出这一点,你却认为他们不是在讨论学术,而是在人身攻击.你的虚心态度不光要用在学术上.
ball_cao
2007-12-19
这个帖子让我想起以前的一个面试题:给出n要求计算1到n的和
如果你用了循环那么就不合格了
标准答案是n*(1+n)/2
我们设计程序的时候过度的设计是应该避免的,这也是tdd的目标之一,但是完全不设计也是不可取的!书上举这样的例子是为了简明易懂,不是让你照这个样子行事啊!
如果你用了循环那么就不合格了
标准答案是n*(1+n)/2
我们设计程序的时候过度的设计是应该避免的,这也是tdd的目标之一,但是完全不设计也是不可取的!书上举这样的例子是为了简明易懂,不是让你照这个样子行事啊!
alanwu
2007-12-17
我在实际项目中就是这样做的。
如果实际需求只有两个case, 就直接hard code解决问题了。
这样做实在不是好代码, 但是效率很高。 一般这种根据经验hard code后再次修改的几率也很小。
如果需求变动了再增加一个test case进行演进就行了。
做最简单的事满足用户需求, 就OK了。
写很漂亮的代码实现得很灵活没实际意义很浪费时间, 如果练手倒还可以。
KISS, KEEP IT SIMPLE & STUPID!
PS: 楼主确实钻牛角尖, 面试官说不行的意思就是说你做的不符合他的需求。
如果实际需求只有两个case, 就直接hard code解决问题了。
这样做实在不是好代码, 但是效率很高。 一般这种根据经验hard code后再次修改的几率也很小。
如果需求变动了再增加一个test case进行演进就行了。
做最简单的事满足用户需求, 就OK了。
写很漂亮的代码实现得很灵活没实际意义很浪费时间, 如果练手倒还可以。
KISS, KEEP IT SIMPLE & STUPID!
PS: 楼主确实钻牛角尖, 面试官说不行的意思就是说你做的不符合他的需求。
hyysguyang 写道
我一直都这么做,可是在一次实践交流(其实就是面试,一家号称采用敏捷开发的公司)之中,我这样的方式被称之为钻了牛角尖。”你是不是从书上随便看了一下TDD相关的资料之后,就认为你已经掌握了TDD了?”,我一直都这么做,目前已经有几个项目都是采用这样的开发方式,可是,在这次的交流之后我可是有点动摇了,我是不是做错了?我想知道大家都怎么样运用TDD的?而我是这样做的,就看看那次交流现场开发的吧:
以下称那个朋友为TDDer(可是两个人哦,连面试都是PP,)吧。
TDDer提的需求:把字符串"Tdd is a software devolopment technology" 按照单词反转为
"technology devolopment software a is Tdd"
在开始之前,我问了两次TDDer,确认需求是不是这样,确认需求如此之后,我就开始了:
1. 编写测试代码:
2. 编写产品代码
然后完成.
之后给TDDer说完成了,然后,TDDer问我,这样就完成了?
我说功能是实现了,可以说完成了,不过还有一步,重构,去除重复代码.TDDer仅仅看了一眼就直摇头,他说“你写这样的代码有什么用,如果我换另外一个字符串呢?你这个还能跑么?",我说"你的需求只是转那个字符串,而且我找你确认过,如果你要换另外一个字符串,那也就是说需求变更,那我调整代码罗,我说TDD不是这样的么?我平时工作中就这么做的。",TDDer只有一个劲的摇头了,而我也知道,这次没戏了.:D
其实,我知道我还有一步没做,那就是重构,我当时在白纸上写的,嘿嘿,根本没法运行测试,所以这一步也比较麻烦,尽管重构可以不依赖于测试,但我已经习惯于依赖测试。
谈论了一些话题之后:我收到的临别赠言是:
“钻了牛角尖。”
”你是不是从书上随便看了一下TDD相关的资料之后,就认为你已经掌握了TDD了?”
“Code Smell”
“你这个是十足的TDD的反模式,如果你这个给我们公司的xxxx看的话,这个一定是他培训时举的最好的反模式了”
于是,我向他们咨询他们是怎么实施TDD的?可是我最后还是没有答案.
终于,讨论结束了,我带着满腔困惑和不解回到家,打开笔记本,开始了这个征程:
1. 建立eclipse工程,然后编写测试代码,并运行测试,失败了。
测试代码:
产品代码:
2. 编写产品代码,确保测试通过:
3. 重构,消除重复代码:
完了,这样已经完了.
后来和一个朋友聊到这个事情,他也笑的不成样子,他认为我很懒,应该写完整点。而我始终认为我这样做是对的,而且现实中我也是这么做。我跟朋友说,如果要说有问题,那就是我本应该引导客户,他的需求的确是这个么?可是,当时TDDer要要看看我写的代码的风格,而不是于客户的沟通.当然我这个朋友并不是一个TDD的爱好者.而我是一个TDD迷恋者
我不知道我这样做是不是不对,因此到这里来请教大家,你们都是怎么做的?
我承认,对于TDD的理论,我的确是从书上看得,从网上学到,但是跟多的是从开源里面去体会,在项目产品中去实践。我已经在四个项目中采用这样的方式,一直都感觉很好.
因此,很是困惑,请大家指点指点,我想知道大家都是怎么实施TDD的.
在我的开发生活中,TDD,Refactor.CI是三个最重要也最常见的伙伴,我就是这样实践他们的.
虽然这个demo很简单,但是足以说明我的开发工程.
当然这里写起来这么麻烦,但是在开发这样的一个demo过程中其实是很快的。
这次的经历告诉我:在面试时,要看看一个人的TDD能力,一定要在电脑上做,真真实实的去做,这样才知道,事实上,当时我带了笔记本去了.
我永远不会忘记:Clean code that works.
PS:把数据库扔在一边!(请直接下载我最后回复中的详细文档和源代码吧) 曾引起强劲的反映,我现在在做的一个项目中,目前功能基本实现,现在正在处理扣费部分,到目前为止,都未考虑数据库,数据当前都是序列化到文件系统中的。:D 我只是想说的是,不说其他的,如果考虑数据库,单单我运行测试的时间都要浪费不少,效率都要低很多,只从这点上考虑,我已经非常不愿意在前期考虑数据库的设计了.在我看来,数据的存储方式本就不应该影响业务模型及业务逻辑.
附件是这个demo的源码.
以下称那个朋友为TDDer(可是两个人哦,连面试都是PP,)吧。
TDDer提的需求:把字符串"Tdd is a software devolopment technology" 按照单词反转为
"technology devolopment software a is Tdd"
在开始之前,我问了两次TDDer,确认需求是不是这样,确认需求如此之后,我就开始了:
1. 编写测试代码:
public class StringReverseTest {
@Test
public void testReverse(){
StringReverser sr=new StringReverser();
String str = "Tdd is a software devolopment technology";
Assert.assertEquals("technology devolopment software a is Tdd",sr.reverse(str));
}
}
2. 编写产品代码
public class StringReverser {
public String reverse(String str) {
return "technology devolopment software a is Tdd";
}
}
然后完成.
之后给TDDer说完成了,然后,TDDer问我,这样就完成了?
我说功能是实现了,可以说完成了,不过还有一步,重构,去除重复代码.TDDer仅仅看了一眼就直摇头,他说“你写这样的代码有什么用,如果我换另外一个字符串呢?你这个还能跑么?",我说"你的需求只是转那个字符串,而且我找你确认过,如果你要换另外一个字符串,那也就是说需求变更,那我调整代码罗,我说TDD不是这样的么?我平时工作中就这么做的。",TDDer只有一个劲的摇头了,而我也知道,这次没戏了.:D
其实,我知道我还有一步没做,那就是重构,我当时在白纸上写的,嘿嘿,根本没法运行测试,所以这一步也比较麻烦,尽管重构可以不依赖于测试,但我已经习惯于依赖测试。
谈论了一些话题之后:我收到的临别赠言是:
“钻了牛角尖。”
”你是不是从书上随便看了一下TDD相关的资料之后,就认为你已经掌握了TDD了?”
“Code Smell”
“你这个是十足的TDD的反模式,如果你这个给我们公司的xxxx看的话,这个一定是他培训时举的最好的反模式了”
于是,我向他们咨询他们是怎么实施TDD的?可是我最后还是没有答案.
终于,讨论结束了,我带着满腔困惑和不解回到家,打开笔记本,开始了这个征程:
1. 建立eclipse工程,然后编写测试代码,并运行测试,失败了。
测试代码:
package org.opensource.test;
import org.junit.Assert;
import org.junit.Test;
public class StringReverseTest {
@Test
public void testReverse(){
StringReverser sr=new StringReverser();
String str = "Tdd is a software devolopment technology";
Assert.assertEquals("technology devolopment software a is Tdd",sr.reverse(str));
}
}
产品代码:
package org.opensource.test;
public class StringReverser {
public Object reverse(String str) {
return null;
}
}
2. 编写产品代码,确保测试通过:
package org.opensource.test;
public class StringReverser {
public Object reverse(String str) {
return "technology devolopment software a is Tdd";
}
}
3. 重构,消除重复代码:
package org.opensource.test;
public class StringReverser {
private static final String SPACE = " ";
public String reverse(String str) {
String[] words=str.split(SPACE);
StringBuilder result=new StringBuilder();
for (int i = words.length-1; i >=0; i--) {
result.append(words[i]).append(SPACE);
}
return result.toString().trim();
}
}
完了,这样已经完了.
后来和一个朋友聊到这个事情,他也笑的不成样子,他认为我很懒,应该写完整点。而我始终认为我这样做是对的,而且现实中我也是这么做。我跟朋友说,如果要说有问题,那就是我本应该引导客户,他的需求的确是这个么?可是,当时TDDer要要看看我写的代码的风格,而不是于客户的沟通.当然我这个朋友并不是一个TDD的爱好者.而我是一个TDD迷恋者
我不知道我这样做是不是不对,因此到这里来请教大家,你们都是怎么做的?
我承认,对于TDD的理论,我的确是从书上看得,从网上学到,但是跟多的是从开源里面去体会,在项目产品中去实践。我已经在四个项目中采用这样的方式,一直都感觉很好.
因此,很是困惑,请大家指点指点,我想知道大家都是怎么实施TDD的.
在我的开发生活中,TDD,Refactor.CI是三个最重要也最常见的伙伴,我就是这样实践他们的.
虽然这个demo很简单,但是足以说明我的开发工程.
当然这里写起来这么麻烦,但是在开发这样的一个demo过程中其实是很快的。
这次的经历告诉我:在面试时,要看看一个人的TDD能力,一定要在电脑上做,真真实实的去做,这样才知道,事实上,当时我带了笔记本去了.
我永远不会忘记:Clean code that works.
PS:把数据库扔在一边!(请直接下载我最后回复中的详细文档和源代码吧) 曾引起强劲的反映,我现在在做的一个项目中,目前功能基本实现,现在正在处理扣费部分,到目前为止,都未考虑数据库,数据当前都是序列化到文件系统中的。:D 我只是想说的是,不说其他的,如果考虑数据库,单单我运行测试的时间都要浪费不少,效率都要低很多,只从这点上考虑,我已经非常不愿意在前期考虑数据库的设计了.在我看来,数据的存储方式本就不应该影响业务模型及业务逻辑.
附件是这个demo的源码.
12True
2007-10-08
hax 写道
楼主,好学是好事情,但老外有时候跟你玩假客气你别当真。再说我前面说的话,我还真没有伤你之意,我倒是想调侃一下gigix。。。
楼主我想你看了那么多,也应该明白大家的意思了吧。我之所以写两个成语,无非是表达两个意思:
刻舟求剑,就是说你过于教条的看待问题了。当然,我们很多人都要经过这个阶段,但是教条到你这个程度的,倒还是少见。不过这也许预示着你将来有很大的成就(偏执的人往往能取得很大的成功)。
对牛弹琴,是说gigix等其他人说你的,你好像很少能听得进去,总是过多的强调你自己的想法。我猜测大概是这句成语惹恼了你。不过我觉得这个成语并没有人身攻击的意思。但是你好像反应很大也。
其实你的回帖还有不少可调侃之处,不过看来你没有什么幽默感(整个javaeye上许多人也缺乏幽默感),我就不说了。
唯一想补充的一点是,不要动不动就说什么“中国的悲哀”,我担当不起。
楼主我想你看了那么多,也应该明白大家的意思了吧。我之所以写两个成语,无非是表达两个意思:
刻舟求剑,就是说你过于教条的看待问题了。当然,我们很多人都要经过这个阶段,但是教条到你这个程度的,倒还是少见。不过这也许预示着你将来有很大的成就(偏执的人往往能取得很大的成功)。
对牛弹琴,是说gigix等其他人说你的,你好像很少能听得进去,总是过多的强调你自己的想法。我猜测大概是这句成语惹恼了你。不过我觉得这个成语并没有人身攻击的意思。但是你好像反应很大也。
其实你的回帖还有不少可调侃之处,不过看来你没有什么幽默感(整个javaeye上许多人也缺乏幽默感),我就不说了。
唯一想补充的一点是,不要动不动就说什么“中国的悲哀”,我担当不起。
看到你送出的那两个成语,当时我也感觉有点郁闷。
看到你解释了一番后,觉得精彩,言简意赅噢。
"中国的悲哀",汗。。越说越悲哀
12True
2007-10-08
sslaowan 写道
lz把其中的两个Code过程前者称为Code后者称为Refactoring了。不过我理解lz的意思,他觉得从return一个字符串到写出那样“复杂”的算法(相对于Return)是步子迈的比较大而已,不过那也就是叫增加产品代码,不叫重构。并不是说再回头修改或增加产品代码都叫重构了。
其实我觉得gigix的核心观点是认为lz的产品代码不是Test驱动出来的(如果从学术上讨论,我觉得Test Driven和Test First开发是两个有区别的术语),lz只是Test First,不是TDD。gigix一直再强调你那个Code2不是测试驱动出来的,而是你脑袋里一下子想出来的。其实这样说,lz也是正确的,有的人可能需要一点点增加测试来想出那个产品代码,有的人一下子就像出来了,就好比有的人看电影刚看开头就知道结尾了,而有的人一边看一边在推测结尾。所以lz说自己步伐大,说自己是TDD也是没错的。
12True
2007-10-08
[quote="gigix"][quote]可是你硬要说这两个代码:
没有区别……哎,就算你吹出大天来,我还是要说:你就算没有知识也该有点常识吧?也甭跟我讲什么测试啦什么重构啦之类的大道理,道理再大也大不过个合情合理。就您这样掰扯下去,人家不明白的还以为学重构学得岔了气呢。[/quote]
我还没有理解TDD,所以我不谈TDD
两个方法没有区别是在于都能反转 "technology devolopment software a is Tdd"
需求是反转字符
楼主的做法是先让代码能通过测试,不注重具体是怎么的实现,能完成需求的功能就OK了。
.......
.......
楼主对 "重构"的见解,我是不赞同的。
对
的重构,最多把字符串抽取出来,定义为常量。就像gigix所示例的那样,不过我觉得gigix的语言过于激烈啦。
以和为贵
// code C
public Object reverse(String str) {
return "technology devolopment software a is Tdd";
}
// code D
public String reverse(String str) {
String[] words=str.split(SPACE);
StringBuilder result=new StringBuilder();
for (int i = words.length-1; i >=0; i--) {
result.append(words[i]).append(SPACE);
}
return result.toString().trim();
}
没有区别……哎,就算你吹出大天来,我还是要说:你就算没有知识也该有点常识吧?也甭跟我讲什么测试啦什么重构啦之类的大道理,道理再大也大不过个合情合理。就您这样掰扯下去,人家不明白的还以为学重构学得岔了气呢。[/quote]
我还没有理解TDD,所以我不谈TDD
两个方法没有区别是在于都能反转 "technology devolopment software a is Tdd"
需求是反转字符
楼主的做法是先让代码能通过测试,不注重具体是怎么的实现,能完成需求的功能就OK了。
.......
.......
楼主对 "重构"的见解,我是不赞同的。
对
public Object reverse(String str) {
return "technology devolopment software a is Tdd";
}
的重构,最多把字符串抽取出来,定义为常量。就像gigix所示例的那样,不过我觉得gigix的语言过于激烈啦。
sslaowan
2007-10-07
我觉得TDD=Test-->Code-->Test-->Refactoring-->Test--->New Test-->New Code……
lz把其中的两个Code过程前者称为Code后者称为Refactoring了。不过我理解lz的意思,他觉得从return一个字符串到写出那样“复杂”的算法(相对于Return)是步子迈的比较大而已,不过那也就是叫增加产品代码,不叫重构。并不是说再回头修改或增加产品代码都叫重构了。
其实我觉得gigix的核心观点是认为lz的产品代码不是Test驱动出来的(如果从学术上讨论,我觉得Test Driven和Test First开发是两个有区别的术语),lz只是Test First,不是TDD。gigix一直再强调你那个Code2不是测试驱动出来的,而是你脑袋里一下子想出来的。其实这样说,lz也是正确的,有的人可能需要一点点增加测试来想出那个产品代码,有的人一下子就像出来了,就好比有的人看电影刚看开头就知道结尾了,而有的人一边看一边在推测结尾。所以lz说自己步伐大,说自己是TDD也是没错的。
另外,lz在junit group上讨论时的代码所展现的思路和再这里完全不是一个感觉。在那我能感觉到lz是测试驱动着思维Code,而在这里完全看不出~
lz把其中的两个Code过程前者称为Code后者称为Refactoring了。不过我理解lz的意思,他觉得从return一个字符串到写出那样“复杂”的算法(相对于Return)是步子迈的比较大而已,不过那也就是叫增加产品代码,不叫重构。并不是说再回头修改或增加产品代码都叫重构了。
其实我觉得gigix的核心观点是认为lz的产品代码不是Test驱动出来的(如果从学术上讨论,我觉得Test Driven和Test First开发是两个有区别的术语),lz只是Test First,不是TDD。gigix一直再强调你那个Code2不是测试驱动出来的,而是你脑袋里一下子想出来的。其实这样说,lz也是正确的,有的人可能需要一点点增加测试来想出那个产品代码,有的人一下子就像出来了,就好比有的人看电影刚看开头就知道结尾了,而有的人一边看一边在推测结尾。所以lz说自己步伐大,说自己是TDD也是没错的。
另外,lz在junit group上讨论时的代码所展现的思路和再这里完全不是一个感觉。在那我能感觉到lz是测试驱动着思维Code,而在这里完全看不出~
johnnywww
2007-10-02
我同意LZ的只做简单和实用事情的观点,当时的考官给的需求在LZ眼中是单一的,如果后来考官给出功能的增加,我认为抛出异常的爱的步骤和方法可以很好的解决这个过程。我相信在实际开发过程中,lz也不会遇见这么单一的需求。
liufanjavaeye
2007-09-28
看完了,觉得很有收获
1.lz在整个过程中,都在表达自己面对这个需求,自己的tdd想法,对于我们这种对tdd很有兴趣但很少有机会实际接触的人,是个非常好的机会,不管是对是错,都是学习过程中宝贵的经验
2.我觉得坛中有些人的态度不是很好,好像别人有点观点和自己不一样就要冷嘲热讽或者破口大骂,将心比心的说,你们自己刚开始不是这样一步步地过来的
1.lz在整个过程中,都在表达自己面对这个需求,自己的tdd想法,对于我们这种对tdd很有兴趣但很少有机会实际接触的人,是个非常好的机会,不管是对是错,都是学习过程中宝贵的经验
2.我觉得坛中有些人的态度不是很好,好像别人有点观点和自己不一样就要冷嘲热讽或者破口大骂,将心比心的说,你们自己刚开始不是这样一步步地过来的
xmx0632
2007-09-26
blueskyone 写道
xmx0632 写道
引用
code1:
package org.opensource.test;
public class StringReverser {
public Object reverse(String str) {
return "technology devolopment software a is Tdd";
}
}
重构代码 ==>
code2:
package org.opensource.test;
public class StringReverser {
private static final String SPACE = " ";
public String reverse(String str) {
String[] words=str.split(SPACE);
StringBuilder result=new StringBuilder();
for (int i = words.length-1; i >=0; i--) {
result.append(words[i]).append(SPACE);
}
return result.toString().trim();
}
}
看到楼主能把code1重构成code2这个样子
忽然想起见过的公务员考试里那种题目,类似这样的推理题:
引用
1.问:请观察下面一堆数字,说出其中的规律
2,4,8,16
答:2的X次方
2.问:请观察下面一个数字,说出其中的规律
16
答:2的4次方
感觉楼主的重构跟第2道推理有点神似.
按您上面的那个死需求,个人感觉如果您把code2重构成code1比较能让人接受.
不能自己删除回复吗??
为什么要删除?
我只是觉得在楼主同志认定了需求就是把字符串"Tdd is a software devolopment technology"反转为"technology devolopment software a is Tdd";而不是把一个字符串按空格分隔,反转其中的单词顺序的前提下,把code1重构成code2的样子比较奇怪而已。没别的意思。
snow18
2007-09-26
不做任何评论,只表达一下心情: 好久没有看帖子这么乐过了(看技术类的帖子这应该改还是第一次)。大家别误会,没有嘲笑谁的意思。只不过现在的心情让我有强烈的冲动要表达一下。
hax
2007-09-26
gigix 写道
何止是“同样很重要”,重要多了
弄不清楚做什么,再怎么TDD,做事方式再怎么好也没用。方式越好错得越远。
弄不清楚做什么,再怎么TDD,做事方式再怎么好也没用。方式越好错得越远。
gigix同学,也不用上纲上线啦,真的开发中间我想楼主也不会像他说的那样干的。他只是拗不过弯来,要跟面试官和我们争论争论。很多人都有这个阶段的嘛,偶也有过啊(现在还有一点)。
所以俺认为lz还是很有潜力的,因为凡事就怕认真二字,只要他迈过这个坎,前景无量吼吼。
fly_bluewolf
2007-09-26
个人认为,TDD到底是测试功能还是代码逻辑结构?如果只是测试功能是否正确,那么重构前后的两段代码执行后结果完全一样,因而从功能上来说这个是重构。当然是在仅仅对于那个特定的句子来说,对于其它的句子可能就不正确了。
从hyysguyang的角度来说,他认为客户的需求只是把那个句子简单的反向一下。他的Unit测试也是仅仅针对这个需求而已。重新代码后,对于调用端来说没有任何结果的改变,个人认为可以说是重构。
至于大家争论的这么多,个人认为关键点在于需求被hyysguyang和面试人员的理解范围不一样。按照gigix理解的需求范围,对于“I am Michael”这句话来说,重构前后的的执行结果完全不一样,因此这段代码不是重构,因为他改变代码的功能。
从hyysguyang的角度来说,他认为客户的需求只是把那个句子简单的反向一下。他的Unit测试也是仅仅针对这个需求而已。重新代码后,对于调用端来说没有任何结果的改变,个人认为可以说是重构。
至于大家争论的这么多,个人认为关键点在于需求被hyysguyang和面试人员的理解范围不一样。按照gigix理解的需求范围,对于“I am Michael”这句话来说,重构前后的的执行结果完全不一样,因此这段代码不是重构,因为他改变代码的功能。
qujingbo
2007-09-25
dustinth 写道
gigix虽然语气重了点,但都说到点子上了.我这里总结一下:
1. 你的Requirement不是测试驱动出来的;
2. 你的两段代码严格意义上不叫重构,可你却拿"自己重构的步骤有点大"为自己辩护;
3. 在真实的世界,你的第一段代码根本不需要重构;
我再加一句, 面试你的人绝对不是在跟你讨论TDD的学术问题,你却自己钻到牛角尖(这句话他们评价的很对). 很多好心人给你指出这一点,你却认为他们不是在讨论学术,而是在人身攻击.你的虚心态度不光要用在学术上.
1. 你的Requirement不是测试驱动出来的;
2. 你的两段代码严格意义上不叫重构,可你却拿"自己重构的步骤有点大"为自己辩护;
3. 在真实的世界,你的第一段代码根本不需要重构;
我再加一句, 面试你的人绝对不是在跟你讨论TDD的学术问题,你却自己钻到牛角尖(这句话他们评价的很对). 很多好心人给你指出这一点,你却认为他们不是在讨论学术,而是在人身攻击.你的虚心态度不光要用在学术上.
贴子上我从头乐到尾,如果总结lz存的的问题,dustinth说的没错。还有,其中有位仁兄(抛出异常的爱)事例也很对。
在这篇贴子中还是很有收获的。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 24600 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
这样的TDD实践方式有问题 ...
gigix 写道马伟 写道也不准你递归 , 用递归就是把循环给转移了位置而已 你 ...
-- by 马伟 -
这样的TDD实践方式有问题 ...
马伟 写道也不准你递归 , 用递归就是把循环给转移了位置而已 你这说法就不对了。 ...
-- by gigix -
这样的TDD实践方式有问题 ...
gigix 写道ball_cao 写道这个帖子让我想起以前的一个面试题:给出n要 ...
-- by 马伟 -
这样的TDD实践方式有问题 ...
ball_cao 写道这个帖子让我想起以前的一个面试题:给出n要求计算1到n的和 ...
-- by gigix -
这样的TDD实践方式有问题 ...
强帖虽然我们不用TDD,连单元测试都不用(惭愧~)一定要好好学习之,也体会一下其 ...
-- by 雁行






评论排行榜