论坛首页 Java企业应用论坛

编程中一个很常见的问题,有帮助的

浏览 29353 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (17)
作者 正文
   发表时间:2008-12-19  
我觉得上面的例子已经说的很明白了,认真看下就明白了。 退一步说吧,上面代码中 每个子代码块都是对 test()负责的 ,都是和它进行约定 返回值 入参  和 异常等。  如果你是连续调用的 就不一样了。

如果你做的是SOA服务,你希望你的调用的服务还会调用 你本来可以调用的服务吗?我想你不会把这个委托给别人的。
0 请登录后投票
   发表时间:2008-12-20  
这年头还有人用checked exception 貌似 spring和 hibernate都开始往unchecked exception上面靠拢吧
0 请登录后投票
   发表时间:2008-12-20  
fjlyxx 写道
我觉得上面的例子已经说的很明白了,认真看下就明白了。 退一步说吧,上面代码中 每个子代码块都是对 test()负责的 ,都是和它进行约定 返回值 入参  和 异常等。  如果你是连续调用的 就不一样了。

如果你做的是SOA服务,你希望你的调用的服务还会调用 你本来可以调用的服务吗?我想你不会把这个委托给别人的。


你为什么始终不肯重构一下你提到的很差的代码呢?

你的例子能说明问题吗?谁会为了得到一个字符串变成的List写那么多个函数?请给我一个实际的业务场景,不要举这种毫无意义的例子。
0 请登录后投票
   发表时间:2008-12-20  
downpour 写道
fjlyxx 写道
我觉得上面的例子已经说的很明白了,认真看下就明白了。 退一步说吧,上面代码中 每个子代码块都是对 test()负责的 ,都是和它进行约定 返回值 入参  和 异常等。  如果你是连续调用的 就不一样了。

如果你做的是SOA服务,你希望你的调用的服务还会调用 你本来可以调用的服务吗?我想你不会把这个委托给别人的。


你为什么始终不肯重构一下你提到的很差的代码呢?

你的例子能说明问题吗?谁会为了得到一个字符串变成的List写那么多个函数?请给我一个实际的业务场景,不要举这种毫无意义的例子。


上面的代码你不觉得很差吗?问题不在于它能干嘛而在于这样写确实还有改进的余地。函数的意义在于能够很好的定位很表示业务逻辑,如果你的代码能够通过函数明就你就能明白业务逻辑那么你的维护和扩展就高了。我记得重构书中提到这么一个说法,就是当你觉得你的一段代码块需要写注释的时候你就可以考虑把你的代码分成一个函数,上面的例子确实没有必要这么做,但我只是想通过这个代码说明委托的意思。如果你一定要抓住代码那么你完全可以把上面这段代码和那段数据库的代码联系起来。我不觉得有什么不同。
如果和业务联系在一起那么重构不能说明任何问题,但是如果你从维护和可扩展的角度去看就不一样了。
0 请登录后投票
   发表时间:2008-12-20  
fjlyxx 写道
downpour 写道
fjlyxx 写道
我觉得上面的例子已经说的很明白了,认真看下就明白了。 退一步说吧,上面代码中 每个子代码块都是对 test()负责的 ,都是和它进行约定 返回值 入参  和 异常等。  如果你是连续调用的 就不一样了。

如果你做的是SOA服务,你希望你的调用的服务还会调用 你本来可以调用的服务吗?我想你不会把这个委托给别人的。


你为什么始终不肯重构一下你提到的很差的代码呢?

你的例子能说明问题吗?谁会为了得到一个字符串变成的List写那么多个函数?请给我一个实际的业务场景,不要举这种毫无意义的例子。


