`
fjlyxx
  • 浏览: 23058 次
  • 性别: 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{
.....
}



从段代码中反应了一个很严重的问题。可以从架构和程序实现上进行分析。
分享到:
评论
20 楼 fhjxp 2008-12-12  
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的问题呢?
19 楼 zhaomingzm_23 2008-12-12  
用一个BaseException做基类.
你每一个小方法抛一个基于这个BaseException的异常,
再外层捕获的时候用过BaseException的接口方法或者抽象方法.这样不就解决了你的问题吗?
PS:SQLException就是这样做的.
18 楼 daaoke 2008-12-12  
就是第二个。
看过一个文章,说怎么处理异常。
第一:如果能处理异常,就处理了。抛出一个说明性异常
第二:如果能处理一部分,就处理一部分。然后抛出一个其它异常。
第三:如果完全不能处理,那就全部抛出。由上层处理。
17 楼 Gone.Li 2008-12-12  
个人觉得第一种有第一种的好处,不过就是层次太多了,第一种看上去不就是三层架构的模式么,只是层次太多了。在test调用test1中,如果test2的方法改变了,或者换成了其他的产品也好,都不会影响上层的调用方式即test1的接口不变。
16 楼 fjlyxx 2008-12-12  
是的,我不是想要大家帮我解决问题。我是想讨论下这个问题。

如果现在的代码是第一种实现,那么重构成第二种的话,会碰见什么问题呢?

大多数程序员并不是说现架构再编码,很容易出现 A函数产生一个C结果  而C结果是B函数的入参,习惯性的就会在 A里面直接调用C。所以第二种实现的接口定义是比较困难的。

异常这块 我只是打个比方,没有具体的含义,目的就是用最坏的代码结构去分析一个问题。
15 楼 hahalizx 2008-12-12  
应该选择第二种,起码重用性比较强!
对于异常处理,一般只是在业务层捕获吧,底层的话尽量是抛出
14 楼 yuankai 2008-12-12  
我选的话也会选第二种,这样也便于阅读。
对于异常处理的话就要看是在什么情况下,如果你这个类是在最底层,做为一个Util类的话,直接往外面抛比较好,如果外部调用出了什么异常,就可以知道是什么问题。
13 楼 frogfool 2008-12-12  
能否给个应用场景?否则就是完全无意义的讨论。
这是需要根据应用需求决定方法划分的粒度问题,而且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是否要被其他上层代码调用
12 楼 RyanPoy 2008-12-12  
直接由a调用b、c、d。
如果a、b、c、d都是类,则减少类之间的耦合关系。
如果a、b、c、d都是方法,则减少方法直接的耦合关系
11 楼 yunhaifeiwu 2008-12-12  


  我晕!

   从结构上说,我选第二种!理由:结构清楚,便于封装。代码易测试,易重用。

我估计,楼主对oo没有很好的理解
10 楼 ray_linn 2008-12-12  
第一种为什么要抛出E1,E2,E3....?

理论上异常是用来处理,而不是简单抛出的。Test1应该处理掉E1...Ex中的大部分异常,仅仅抛出少数异常。
9 楼 xuyao 2008-12-12  
我也选第二种,便于理解,清晰,很多开源代码都是这样写的。如果你流程变了,注释掉一个就成,如果第一种,会死人的,修改成本太高。个人看法。。。呵呵
8 楼 抛出异常的爱 2008-12-12  
如果让我来选.
我会选第二种

由于没有逻辑可言的情况下
第二种的代码信息含量更接近5这个数....
更易让人记忆与查寻.....


如果第一种更合乎业务逻辑
那么就选第一种.
那样子,业务逻辑与代码逻辑总共只需要记忆一次
比另一种少记忆一次.

OO的主要目的就是少记忆 ,快速查找
OO的选择就是把自己当作一个有限大小 的一个cacahe要尽量提高命中率
7 楼 fjlyxx 2008-12-11  
有没有人从结构方面进行考虑的,如果在的代码中出现地第一种情况的时候你会怎么进行重构,进行重构的时候 你觉得你会碰见什么问题?第一种代码 的缺点是什么?第二种代码的优点是什么?实现难点是什么?
6 楼 repsihWDX 2008-12-11  
算了我也看不懂楼主要表达什么,就不挑战我自己的那可怜的iq了。。
5 楼 bloodrate 2008-12-11  
具体问题具体分析,要考虑方法的可访问性等问题,如果真这么多方法的话,虽然第一种不可能,所有调用都在一个方法里可能性也不大,要考虑具体职责该归哪个方法,也要考虑这个方法是否有资格访问另一个方法,一些都为了封装性考虑,能不暴露的就不暴露
4 楼 bulktree 2008-12-11  
完全是一段伪代码,根本就没有确切的目标!要是试试定义一个errorMsg 传递一下?
3 楼 fjlyxx 2008-12-11  
异常部分 我只是想说明 如果是选择第一种的话   那么你的异常处理会怎么样?没有特别的意思。test()2;  这个是笔误,我不是在IDE环境中写的 这只是一段伪代码。
2 楼 fjlyxx 2008-12-11  
呵呵  解释下,如果你只是真看这两段代码,那么我我觉你是一个小菜了。
这是一个描述 用:A调用B B调用C C调用D 
还是由A同一去调用B C D的问题。
1 楼 风花雪月饼 2008-12-11  
# public void test1() throws E2,E3,E4,E5,E6{ 
#  test()2; 
# } 


..................................相当严重。。。


有什么异常就丢什么异常。你这样写谁知道是什么意思?

相关推荐

    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是西门子的一款...

    Unix编程常见问题解答.rar_UNIX

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

    精彩编程与编程技巧-VB常见问题解答(1)...

    根据提供的文件信息,我们可以总结出以下关键知识点,这些知识点主要涉及Visual Basic(简称VB)中的编程技巧以及解决常见问题的方法。 #### 标题:精彩编程与编程技巧—VB常见问题解答(1) 此标题表明文章将聚焦于...

    欧姆龙ST编程中文手册

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

    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编程中,问题...

    分析C语言编程中常见错误及解决办法 (1).pdf

    本文将对C语言编程中常见的错误及解决办法进行分析,以帮助编程者提高编程技能,避免重复犯错。 首先,C语言编程中的错误通常可以分为编译错误和运行时错误两大类。编译错误是指代码在编译阶段就被识别出的错误,...

Global site tag (gtag.js) - Google Analytics