动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.高手教您使用MIDP底层用户接口AP.
.每个Java初学者都应该搞懂的六个.
.将文本格式的文章转换为html/xml.
.JDBC基础教程之语句.
.Lucene 索引文件格式的规格定义.
.Windows CE, PocketPC.
.SequenceInputStream使用一例.
.Java中使用JCOM操作Office对象.
.J2SE 6 在国际化方面的增强.
.我的JAVA工具.
.Java类体中的this和super的用法.
.Java咖啡馆(7)——大话面向对象(.
.Web Service实现包--AXIS2学习笔.
.我的java学习笔记version0.1.
.在Applet中读取文件内容.
.setSeconds 方法.
.Java加密扩展基础.
.如何在JBoss+MySQL环境下运行obe.
.Struts 的汉字显示问题终结解决方.
.SunStorEdgeInstantImage?操作.

Java高手论道:你还在用if else吗?

发表日期:2008-1-5 |



  面向过程设计和面向对象设计的主要区别是:是否在业务逻辑层使用冗长的if else判定。假如你还在大量使用if else,当然,界面表现层除外,即使你使用Java/C#这样完全面向对象的语言,也只能说明你的思维停留在传统的面向过程语言上。

  传统思维习惯分析

  为什么会业务逻辑层使用if else,其实使用者的目的也是为了重用,但是这是面向过程编程的重用,程序员只看到代码重用,因为他看到if else几种情况下大部分代码都是重复的,只有个别不同,因此使用if else可以避免重复代码,并且认为这是模板Template模式。

  他范的错误是:程序员只从代码运行顺序这个方向来看待它的代码,这种思维类似水管或串行电路,水沿着水管流动(代码运行次序),当碰到几个分管(子管),就分到这几个分管子在流动,这里就相当于碰到代码的if else处了。

  而使用OO,则首先打破这个代码由上向下顺序等同于运行时的先后循序这个规律,代码结构不由执行循序决定,由什么决定呢?由OO设计;设计模式会取代这些if else,但是最后总是由一个Service等总类按照运行顺序组装这些OO模块,只有一处,这处可包含事务,一般就是Service,EJB中是Session bean。

  一旦需求变化,我们更多的可能是Service中各个OO模块,甚至是只改动Service中的OO模块执行顺序就能符合需求。

  这里我们也看到OO分离的思路,将以前过程语言的一个Main函数彻底分解,将运行顺序与代码其他逻辑分离开来,而不是象面向过程那样混乱在一起。所以有人感慨,OO也是要顺序的,这是肯定的,要害是运行顺序要单独分离出来。

  是否有if else可以看出你有没有将运行顺序分离到家。

  设计模式的切入口

  经常有人反映,设计模式是不错,但是我很难用到,其实假如你使用if else来写代码时(除显示控制以外),就是在写业务逻辑,只不过使用简单的判定语句来作为现实情况的替代者。

   还是以大家熟悉的论坛帖子为例子,如ForumMessage是一个模型,但是实际中帖子分两种性质:主题贴(第一个根贴)和回帖(回以前帖子的帖子),这里有一个朴素的解决方案:

  建立一个ForumMessage,然后在ForumMessage加入isTopic这样判定语句,注重,你这里一个简单属性的判定引入,可能导致你的程序其他地方到处存在if else 的判定。

  假如我们改用另外一种分析实现思路,以对象化概念看待,实际中有主题贴和回帖,就是两种对象,但是这两种对象大部分是一致的,因此,我将ForumMessage设为表达主题贴;然后创建一个继续ForumMessage的子类ForumMessageReply作为回帖,这样,我在程序地方,如Service中,我已经确定这个Model是回帖了,我就直接下溯为ForumMessageReply即可,这个有点类似向Collection放入对象和取出时的强制类型转换。通过这个手段我消灭了以后程序中if else的判定语句出现可能。

  从这里体现了,假如分析方向错误,也会导致误用模式。

  讨论设计模式举例,不能没有业务上下文场景的案例,否则无法决定是否该用模式,下面举两个对比的例子:

  第一.举例的第一个代码案例是没有上下文的,文中只说明有一段代码:

main() {
if(case A){

//do with strategy A

}else(case B){

//do with strategy B

}else(case C){

//do with strategy C

}

}
 
  这段代码只是纯粹的代码,没有业务功能,所以,在这种情况下,我们就很难确定使用什么模式,就是一定用策略模式等,也逃不过还是使用if else的命运,设计模式不是魔法,不能将一段毫无意义的代码变得简单了,只能将其体现的业务功能更加轻易可拓展了。

  第二.在一个PacketParser业务案例,这段代码是体现业务功能的,是一个数据包的分析,作者也比较了各种模式使用的不同,所以我们还是使用动态代理模式或Command模式来消灭那些可能存在的if else

  由以上两个案例表明:业务逻辑是我们使用设计模式的切入点,而在分解业务逻辑时,我们习惯则可能使用if else来实现,当你有这种企图或者已经实现代码了,那么就应该考虑是否需要重构Refactoring了。

  if else替代者

  那么实战中,哪些设计模式可以替代if else呢?其实GoF设计模式都可以用来替代if else,我们分别描述如下:

  • 状态模式 

      当数据对象存在各种可能性的状态,而且这种状态将会影响到不同业务结果时,那么我们就应该考虑是否使用状态模式,当然,使用状态模式之前,你必须首先有内存状态这个概念,而不是数据库概念,因为在传统的面向过程的/面向数据库的系统中,你很难发现状态的,从数据库中读取某个值,然后根据这个值进行代码运行分流,这是很多初学者常干的事情。

      使用传统语言思维的情况还有:使用一个类整数变量标识状态:

    public class Order{

    private int status;

    //说明:

    //status=1 表示订货但为查看 ;

    //status=2 表示已经查看未处理;

    //status=3 表示已经处理未付款

    //status=4 表示已经付款未发货

    //status=5 表示已经发货

    }

      上述类设计,无疑是将类作为传统语言的函数来使用,这样导致程序代码中存在大量的if else。


  • 上一篇:Aspectwerkz 2.0开发企业AOP快速入门 人气:423
    下一篇:在Java程序中实现高精度打印 人气:253
    浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
      最新网站源码 最新软件下载
    2008-7-24 Sablog-X v2.0 预览版
    2008-7-24 帝国备份王EmpireBak 2008 正式版
    2008-7-24 网趣网上购物系统时尚版 v8.2
    2008-7-24 纵横B2B电子商务系统XYECS!B2B v
    2008-7-24 e路小说小偷 v1.2.0723
    2008-7-24 凌风美女图片站程序 v2.2
    2008-7-24 TOM15电影收索程序
    2008-7-24 清风信息自动采集生成系统 v1.0
    2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
    2008-7-19 UltraEdit 简体中文增强版 14.10
    2008-7-19 CentOS 5.2 i386 LiveCD
    2008-7-19 Snapture多功能相机 v1.4
    2008-7-19 iAcces中文输入法 v1.0Build016
    2008-7-19 Cookbook烹饪秘籍 v2.5
    2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
    2008-7-19 Modem修复软件ZiPhone修改版04.0
    2008-7-19 AgileMessenger即时通讯工具美化
    2008-7-19 Sketches画图软件 v0.7b6破解版


      发表评论
    姓 名: 验证码:
    内 容:
    [ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
    [ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
    业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
    Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
    ホームページ制作 不動産検索システム 求人情報
    防水工事·改修工事 フットサル大会 探偵