上面的代码你不觉得很差吗?问题不在于它能干嘛而在于这样写确实还有改进的余地。函数的意义在于能够很好的定位很表示业务逻辑,如果你的代码能够通过函数明就你就能明白业务逻辑那么你的维护和扩展就高了。我记得重构书中提到这么一个说法,就是当你觉得你的一段代码块需要写注释的时候你就可以考虑把你的代码分成一个函数,上面的例子确实没有必要这么做,但我只是想通过这个代码说明委托的意思。如果你一定要抓住代码那么你完全可以把上面这段代码和那段数据库的代码联系起来。我不觉得有什么不同。
如果和业务联系在一起那么重构不能说明任何问题,但是如果你从维护和可扩展的角度去看就不一样了。


正因为我不知道差在哪里,才劳您大驾告诉我应该怎么重构啊。

请不要一套一套的理论说书上怎么说,什么东西是什么定义。请拿出实际代码来告诉大家,这段被你评论为很差的代码,到底应该怎么重构。
0 请登录后投票
   发表时间:2008-12-20  
fjlyxx 写道
downpour 写道
fjlyxx 写道
我觉得上面的例子已经说的很明白了,认真看下就明白了。 退一步说吧,上面代码中 每个子代码块都是对 test()负责的 ,都是和它进行约定 返回值 入参  和 异常等。  如果你是连续调用的 就不一样了。

如果你做的是SOA服务,你希望你的调用的服务还会调用 你本来可以调用的服务吗?我想你不会把这个委托给别人的。


你为什么始终不肯重构一下你提到的很差的代码呢?

你的例子能说明问题吗?谁会为了得到一个字符串变成的List写那么多个函数?请给我一个实际的业务场景,不要举这种毫无意义的例子。


上面的代码你不觉得很差吗?问题不在于它能干嘛而在于这样写确实还有改进的余地。函数的意义在于能够很好的定位很表示业务逻辑,如果你的代码能够通过函数明就你就能明白业务逻辑那么你的维护和扩展就高了。我记得重构书中提到这么一个说法,就是当你觉得你的一段代码块需要写注释的时候你就可以考虑把你的代码分成一个函数,上面的例子确实没有必要这么做,但我只是想通过这个代码说明委托的意思。如果你一定要抓住代码那么你完全可以把上面这段代码和那段数据库的代码联系起来。我不觉得有什么不同。
如果和业务联系在一起那么重构不能说明任何问题,但是如果你从维护和可扩展的角度去看就不一样了。


对于一个层次模型,最基础的东西没必要像客户的业务那样变来变去的吧?TCP/IP协议已经很多年了,linux内核的接口也和多年前一样
0 请登录后投票
   发表时间:2008-12-23  
fjlyxx 写道
downpour 写道
frogfool 写道
fjlyxx 写道
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢?
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

这完全是一个不合格程序员写的代码。

去看看自己作的系统中有多少这样的情况,不是我自大,我只是想提醒这么一种常见的错误,让后辈人少走点弯路。



合格的写法是啥?让我们看看重构理论大师如何实践重构的?


我也非常好奇啊,请问这段代码的问题在哪里?应该如何重构?

我至今为之没有看到楼主给我们写出代码来,所以我完全不知道你所谓的重构到底是什么。


public String test(){
		String temp = "a|b|c|d|e|f";
		return test1(temp);
	}

	public String test1(String s){
		String[] p = s.split("\\|");
		return this.test2(p);
	}

	public String test2(String[] s){
		List list = new ArrayList();
		for(int i = 0;i < s.length;i++){
			list.add(s[i]);
		}
		return this.test3(list);
	}

	public String test3(List list){
		return list.toString();
	}


再看这种写法

public String test(){
		String temp = "a|b|c|d|e|f";
		String[] test1rs = this.test1(temp);
		List test2rs = this.test2(test1rs);
		String test3rs = this.test3(test2rs);
		return test3rs;
	}

	public String[] test1(String s){
		String[] p = s.split("\\|");
		return p;
	}

	public List test2(String[] s){
		List list = new ArrayList();
		for(int i = 0;i < s.length;i++){
			list.add(s[i]);
		}
		return list;
	}

	public String test3(List list){
		return list.toString();
	}


