`
fjlyxx
  • 浏览: 23388 次
  • 性别: Icon_minigender_1
  • 来自: 福建
文章分类
社区版块
存档分类
最新评论

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

阅读更多
说一个开发中经常犯的错误。在实际的开发中请注意你的代码结构。
直接 给出一段代码吧。各位发表下自己的看法和见解。(随便写的)
这是一个描述 用:A调用B B调用C C调用D
还是由A同一去调用B C D的问题。


给个具体的应用场景吧:

就拿简单的 根据  用户输入条件 --》拼装一句SQL==》 执行数据库查询 -》 返回结果。

上面的方法就对应以下的几个testx函数吧。
表达不行,如果不明白下面的伪代码请看 http://www.iteye.com/topic/290788?page=5 中我的回复,

第一个:

public void test() throws E2,E3,E4,E5,E6{
   test1();
}

public void test1() throws E2,E3,E4,E5,E6{
 test2();
}

public void test2() throws E3,E4,E5,E6{
test3()
}

public void test3() throws E4,E5,E6{
test4()
}

public void test4() throws E5,E6{
test5()
}
public void test5() throws E6{
.....
}

第二个:


public void test() throws E1{
   test1();
   test2();
   test3();
   test4();
   test5();
}

public void test1() throws E2{
.....
}

public void test2() throws E3{
.....
}

public void test3() throws E4{
......
}

public void test4() throws E5{
.....
}
public void test5() throws E6{
.....
}



从段代码中反应了一个很严重的问题。可以从架构和程序实现上进行分析。
分享到:
评论
40 楼 frogfool 2008-12-12  
抛出异常的爱 写道
fjlyxx 写道
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢?
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

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

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

我见过很多这样的代码.....
很多很多.....
容我再吐一次回来跟你说.


吐完回来写出你解决当前问题不吐的代码?


这是逻辑代码的分层和拆分合并的粒度问题。It totally depends on your business logic.
LZ给的代码有明显错误。 我猜想想表达的意思是
第一个:    
public void test() throws [color=red]E2,E3,E4,E5,E6[/color]{    
    test10();  
}    
public void test10() throws E2,E3,E4,E5,E6{  
    [color=red]logicOfTest1();[/color]  
    test2();  
}    
public void test20() throws E3,E4,E5,E6{  
    [color=red]logicOfTest2();[/color]  
    test3()  
}    
public void test30() throws E4,E5,E6{
    [color=red]logicOfTest3();  [/color]
    test4()  
}    
public void test40() throws E5,E6{       
    [color=red]logicOfTest4();[/color]
    test5() 
}  
public void test50() throws E6{  
    [color=red]logicOfTest5();[/color]
}  
  
第二个:  
  
  
public void test() throws E1{  
   test1();  
   test2();  
   test3();  
   test4();  
   test5();  
}  
  
public void test1() throws E2{  
    logicOfTest1(); 
} 
public void test2() throws E3{  
    logicOfTest2();
} 
public void test3() throws E4{  
    logicOfTest3();
}
public void test4() throws E5{  
    logicOfTest4();
}  
public void test5() throws E6{  
    logicOfTest5();
}  


1 第一个方法和第二个方法的下层方法完全没有可比性,因为所包含的逻辑不同,不同的原因是根据当时的场景分拆和合并。下层的代码还要被其他上层代码调用。
2 第一个方法中,上层代码调用下层代码中对于异常也不用更高层次的业务逻辑语义进行封装,直接抛出下层的E2,E3,E4,E5,E6

39 楼 frogfool 2008-12-12  
fjlyxx 写道
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

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

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


请给你出你解决当前问题的代码!用代码说话,让我少走弯路。
38 楼 frogfool 2008-12-12  
抛出异常的爱 写道
fjlyxx 写道

已经给出一个背景了,就是 根据用户输入--》组装SQL-》执行数据库操作-》返回结果(解析结果)


PS:楼上...链式写法我看了就想到了jquery.....等我出去吐一下先/


请不要把当前场景简单广义认为是链式写法,仅当前场景
37 楼 mating 2008-12-12  
一般都会选第二个啊!一般编程中好像都是第二种吧!
36 楼 dwwind 2008-12-12  
各有好处,异常一层层抛出也有好处的,就是不容易找到到底所那里抛出了
35 楼 抛出异常的爱 2008-12-12  
fjlyxx 写道
就写代码而言,其实也要关系代码的纵向和横向的关系。

如果代码只是为了实现功能,忽略了这些的必须注意的问题。那么也许有一天你要对这个系统进行扩展和维护的时候你将发现 你无从下手。 而且第一种的实现方式会隐藏很多BUG,建议在写完代码后可以进行必要的重构。 最少不要让人觉得你是在写流水帐。
好的习惯会给你减少很多麻烦的。

if(jQuery) (function($){
	
	$.extend($.fn, {
		fileTree: function(o, h) {
			// Defaults
			if( !o ) var o = {};
			if( o.root == undefined ) o.root = '/';
			if( o.script == undefined ) o.script = 'jqueryFileTree.php';
			if( o.folderEvent == undefined ) o.folderEvent = 'click';
			if( o.expandSpeed == undefined ) o.expandSpeed= 500;
			if( o.collapseSpeed == undefined ) o.collapseSpeed= 500;
			if( o.expandEasing == undefined ) o.expandEasing = null;
			if( o.collapseEasing == undefined ) o.collapseEasing = null;
			if( o.multiFolder == undefined ) o.multiFolder = true;
			if( o.loadMessage == undefined ) o.loadMessage = 'Loading...';
			
			$(this).each( function() {
				
				function showTree(c, t) {
					$(c).addClass('wait');
					$(".jqueryFileTree.start").remove();
					$.post(o.script, { dir: t }, function(data) {
						$(c).find('.start').html('');
						$(c).removeClass('wait').append(data);
						if( o.root == t ) $(c).find('UL:hidden').show(); else $(c).find('UL:hidden').slideDown({ duration: o.expandSpeed, easing: o.expandEasing });
						bindTree(c);
					});
				}
				
				function bindTree(t) {
					$(t).find('LI A').bind(o.folderEvent, function() {
						if( $(this).parent().hasClass('directory') ) {
							if( $(this).parent().hasClass('collapsed') ) {
								// Expand
								if( !o.multiFolder ) {
									$(this).parent().parent().find('UL').slideUp({ duration: o.collapseSpeed, easing: o.collapseEasing });
									$(this).parent().parent().find('LI.directory').removeClass('expanded').addClass('collapsed');
								}
								$(this).parent().find('UL').remove(); // cleanup
								showTree( $(this).parent(), escape($(this).attr('rel').match( /.*\// )) );
								$(this).parent().removeClass('collapsed').addClass('expanded');
							} else {
								// Collapse
								$(this).parent().find('UL').slideUp({ duration: o.collapseSpeed, easing: o.collapseEasing });
								$(this).parent().removeClass('expanded').addClass('collapsed');
							}
						} else {
							h($(this).attr('rel'));
						}
						return false;
					});
					// Prevent A from triggering the # on non-click events
					if( o.folderEvent.toLowerCase != 'click' ) $(t).find('LI A').bind('click', function() { return false; });
				}
				// Loading message
				$(this).html('<ul class="jqueryFileTree start"><li class="wait">' + o.loadMessage + '<li></ul>');
				// Get the initial file list
				showTree( $(this), escape(o.root) );
			});
		}
	});
	
})(jQuery);
34 楼 fjlyxx 2008-12-12  
就写代码而言,其实也要关系代码的纵向和横向的关系。

如果代码只是为了实现功能,忽略了这些的必须注意的问题。那么也许有一天你要对这个系统进行扩展和维护的时候你将发现 你无从下手。 而且第一种的实现方式会隐藏很多BUG,建议在写完代码后可以进行必要的重构。 最少不要让人觉得你是在写流水帐。
好的习惯会给你减少很多麻烦的。
33 楼 土匪一份子 2008-12-12  
我只是觉得LZ的头像上的小女孩好可爱。。。。。。。。
32 楼 抛出异常的爱 2008-12-12  
fjlyxx 写道
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢?
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

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

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

我见过很多这样的代码.....
很多很多.....
容我再吐一次回来跟你说.
31 楼 fjlyxx 2008-12-12  
难道你们的系统都没有进行过重构吗?  好的系统是重构出来的,好好的看看重构的原则,如果你没有这么做过,你怎么会发现模式的重要。如果你的接口都是随便定义的那么你怎么能体会这两种方式的区别呢?
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          | 
//   返回结果       组装SQL并执行数据库操作                         根据用户输入

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

去看看自己作的系统中有多少这样的情况,不是我自大,我只是想提醒这么一种常见的错误,让后辈人少走点弯路。
30 楼 抛出异常的爱 2008-12-12  
fjlyxx 写道

已经给出一个背景了,就是 根据用户输入--》组装SQL-》执行数据库操作-》返回结果(解析结果)

用第二种方式....
你说的已经是你的答案了.

但在现实中:
是用户输入,用户输出, 用户需求1,用户需求2,用户需求3.有可能还有用户需求4.....
现在没有需求4但很可能会加上需求4或需求5....
那么用第一种方式是最合适的....

用哪种方式,与你用的中文描述有直接的关系....

PS现在的系统大多用方式 1 主要还是由于每层的代码总量太大.合起来人类很难理解.

PS:楼上...链式写法我看了就想到了jquery.....等我出去吐一下先/
29 楼 frogfool 2008-12-12  
fjlyxx 写道


已经给出一个背景了,就是 根据用户输入--》组装SQL-》执行数据库操作-》返回结果(解析结果)



问题已经很清楚了
public Object findUser(final Map parameters) {
return this.getSqlMapClientTemplate().queryForObject("findUser", parameters);
//      |                      |                                                          |  
//   返回结果       组装SQL并执行数据库操作                         根据用户输入
}
28 楼 frogfool 2008-12-12  
v861 写道
补充一下 

第三 ,本事我想回帖,但看到你好像对二楼的回帖中包含
"小菜"之类的字眼 所以忍不住回帖,不排除打抱不平的心理,或许 第三条才是第一条


so do I
27 楼 v861 2008-12-12  
补充一下 

按照你这简单的逻辑  “A调用B B调用C C调用D 还是由A同一去调用B C D的问题。”

第一 ,方法之间的调用方式 不是一个简单的技术问题,跟架构有关,跟代码覆盖率有关,跟业务需求有关,跟代码的易变性有关,也跟代码通用度有关.....

第二 ,你什么时候(需求,设计,编码,重构?),如何保证 A调用B B调用C C调用D  跟 A同一去调用B C D 时参数的稳定性(即BCD参数 不变)

第三 ,本事我想回帖,但看到你好像对二楼的回帖中包含
"小菜"之类的字眼 所以忍不住回帖,不排除打抱不平的心理,或许 第三条才是第一条


26 楼 v861 2008-12-12  
我想说lz的问题很无聊,而且还有点自大,没有最好的模式,只有最好的架构,任何技术的出现都是要解决实际的业务问题,你冠冕堂皇问的这个问题,实在是......
25 楼 elam 2008-12-12  
难道就是想说策略模式的多用组合少用继承这个原则?
24 楼 lizhaosuper 2008-12-12  
个人觉得还是di4二种比较好,比如说我们使用DAO层的目的不就是为了使每个DAO只是针对某一个pojo类的接口,这样在service层再根据自己的需要来进行相关逻辑的组织。我们可以这样来看待楼主列举的例子,test1到test4每一个是一个DAO接口,而TEST方法是service层的一个接口这样不就是在service层中来调用的不同的DAO来实现自己的逻辑吗,如果是第一种方法不就是让每个DAO之间进行了耦合吗这也不符合MVC分层实现的目的啊。个人看法。
23 楼 fjlyxx 2008-12-12  
fhjxp 写道
frogfool 写道
能否给个应用场景?否则就是完全无意义的讨论。
这是需要根据应用需求决定方法划分的粒度问题,而且LZ给的例子也有误导性。
“第一个”testX()都缺少自己的logicCode
第一个  
public void test1() throws E2,E3,E4,E5,E6{  
    test2();
    logicCode1();
}
第二个
public void test1() throws E2,E3,E4,E5,E6{
    logicCode1();
}  


问题不在于test()该怎么调用下层方法,
而在于test1()是否要包含调用test2()?!
test1是否要被其他上层代码调用

为什么楼主不回答frogfoo1的问题呢?


已经给出一个背景了,就是 根据用户输入--》组装SQL-》执行数据库操作-》返回结果(解析结果)
22 楼 kulinglei 2008-12-12  
我也来回答一下,我看了之后好像想起点什么??....如果把第一中的五个text分别放在五个类中,不第二中的五个方法放在一个类中,
第一种不是分层吗??
第二中不是pojo类吗???
好像讨论两种架构的问题啊,
呵呵随便说说,
21 楼 laochake 2008-12-12  
这个还是要看具体的业务
第一种利于分层,如传统的ssh层次:
action-->service-->dao

相关推荐

    108种编程中常见的问题及解决办法

    "108种编程中常见的问题及解决办法" 是一个非常实用的资源集合,旨在帮助程序员们高效地处理各种编程难题。这个压缩包包含了108个具体问题的源代码示例,涵盖了多种编程语言和技术领域,对于初学者和经验丰富的...

    PB常见问题汇编;PowerBuilder编程俱乐部常见问题;PB常见函数;PowerBuilder常见问题集;PowerBuilder使用技巧集;PB常见问题;PB技巧100例;PB技巧及经验。是个集成包。

    2. **PowerBuilder编程俱乐部常见问题**:这可能是一个社区或论坛的问题汇总,包含了用户在实际编程过程中遇到的问题和解决方案。这些问题往往具有实践性,能够帮助开发者解决实际遇到的难题。 3. **PB常见函数**:...

    C++语言99个常见编程错误pdf

    它不仅对初学者有帮助,对经验丰富的C++程序员来说也是一个很好的参考资料。 在标签中,“C++ 常见编程错误”直接点明了本书的内容重点,即专注于C++编程中的错误。这个标签强调了读者学习这本书的目标是了解和预防...

    商业编程-源码-VC常见问题集.zip

    在商业编程领域,Visual C++(简称VC)是一款...综上所述,"商业编程-源码-VC常见问题集.zip"很可能包含了这些主题的解答,对于遇到问题的开发者来说,这是一个宝贵的资源库,能帮助他们解决实际工作中遇到的各种挑战。

    PowerBuilder编程常见问题分析与解决

    “PowerBuilder编程俱乐部常见问题.chm”是一个Windows帮助文档,很可能包含了社区成员在实践中遇到的典型问题及解决方案。通过阅读这个文档,你可以找到各种问题的具体解答,包括错误代码的含义、问题的原因分析...

    c语言编程常见问题解答

    c语言编程常见问题解答 对初学者帮助很大 强力推荐

    经典VC期刊(C与VC及常见编程问题)

    《经典VC期刊:深入理解C与VC及常见编程问题》 C语言和Visual C++(简称VC)是软件开发中的重要工具,它们各自拥有独特的特性和应用领域。本期刊聚焦于这两个领域的经典问题,旨在帮助程序员提升编程技能,解决实际...

    50道Java常见编程题(有精力的同学看看).rar

    这份"50道Java常见编程题(有精力的同学看看).rar"压缩包文件提供了学习者一个宝贵的资源,涵盖了Java的基础编程练习,旨在帮助他们巩固基础知识并提升编程技能。 在Java的世界里,面向对象编程(Object-Oriented ...

    win10S7200plc编程帮助文件补丁.zip

    标题中的“win10S7200plc编程帮助文件补丁.zip”指的是一个针对Windows 10操作系统的补丁,专门用于解决在该系统下S7-200 PLC(可编程逻辑控制器)编程软件的帮助文件无法正常打开的问题。S7-200 PLC是西门子的一款...

    欧姆龙ST编程中文手册

    本章将对欧姆龙ST语言编程中需要注意的一些问题进行讲解,包括安全注意事项、应用注意事项等。 3.1 安全注意事项 在编程过程中,需要遵守一定的安全规则,以避免人身伤害或财产损失。例如,在编程过程中,需要注意...

    Unix编程常见问题解答.rar_UNIX

    本资料"Unix编程常见问题解答"显然是针对这些领域的常见问题进行了解答,帮助开发者解决实际编程中的困难。 首先,我们可以从"Unix编程常见问题解答.htm"这个文件名推测,这是一个HTML格式的文档,通常包含了详细的...

    C语言编程错误处理:常见问题与解决方案

    本文将介绍C语言中常见的编程错误,并提供相应的解决方案。C语言的编程错误多种多样,从内存管理到逻辑错误,再到并发和安全性问题。通过理解这些错误的成因和掌握相应的解决方案,程序员可以编写更健壮、更安全的C...

    编程珠玑 编程珠玑 编程珠玑 编程

    书中涵盖了一系列实用的编程问题和解决方案,这些“珠玑”般的编程智慧,无论对于初学者还是经验丰富的开发者,都有着极高的参考价值。 编程珠玑的核心概念之一是数据结构与算法的选择和设计。书中的例子多以实际...

    PLC常见编程问题点总结.ppt

    本文针对PLC编程中常见的问题进行了归纳和总结,旨在帮助工程师避免这些问题,提升编程质量和效率。 首先,PLC的组态设置是整个系统的基础。常见问题包括订货号与实际不一致,编程软件可能没有实际设备的订货号选择...

    如何学好编程 (精挑细选编程教程,帮助现在在校学生学好编程,让你门找到编程的方向)四个方法总有一个学好编程的方法适合你)

    学好编程是一个长期且系统的过程,涉及到多个方面。下面我将详细介绍四个方法,帮助在校学生找到编程的方向,提升编程技能。 方法(一)积累实践经验 编程不仅仅是理论的学习,更重要的是实践经验的积累。从基础...

    java常见的面试编程题

    本压缩包文件包含了一系列常见的Java编程题目,旨在帮助学习者巩固基础,提高解决问题的能力。 1. **冒泡排序**:冒泡排序是最基础的排序算法之一,通过不断交换相邻的逆序元素来逐步完成排序。在Java中,可以使用...

    vector(容器)、 c &c++编程规范doc、495个c问题.pdf、c常见问题.pdf

    《495个C问题.pdf》可能包含了C语言中常见的陷阱和误区,这些问题可能涉及到类型转换、指针操作、内存管理、预处理器等方面。理解和避免这些问题有助于写出更健壮的代码。例如,C语言中的类型转换可能导致精度损失或...

    西门子常见编程错误.rar

    这个名为"西门子常见编程错误.rar"的压缩包文件包含了一个PDF文档——"S7-200常见编程错误.pdf",很显然,它是为了帮助用户识别和解决在使用西门子S7-200系列PLC编程时遇到的典型错误。下面我们将详细探讨这些编程...

    问题探究法在Java编程求解趣味题中的应用.pdf

    问题探究法是指在编程过程中,遇到一个大型或复杂的问题时,将其分解成多个小问题,然后逐一解决这些小问题,最终解决整个大问题。这种方法可以帮助开发者更好地解决问题,提高编程效率和质量。 在Java编程中,问题...

Global site tag (gtag.js) - Google Analytics