一样的功能 初看起来没有什么区别,如果我业务变化了 明显2的实现 容易改动。我在前面的回复中已经说了不是要怎么去解决实际的结构问题,问题是怎么去看重构。

单从这段代码来讲,应该采取第二种吧,最起码第二种的代码可重用性强啊,再说第一种的方法之间的耦合度也太大了

对了怎么没有涉及到异常?

感觉楼主的问题如果从重构的角度而不是从架构的角度考虑,那就是第二种了
0 请登录后投票
   发表时间:2008-12-23  
donglx2004 写道
fjlyxx 写道
downpour 写道
frogfool 写道
fjlyxx 写道
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢?
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

这完全是一个不合格程序员写的代码。

去看看自己作的系统中有多少这样的情况,不是我自大,我只是想提醒这么一种常见的错误,让后辈人少走点弯路。



合格的写法是啥?让我们看看重构理论大师如何实践重构的?


我也非常好奇啊,请问这段代码的问题在哪里?应该如何重构?

我至今为之没有看到楼主给我们写出代码来,所以我完全不知道你所谓的重构到底是什么。


public String test(){
		String temp = "a|b|c|d|e|f";
		return test1(temp);
	}

	public String test1(String s){
		String[] p = s.split("\\|");
		return this.test2(p);
	}

	public String test2(String[] s){
		List list = new ArrayList();
		for(int i = 0;i < s.length;i++){
			list.add(s[i]);
		}
		return this.test3(list);
	}

	public String test3(List list){
		return list.toString();
	}


再看这种写法

public String test(){
		String temp = "a|b|c|d|e|f";
		String[] test1rs = this.test1(temp);
		List test2rs = this.test2(test1rs);
		String test3rs = this.test3(test2rs);
		return test3rs;
	}

	public String[] test1(String s){
		String[] p = s.split("\\|");
		return p;
	}

	public List test2(String[] s){
		List list = new ArrayList();
		for(int i = 0;i < s.length;i++){
			list.add(s[i]);
		}
		return list;
	}

	public String test3(List list){
		return list.toString();
	}


一样的功能 初看起来没有什么区别,如果我业务变化了 明显2的实现 容易改动。我在前面的回复中已经说了不是要怎么去解决实际的结构问题,问题是怎么去看重构。

单从这段代码来讲,应该采取第二种吧,最起码第二种的代码可重用性强啊,再说第一种的方法之间的耦合度也太大了

对了怎么没有涉及到异常?

感觉楼主的问题如果从重构的角度而不是从架构的角度考虑,那就是第二种了

java的异常处理方式有点变态
没办法改变顺序也不能包装
一般重用方式就是用代理...

第一种方式的从test1到test58的话我想也就没人认为这个好用了
(第一种方式叫过结构化或叫过程化编程是很早以前流行的方式,也是一种最佳实践呢)
第二种方式在有意义的时候会更容易理解.....(步骤超多时可以更快的找到有用信息)
0 请登录后投票
   发表时间:2009-01-05  
感觉还是要看情况吧,如果想把业务划分层次,肯定得用到代理,那就选第一种,如果在同一层次内,为了能较好的了解业务主体流程程,降低各模块的藉合,那么适用于第二种
0 请登录后投票
   发表时间:2009-08-12  
downpour 写道
frogfool 写道
fjlyxx 写道
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢?
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

这完全是一个不合格程序员写的代码。

去看看自己作的系统中有多少这样的情况,不是我自大,我只是想提醒这么一种常见的错误,让后辈人少走点弯路。



合格的写法是啥?让我们看看重构理论大师如何实践重构的?


我也非常好奇啊,请问这段代码的问题在哪里?应该如何重构?

我至今为之没有看到楼主给我们写出代码来,所以我完全不知道你所谓的重构到底是什么。

期待。。。
0 请登录后投票
论坛首页 Java企业应用版

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