??xml version="1.0" encoding="utf-8" standalone="yes"?>91精品国产九九九久久久亚洲 ,岛国精品视频在线播放,亚洲福利视频网http://www.aygfsteel.com/amigokxz/对象的歌?/description>zh-cnSun, 06 Jul 2025 20:10:29 GMTSun, 06 Jul 2025 20:10:29 GMT60?Java学习之\Q不走弯路,是捷径http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64394.htmlamigojavaamigojavaFri, 18 Aug 2006 08:42:00 GMThttp://www.aygfsteel.com/amigokxz/archive/2006/08/18/64394.htmlhttp://www.aygfsteel.com/amigokxz/comments/64394.htmlhttp://www.aygfsteel.com/amigokxz/archive/2006/08/18/64394.html#Feedback1http://www.aygfsteel.com/amigokxz/comments/commentRss/64394.htmlhttp://www.aygfsteel.com/amigokxz/services/trackbacks/64394.html  在ChinaITLAB导师制辅gQ笔者发现问得最多的问题莫过?如何学习~程QJAVA该如何学习?"。类似的问题回答多了Q难免会感觉厌烦Q就萌生了写下本文的x。到时候再有h问vcM的问题,我可以告诉他Q她Q,请你ȝ看《JAVA学习之\》。拜读过台湾蔡学镛先生的《JAVA夜未眠》,有些文章如《JAVA学习之道》等让我们确实有共鸣Q本文题目也由此而来?
  软g开发之路是充满荆棘与挑战之?也是充满希望之\。JAVA学习也是如此Q没有捷径可走。梦惛_《天龙八部》中虚竹一栯无崖子醍醐灌而轻松获得一甲子功力Q是很不现实的。每天Ԓ天大?天神啊,误l我一本葵花宝典吧"Q殊不知即你获得了葵花宝典Q除了受自宫其n之苦外,你也不一定成得了"东方不|"Q倒是?西方p|"的几率高一炏V?
  "不走弯\Q就是捷?Q佛(jng)l说的不无道理?
  1Q如何学习程序设计?
  JAVA是一U^収ͼ也是一U程序设计语aQ如何学好程序设计不仅仅适用于JAVAQ对C++{其他程序设计语a也一L用。有~程高手认ؓQJAVA也好C也好没什么分别,拿来q。ؓ什么他们能辑ֈ如此境界Q我x因ؓ~程语言之间有共通之处,领会了编E的_NQ自然能够做C通百通。如何学习程序设计理所当然也有许多共通的地方?
  1.1 培养兴趣
  兴趣是能够让你坚持下ȝ动力。如果只是把写程序作生的手段的话Q你会活的很累,也太对不赯׃。多兛_一些行业趣事,多想想盖茨。不是提倡天天做白日梦,但h要是没有了梦惻I你觉得有味道吗?可能像许多深x地农民一P打打dQ喝喝功夫茶Q拜拜胦爷Q每个月有几万十几万甚x多的q帐Q凭I多Z"食利阶层"。你认ؓQ这h味道吗?有空多到一些程序员论坛转{Q你会发玎ͼ他们其实很乐观幽默,时不时会冒出智慧的火花?
  1.2 慎选程序设计语a
  h入错行Q女怕嫁错郎。初学者选择E序设计语言需要}慎对待。Y件开发不仅仅是掌握一门编E语a了事Q它q需要其他很多方面的背景知识。Y件开发也不仅仅局限于某几个领域,而是已经渗透到了各行各业几乎每一个角落?
  如果你对g比较感兴,你可以学习C语言/汇编语言Q进入硬件开发领域。如果你对电(sh)信的行业知识及网l比较熟(zhn),你可以在C/C++{之上多花时_以期q入?sh)信软g开发领域。如果你Ҏ(gu)作系l比较熟(zhn),你可以学习C/Linux{等,为Linux内核开?驱动E序开?嵌入式开发打基础。如果你想介入到应用范围最q泛的应用Y件开发(包括?sh)子商务电(sh)子政务pȝQ的话,你可以选择J2EE?NETQ甚至LAMPl合。每个领域要求的背景知识不一栗做应用软g需要对数据库等很熟(zhn)。MQ你需要根据自q特点来选择合适你的编E语a?
  1.3 要脚t实?快餐式的学习不可?
  先分享一个故事?
  有一个小朋友Q他很喜Ƣ研I生物学Q很想知道那些蝴蝶如何从蛹壳里出来,变成蝴蝶便会飞。?有一ơ,他走到草原上面看见一个蛹Q便取了回家Q然后看着Q过了几天以后,q个蛹出了一条裂痕,看见里面的蝴蝶开始挣扎,x破蛹壳飞出来。?q个q程达数时之久Q蝴蝶在蛚w面很辛苦地拼命挣扎,怎么也没法子走出来。这个小孩看着看着不忍心,想不如让我帮帮它吧Q便随手拿v剪刀在蛹上剪开Q蝴蝶破蛹而出。?但蝴蝶出来以后,因ؓ膀不够力,变得很臃肿,飞不h?
  q个故事l我们的启示是:Ʋ速则不达?
  躁是现代h最普遍的心态,能怪谁Q也许是贫穷落后了这么多q的~故Q就像当q的大跃q一P都想大步跨入׃MC会。现在的软g公司、客戗政府、学校、培训机构等{到处I漫着躁之气。就拿笔者比较熟(zhn)的深圳IT培训行业来说吧,居然有的打广告宣U?参加培训Q?00%׃"Q居然报名的学生不少Q简直是藐视天下E序员。社会环境如是,我们不能改变Q只能改变自?闹市中的安宁QI珍c许多初学者C++/JAVA没开始学Q立马用VC/JBuilder,会用VC/JBuilder开发一个Hello  WorldE序Q就忙不q的向世界宣告,"我会软g开发了"Q简历上也大a不惭地写?_NVC/JAVA"。结果到软g公司面试时要么被三两下打发走了,要么被驳的体无完肤,无地自容。到处碰壁之后才知道捧v《C++~程思想》《JAVA~程思想》仔l钻研,早知如此何必当初呀?
  "你现在讲I简单方便,你以后的路就长了"Q好象也是佛(jng)l中的劝戒?
  1.4 多实?快实?
  彭端淑的《ؓ学一首示子侄》中有穷和尚与富和尚的故事?
  从前Q四川边境有两个和尚Q一个IP一个有钱。一天,I和对富和说Q?我打去南v朝圣Q你看怎么P"富和说Q?q里dh几千里远Q你靠什么去呢?"I和说Q?我只要一个水钵,一个饭就够了?富和ؓ隑֜_"几年前我打买条船dP可至今没LQ你q是别去吧!"  一q以后,富和还在ؓU赁船只{wQ穷和尚却已l从南v朝圣回来了?
  q个故事可解MؓQQ何事情,一旦考虑好了Q就要马上上路,不要{到准备周全之后Q再d事情。假如事情准备考虑周全了再上\的话Q别人恐怕捷_M。Y件开发是一门工E学U,注重的就是实践,"君子动口不动?对Y件开发h员来讲根本就是错误的Q他们提?动手至上"Q但别害怕,他们大多温文雅Q没有暴力們֐Q虽然有时候蓬头垢面的一?比尔盖茨"栗有前辈高h认ؓQ学习编E的U诀是:~程、编E、再~程Q笔者深表赞同。不仅要多实践,而且要快实践。我们在看书的时候,不要{到你完全理解了才动手敲代码Q而是应该在看书的同时敲代码,E序q行的各U情况可以让你更快更牢固的掌握知识点?
  1.5 多参考程序代?
  E序代码是Y件开发最重要的成果之一Q其中渗透了E序员的思想与灵。许多h被《仙剑奇侠传》中凄美的爱情故事感?(zhn)剧的结局更有一U缺憄。ؓ什么要以?zhn)剧结?据说是因为写《仙剑奇侠传》的E序员失恋而安排了q样的结局Q他把自q感觉融入到游戏中Q却让众多的仙剑qh腕叹息?
  多多参考代码例子,对JAVA而言有参考文献[4.3],有APIcȝ源代?JDK安装目录下的src.zip文g)Q也可以研究一些开源的软g或框架?
  1.6 加强英文阅读能力
  对学习编E来_不要求英?  但不能一点不?。最L像JAVA  API文档(参考文献[4.4])q些东西q是要能看懂?q猜带懵都可以;旁边再开启一?金山词霸"。看多了׃来熟l。在学JAVA的同时学习英文,一双雕多好。另外好多Y仉要到英文|站下蝲Q你要能够找到它们,q些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有Zq入理层,q而可以成为剥削程序员?周扒??
  1.7 万不得已才请教别?
  W者在ChinaITLab|校的在U辅导系l中解决学生问题时发玎ͼ大部分的问题学生E做思考就可以解决。请教别Z前,你应该先回答如下几个问题?
  你是否在google中搜索了问题的解军_法?
  你是否查看了JAVA  API文档Q?
  你是否查找过相关书籍Q?
  你是否写代码试q?
  如果回答都是"?的话Q而且q没有找到解军_法,再问别h不迟。要知道独立思考的能力对你很重要。要知道E序员的旉是很宝贵的?
  1.8 多读好书
  书中自有颜如玉。比?盖茨是一个饱ȝ书的人。虽然没有读完大学,但九(ji)岁的时候比?盖茨已l读完了所有的癄全书Q所以他_N天文、历双Ӏ地理等{各cdU,可以说比?盖茨不仅是当今世界上金钱的首富,而且也可以称得上是知识的巨富?
  W者在l学生上评时候经怼l他们推荐书c,到后来学生实在忍无可忍开始抱怨,"天呐Q这么多书到什么时候才能看完了"Q?学Y件开发,感觉上了D"。这时候,我的回答一般是Q?别着急,什么时候带你们ȝ看我的书房,到现在每月花在技术书c上的钱400元,q在软g开发h员之中还只能够算是中{的"Q学生当场晕倒。(注:q一部分学生是刚学Y件开发的Q?
  对于在JAVA开发领域的好书在笔者另外一文章中会专门点评。该文章可作为本文的姊妹?
  1.9 使用合适的工具
  工欲善其事必先利其器。Y件开发包含各U各LzdQ需求收集分析、徏立用例模型、徏立分析设计模型、编E实现、调试程序、自动化试、持l集成等{,没有工具帮忙可以说是寸步难行。工具可以提高开发效率,使Y件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤h的境界就很高了,无招胜有招,手中无剑心中有剑q样的境界几乎不可企及。在W者另外一文章中会专门阐q如何选择合适的工具Q该文章也可作ؓ本文的姊妹篇Q?
  2QY件开发学习\U?
  两千多年的儒家思想孔孟之道Q中庸的思想透入骨髓Q既不冒q也不保守ƈ非中怹道,而是扑֯学习软g开发的正确路线与规律?
  从Y件开发h员的生规划来讲Q我们可以大致分Z个阶D,软g工程师→软g设计师→架构设计师或目理师。不惛_元帅的士兵不是好士兵Q不惛_架构设计师或目理师的E序员也不是好的E序员。我们应该努力往上走。让我们先整理一下开发应用Y仉要学习的主要技术?
  AQ基理论知识Q如操作pȝ、编译原理、数据结构与法、计机原理{,它们q不重要。如不想成ؓ计算机科学家的话Q可以采?用到的时候再来学"的原则?
  BQ一门编E语aQ现在基本上都是面向对象的语aQJAVA/C++/C#{等。如果做WEB开发的话还要学习HTML/JavaScript{等?
  CQ一U方法学或者说思想Q现在基本都是面向对象思想QOOA/OOD/设计模式Q。由此而衍生的Zlg开发CBD/面向斚w~程AOP{等?
  DQ一U关pd数据库,ORACLE/SqlServer/DB2/MySQL{等
  EQ一U提高生产率的IDE集成开发环境JBuilder/Eclipse/VS.NET{?
  FQ一UUML建模工具Q用ROSE/VISIO/钢笔q行建模?
  GQ一UY件过E,RUP/XP/CMM{等Q通过软gq程来组lY件开发的众多zdQ开发流E专业化规范化。当然还有其他的一些Y件工E知识?
  HQ项目管理、体pȝ构、框架知识?
  正确的\U应该是QB→C→E→F→G→H?
  q需要补充几点:
  1Q.对于A与C要补充的是,我们应该在实践中逐步领?zhn)~程理论与编E思想。新技术虽然不断涌玎ͼ更新速度令hD燎ؕN看花Q但万变不离其宗Q编E理Z~程思想的变化却很慢。掌握了~程理论与编E思想你就会有拨云见日之感。面向对象的思想在目前来讲是相当关键的,是强势技术之一Q在上面需要多投入旉Q给你的回报也会让你惊喜?
  2Q.对于数据库来说是独立学习的,q个时机q你来军_吧?
  3Q.~程语言作ؓ学习软g开发的ȝQ而其余的作ؓ辅线?
  4Q.软g工程师着重于B、C、E、?DQY件设计师着重于B、C、E、?D、FQ架构设计师着重于C、F、H?
  3Q如何学习JAVA?
  3.1  JAVA学习路线
  3.1.1  基础语法及JAVA原理
  基础语法和JAVA原理是地基,地基不牢靠,犹如沙地上徏摩天大厦Q是相当危险的。学习JAVA也是如此Q必要有扎实的基础Q你才能在J2EE、J2ME领域游刃有余。参加SCJPQSUN公司认证的JAVAE序员)考试不失Z个好Ҏ(gu)Q原因之一是ؓ了对得v你交?200大洋考试费,你会更努力学习,原因之二是SCJP考试能够让你把基打得很牢靠,它要求你跟JDK一L(zhn)JAVA基础知识Q但是你千万不要认ؓ考过了SCJP有多了不vQ就能够获得软g公司的青睐,p够获取高薪,q样的想法也是很危险的。获?真正"的SCJP只能证明你的基础q过得去Q但d际开发还有很长的一D\要走?
  3.1.2  OO思想的领(zhn)?
  掌握了基语法和JAVAE序q行原理后,我们可以用JAVA语言实现面向对象的思想了。面向对象,是一U方法学;是独立于语言之外的编E思想;是CBDZlg开发的基础;属于强势技术之一。当以后因工作需要{到别的面向对象语a的时候,你会感到特别的熟(zhn)亲切,学v来像喝凉水这么简单?
  使用面向对象的思想q行开发的基本q程是:
  ●调查收集需求?
  ●徏立用例模型?
  ●从用例模型中识别分析类及类与类之间的静态动态关p,从而徏立分析模型?
  ●细化分析模型到设计模型?
  ●用具体的技术去实现?
  ●测试、部|Ӏȝ?
  3.1.3  基本API的学?
  q行软g开发的时候,q不是什么功能都需要我们去实现Q也是l典名言所说的"不需要重新发明轮?。我们可以利用现成的cR组件、框架来搭徏我们的应用,如SUN公司~写好了众多cdC些底层功能,以及我们下蝲q来的JAR文g中包含的c?我们可以调用cM的方法来完成某些功能或承它。那么这些类中究竟提供了哪些Ҏ(gu)l我们用?Ҏ(gu)的参C数及cd是?cȝ构造器需不需要参敎ͼM可能SUN公司的工E师打国际长途甚至飘z过h告诉你他~写的类该如何用吧。他们只能提供文档给我们查看QJAVA  DOC文档Q参考文?.4Q就是这L文档Q它可以说是E序员与E序员交的文档?
  基本API指的是实C一些底层功能的c,通用性较强的APIQ如字符串处?输入输出{等。我们又把它成ؓcd。熟(zhn)API的方法一是多查JAVA  DOC文档Q参考文?.4Q,二是使用JBuilder/Eclipse{IDE的代码提C功能?
  3.1.4  特定API的学?
  JAVA介入的领域很q泛Q不同的领域有不同的APIQ没有h熟?zhn)所有的APIQ对一般h而言只是熟?zhn)工作中要用到的API。如果你做界面开发,那么你需要学习Swing/AWT/SWT{APIQ如果你q行|络游戏开发,你需要深入了解网lAPI/多媒体API/2D3D{;如果你做WEB开发,需要熟(zhn)Servlet{API啦。MQ需要根据工作的需要或你的兴趣发展方向去选择学习特定的API?
  3.1.5  开发工L用法
  在学习基语法与基本的面向对象概念Ӟ从锻Da熟练E度的角度考虑Q我们推荐用的工具是Editplus/JCreator+JDK,q时候不要急于上手JBuilder/Eclipse{集成开发环境,以免q于xIDE的强大功能而分散对JAVA技术本w的注意力。过了这一阶段你就可以开始熟(zhn)IDE了?
  E序员日常工作包括很多活动,~辑、编译及构徏、调试、单元测试、版本控制、维持模型与代码同步、文档的更新{等Q几乎每一Ҏ(gu)动都有专门的工具Q如果独立用这些工L话,你将会很痛苦Q你需要在堆满工具的Q务栏上不断的切换Q效率很低下Q也很容易出错。在JBuilder、Eclipse{IDE中已l自动集成编辑器、编译器、调试器、单元测试工具JUnit、自动构建工具ANT、版本控制工具CVS、DOC文档生成与更新等{,甚至可以把UML建模工具也集成进去,又提供了丰富的向导帮助生成框架代码,让我们的开发变得更L。应该说IDE发展的趋势就是集成Y件开发中要用到的几乎所有工兗?
  从开发效率的角度考虑Q用IDE是必l之路,也是从一个学生到一个职业程序员转变的里E碑?
  JAVA开发用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans{几U;而Eclipse、JBuilder占有的市Z额是最大的。JBuilder在近几年来一直是JAVA集成开发环境中的霸主,它是由备受程序员敬的Borland公司开发,在硝烟I漫的JAVA  IDE大战?以其快速的版本更新击|IBM的Visual  Age  for  JAVA{而成׃番伟业。IBM在Visual  Age  for  JAVA上已l无利可图之下,q脆之贡献l开源社区,成ؓEclipse的前w,真所?x花明又一?。ʎ火重生的Eclipse以其开攑ּ的插件扩展机制、免费开源获得广大程序员Q包括几乎所有的骨灰U程序员Q的青睐Q极具发展潜力?
  3.1.6  学习软g工程
  对小型项目而言Q你可能认ؓ软g工程没太大的必要。随着目的复杂性越来越高,软g工程的必要性才会体现出来。参?软g开发学习\U?节?
  3.2学习要点
  立的学习\U之后,我们q需要ȝ一下JAVA的学习要点,q些要点在前文多多少提到过Q只是笔者觉得这些地方特别要注意才对它们q行汇总,不要嫌我婆婆妈妈啊?
  3.2.1勤查API文档
  当程序员~写好某些类Q觉得很有成感,x它A献给各位苦难的同行。这时候你要?javadoc"工具Q包含在JDK中)生成标准的JAVA  DOC文档,供同行用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工P几乎人手一份,除了菜鸟之外。J2SE  DOC文档官方下蝲地址Q?a >http://java.sun.com/j2se/1.5.0/download.jspQ你可以到google搜烦CHM版本下蝲。也可以在线查看Q?a >http://java.sun.com/j2se/1.5.0/docs/api/index.html?
  对待DOC文档要像毛主席语录,早上起床念一遍,吃饭睡觉前念一遍?
  当需要某功能的时候,你应该先查相应的DOC文档看看有没有现成的实现Q有的话׃必劳费心了直接用就可以了,找不到的时候才考虑自己实现。用步骤一般如下:
  ●找特定的包Q包一般根据功能组l?
  ●找需要用类Q类命名规范的话我们q的名字可猜出一二?
  ●选择构造器Q大多数使用cȝ方式是创建对象?
  ●选择你需要的Ҏ(gu)?
  3.2.2  查书/google->写代码测?>查看源代?>h别h
  当我们遇到问题的时候该如何解决Q?
  q时候不要急着问别人,太简单的问题Q没l过思考的问题Q别Z因此而瞧不v你。可以先找找书,到google中搜一下看看,l大部分问题基本p决了。而像"某些c?Ҏ(gu)如何使用的问?QDOC文档是{案。对某些知识Ҏ(gu)疑惑是,写代码测试一下,会给你留下深ȝ印象。而有的问题,你可能需要直接看API的源代码验证你的x。万不得已才去请教别人?
  3.2.3学习开源Y件的设计思想
  JAVA领域有许多源代码开攄工具、组件、框ӞJUnit、ANT、Tomcat、Struts、Spring、Jive论坛、PetStore宠物店等{多如牛毛。这些可是前辈给我们留下的瑰宝呀。入宝山而空手归Q你心甘吗?对这些工兗框架进行分析,领会其中的设计思想Q有朝一日说不定你也能写一个XXX框架什么的Q风光一把。分析开源Y件其实是你提高技术、提高实战能力的便捷Ҏ(gu)?
  3.2.4  规范的重要?
  没有规矩Q不成方圆。这里的规范有两层含义。第一层含义是技术规范,多到http://www.jcp.org下蝲JSRXXX规范Q多读规范,q是最权威准确最新的教材。第二层含义是编E规范,如果你用了大量的独特算法,富有个性的变量及方法的命名方式Q同Ӟ没给E序作注释,以显CZ的编E功底是多么的深厚。这L代码别h看v来像天书Q要理解谈何Ҏ(gu)Q更不用说维护了Q必然会被无情地扫入垃圾堆。JAVA~码规范到此查看或下?a >http://java.sun.com/docs/codeconv/Q中文的也有Q啊Q还要问我在哪,请参?.2.2节?
  3.2.5  不局限于JAVA
  很不q,很幸q,要学习的东西q有很多。不q的是因学的东西太多且多变,没时间陪老婆家h或女朋友Q导致n心疲惫,严重者甚臛_致抑郁症。幸q的是别抢你饭碗l非易事Q他们或她们需要付出很多才能达成心ѝ?
  JAVA不要孤立地去学习Q需要综合学习数据结构、OOP、Y件工E、UML、网l编E、数据库技术等知识Q用横向U向的比较联想的方式d习会更有效。如学习JAVA集合的时候找数据l构的书看看Q学JDBC的时候复习数据库技术;采取的依然是"需要的时候再?的原则?
  4Q结束语
  需要强调的是,学习软g开发确实有一定的隑ֺQ也很辛苦,需要付出很多努力,但千万不要半途而废。本文如果能对一直徘徊在JAVA殿之外的朋友有所帮助的话Q笔者也ƣ慰了。哈哈,怎么听v来老气横秋呀Q没办法Q在?sh)脑的长期辐之下,都快变成老头了。最后奉劝各位程序员其是MME序员,完成工作后赶快远ȝ(sh)脑,据《胡播ؕ报》报道,?sh)脑辐射会在白皙的皮肤上面点~一些小黑点Q看h鲜艳无比…?
  5.参考文?
  5.1《JAVA夜未眠?
  5.2  http://www.chinaitlab.com/www/news/article_show.asp?id=33934
  5.3  http://javaalmanac.com/egs/
  5.4  http://java.sun.com/j2se/1.5.0/docs/api/index.html

amigojava 2006-08-18 16:42 发表评论
]]>
面向对象软g开发的敏捷q程Q四Q??/title><link>http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64391.html</link><dc:creator>amigojava</dc:creator><author>amigojava</author><pubDate>Fri, 18 Aug 2006 08:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64391.html</guid><wfw:comment>http://www.aygfsteel.com/amigokxz/comments/64391.html</wfw:comment><comments>http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/amigokxz/comments/commentRss/64391.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/amigokxz/services/trackbacks/64391.html</trackback:ping><description><![CDATA[     摘要: l箋? rental cM函数 getCharge() 的语? switch (getMovie().getPriceCode()) Q它提示我们应该计? charge 的职责交l? movie cL完成。这是租借天C为参Cl? movie cȝ相关函数q行计算。我们在 ...  <a href='http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64391.html'>阅读全文</a><img src ="http://www.aygfsteel.com/amigokxz/aggbug/64391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/amigokxz/" target="_blank">amigojava</a> 2006-08-18 16:40 <a href="http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向对象软g开发的敏捷q程Q三Q?/title><link>http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64388.html</link><dc:creator>amigojava</dc:creator><author>amigojava</author><pubDate>Fri, 18 Aug 2006 08:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64388.html</guid><wfw:comment>http://www.aygfsteel.com/amigokxz/comments/64388.html</wfw:comment><comments>http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/amigokxz/comments/commentRss/64388.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/amigokxz/services/trackbacks/64388.html</trackback:ping><description><![CDATA[ <img src="file:///c:/3.jpg" /> <br /><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">~写?/span><span lang="EN-US">4</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个测试用例全部通过了,但是如果惛_q代器中每一个元素的计算l果q行验证现有的函数就无法完成要求了?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面q用重构中的抽取函数分解</span><span lang="EN-US">Customer</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cM长的方?/span><span lang="EN-US">statement(),</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q个函数完成的功能有些无所不包了。既计算各个U借的费用和常客积点,又要计算客户需要交U的费用dQ最后还要输出报表的表头和表。另外,现有的快速设计对变化的应对不I客户的电(sh)影分cd能会出现变化Q如果去掉儿童片加上U片、故事片怎么办,客户的收费规则发生变化了怎么办。根据前面所_他的味道不是一般的臭?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W一步:抽取函数</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们先把</span><span lang="EN-US">statement</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">计算各个U借的费用的职责分d一个单独的函数中?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">private double amountFor(Rental rental){</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>double thisAmount=0.0;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>switch (rental.getMovie().getPriceCode()) {</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>case Movie.REGULAR:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>thisAmount+=2;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>if(rental.getDayRented()>2)</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 4">                            </span>thisAmount+=(rental.getDayRented()-2)*1.5;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>break;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>case Movie.CHILDRENS:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>thisAmount+=1.5;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>if(rental.getDayRented()>3)</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 4">                            </span>thisAmount+=(rental.getDayRented()-3)*1.5;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>break;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>case Movie.NEW_RELEASE:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>thisAmount+=(rental.getDayRented())*3;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 3">                     </span>break;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span>return thisAmount;</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2">              </span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">       </span>}</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把原来的计算各个U借费用的部分注释hQ把</span><span lang="EN-US">private double thisAmount=0.0; </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一句改?/span><span lang="EN-US">double thisAmount=amountFor(each);</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再次q行试用例Q和W一ơ的l果Ҏ(gu)<br /><img src="file:///c:/4.jpg" /><br /></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们通过人工比对输出l果Q输出结果相同。我们稍后会通过试用例由套件自动比寏V?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果q一步我们的试</span><span lang="EN-US"><font face="Times New Roman">fail</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">掉了Q由于我们只C很小的一步,因此我们可以L的退回去。记住,我们始终保持试</span><span lang="EN-US"><font face="Times New Roman">-</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">〉编码(重构Q?/span><span lang="EN-US"><font face="Times New Roman">-</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">〉测试的步骤Q小步快走的E_节奏?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">试全部通过后,我们可以果断的删除刚才留?/span><span lang="EN-US"><font face="Times New Roman">statement</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数中我们注释过的时代码?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分析我们刚刚抽取出来?/span><span lang="EN-US"><font face="Times New Roman">amountFor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数Q它只用了</span><span lang="EN-US"><font face="Times New Roman">rental</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cM的成员变量,攑֜</span><span lang="EN-US"><font face="Times New Roman">Customer</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cMq不合适,因此我们l箋重构Q把</span><span lang="EN-US"><font face="Times New Roman">amountfor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数Ud?/span><span lang="EN-US"><font face="Times New Roman">Rental</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cM?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q里我们使用了集成开发环境中的功能:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><img src="c:\5.jpg" /><br /></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q里我们看到</span><span lang="EN-US"><font face="Times New Roman">eclipse</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自动侦测出目标的cMؓ</span><span lang="EN-US"><font face="Times New Roman">rental</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q我们把新的函数改名?/span><span lang="EN-US"><font face="Times New Roman">getcharge</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">QƈN在原类型中创徏委托Q可以点击预览按钮察看重构结果,最后的l果如下Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">Rental </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cMQ?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">double getCharge(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>double thisAmount=0.0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>switch (getMovie().getPriceCode()) {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>case Movie.REGULAR:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>thisAmount+=2;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>if(getDayRented()>2)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>thisAmount+=(getDayRented()-2)*1.5;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>case Movie.CHILDRENS:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>thisAmount+=1.5;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>if(getDayRented()>3)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>thisAmount+=(getDayRented()-3)*1.5;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>case Movie.NEW_RELEASE:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>thisAmount+=(getDayRented())*3;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return thisAmount;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2"><font face="Times New Roman">              </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以看到?/span><span lang="EN-US"><font face="Times New Roman">amountfor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数更加化?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">Customer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cMQ?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">private double amountFor(Rental rental){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return rental.getCharge();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保留了一?/span><span lang="EN-US"><font face="Times New Roman">rental</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">CZ的委托调用?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再次q行试用例Q通过?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们l箋前进Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们回到</span><span lang="EN-US"><font face="Times New Roman">Customer</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cMQ察?/span><span lang="EN-US"><font face="Times New Roman">Statement</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数中的</span><span lang="EN-US"><font face="Times New Roman">thisAmount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量Q我们发C的结果ƈ没有发生变化Q我们可以通过重构把这个无用的临时变量除去。直接把</span><span lang="EN-US"><font face="Times New Roman">thisamount=amountFor(each);</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的语句右侧考到</span><span lang="EN-US"><font face="Times New Roman">totalAmount+=thisAmount;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句右侧Q编译器会提C?/span><span lang="EN-US"><font face="Times New Roman">thisamount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量q未使用Q直接双?/span><span lang="EN-US"><font face="Times New Roman">quick fix </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除去q个变量。再ơ运行测试用例,通过?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下一步我们把计算常客U点的职责也?/span><span lang="EN-US"><font face="Times New Roman">statement</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数中分d来:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们d函数</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">private int getFrequentCount(Rental rental){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 2"><font face="Times New Roman">              </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>if (rental.getMovie().getPriceCode()==Movie.NEW_RELEASE&&rental.getDayRented()>1)</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>return 2;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>else return 1;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再把计算常客U点的部分改写如下:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>frequentCount+=getFrequentCount(each);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">试后我们发现常客积点的计算和类</span><span lang="EN-US"><font face="Times New Roman">Rental</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关pL密切Q我们再ơ移?/span><span lang="EN-US"><font face="Times New Roman">getFrequentCount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang="EN-US"><font face="Times New Roman">rental</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cM。测试通过后,计算常客U点的部分改写如下:</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>frequentCount+= each.getFrequentCount();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接下来,我们?/span><span lang="EN-US"><font face="Times New Roman">statement</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后的两个临时变量</span><span lang="EN-US"><font face="Times New Roman">frequentCount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang="EN-US"><font face="Times New Roman">totalAmount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也通过替换为函数查询消除掉?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">d函数</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">private double getTotalCharge(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>double result=0.0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>Enumeration rental=rentals.elements();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>while (rental.hasMoreElements()) {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>Rental rent = (Rental) rental.nextElement();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>result+=rent.getCharge();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return result;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把时变?/span><span lang="EN-US"><font face="Times New Roman">totalAmount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换?/span><span lang="EN-US"><font face="Times New Roman">getTotalCharge()</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">d函数</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">private int getTotalFrequentCount(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>int result=0;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>Enumeration rental=rentals.elements();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>while (rental.hasMoreElements()) {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>Rental each = (Rental) rental.nextElement();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>result+=each.getFrequentCount();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>return result;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把时变?/span><span lang="EN-US"><font face="Times New Roman">frequentCount</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换?/span><span lang="EN-US"><font face="Times New Roman">getTotalFrequentCount</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相应的,我们在测试中d以下四条试用例Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">public void testGetCharge(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>Enumeration rentals=tom.getRentals().elements();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>while (rentals.hasMoreElements()) {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>Rental each = (Rental) rentals.nextElement();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>switch(each.getMovie().getPriceCode()){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>case Movie.CHILDRENS:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>assertEquals(1.5,each.getCharge(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 4"><font face="Times New Roman">                            </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>case Movie.NEW_RELEASE:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>assertEquals(15,each.getCharge(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>case Movie.REGULAR:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>assertEquals(6.5,each.getCharge(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>public void testgetFrequentCount(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>Enumeration rentals=tom.getRentals().elements();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>while (rentals.hasMoreElements()) {</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>Rental each = (Rental) rentals.nextElement();</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>switch(each.getMovie().getPriceCode()){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>case Movie.CHILDRENS:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>assertEquals(1,each.getFrequentCount(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 5"><font face="Times New Roman">                                   </font></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>case Movie.NEW_RELEASE:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>assertEquals(2,each.getFrequentCount(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>case Movie.REGULAR:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>assertEquals(1,each.getFrequentCount(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 5">                                   </span>break;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 4">                            </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">       </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>public void testGetTotalCharge(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>assertEquals(23,tom.getTotalCharge(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>public void testGetTotalFrequentCount(){</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 3">                     </span>assertEquals(4,tom.getTotalFrequentCount(),.1);</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 2">              </span>}</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">现在我们可以对q代器中的每个元素的l果q行验证了?/span></p><img src ="http://www.aygfsteel.com/amigokxz/aggbug/64388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/amigokxz/" target="_blank">amigojava</a> 2006-08-18 16:33 <a href="http://www.aygfsteel.com/amigokxz/archive/2006/08/18/64388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面向对象软g开发的敏捷q程(二)http://www.aygfsteel.com/amigokxz/archive/2006/08/15/63726.htmlamigojavaamigojavaTue, 15 Aug 2006 09:09:00 GMThttp://www.aygfsteel.com/amigokxz/archive/2006/08/15/63726.htmlhttp://www.aygfsteel.com/amigokxz/comments/63726.htmlhttp://www.aygfsteel.com/amigokxz/archive/2006/08/15/63726.html#Feedback0http://www.aygfsteel.com/amigokxz/comments/commentRss/63726.htmlhttp://www.aygfsteel.com/amigokxz/services/trackbacks/63726.html 试驱动CZQ应用重构优化设?/span>

下面通过一个简单的试驱动CZQƈl过重构完成设计的更攏V详l的例子见重构?/span>

q出租店的E序Q计每一位顾客的消费金额q打印报表。操作者告诉程序:֮U用了哪些媄片,U期多长Q程序根据租赁时间和qcdQ普通片Q儿童片和新片)。除了计费用,q要为常客计点敎ͼҎ(gu)的计会׃U片U类是否为新片而有所不同?/span>

Ҏ(gu)上述描述Q我们画出简单的cd

其中q和租借都是简单的U数据类?br />

package chapter01;

public class Movie {

       public static final int CHILDRENS=2;// qcd

       public static final int REGULAR=1;

       public static final int NEW_RELEASE=0;

      

       private String title;// 名称

       private int priceCode;// h代码

       public Movie(String title, int priceCode) {

              this.title = title;

              this.priceCode = priceCode;

       }

       public int getPriceCode() {

              return priceCode;

       }

       public void setPriceCode(int priceCode) {

              this.priceCode = priceCode;

       }

       public String getTitle() {

              return title;

       }

      

       }

 

public class Rental {

       private Movie movie;

       private int dayRented;

       public Rental(Movie movie, int dayRented) {

             

              this.movie = movie;

              this.dayRented = dayRented;

       }

       public int getDayRented() {

              return dayRented;

       }

       public Movie getMovie() {

              return movie;

       }

      

}

 

public class Customer {

       private String name;

       private Vector rentals=new Vector();

       public Customer(String name) {

             

              this.name = name;

       }

       public String getName() {

              return name;

       }

       public Vector getRentals() {

              return rentals;

       }

       @SuppressWarnings("unchecked")

       public void addRental(Rental rental){

              rentals.add(rental);

       }

       public String statement(){// 计算费用

              double totalAmount=0;// d

              int frequentCount=0;// 常客U点

              Enumeration rental=rentals.elements();

              String result="rental record for "+getName()+"\n";

              while (rental.hasMoreElements()) {

                     Rental each = (Rental) rental.nextElement();// 取得一批租借记?/span>

                     double thisAmount=0;

                     // Ҏ(gu)cdQ计h(hun)?/span>

                     switch (each.getMovie().getPriceCode()) {

                     case Movie.REGULAR:

                            thisAmount+=2;

                            if(each.getDayRented()>2)

                                   thisAmount+=(each.getDayRented()-2)*1.5;

                            break;

                     case Movie.CHILDRENS:

                            thisAmount+=1.5;

                            if(each.getDayRented()>3)

                                   thisAmount+=(each.getDayRented()-3)*1.5;

                            break;

                     case Movie.NEW_RELEASE:

                            thisAmount+=(each.getDayRented())*3;

                            break;

                     }

                     // d常客U点

                     frequentCount++;

                     if (each.getMovie().getPriceCode()==Movie.NEW_RELEASE&&each.getDayRented()>1)

                            frequentCount++;

                     // 昄此笔数据

                     result+=

                            "\t"+each.getMovie().getTitle()+

                            "\t"+String.valueOf(frequentCount)+"\n";

                    

                     totalAmount+=thisAmount;

              }

              // 打印l尾

              result+="amount owned "+String.valueOf(totalAmount)+"\n";

              result+="you earned "+String.valueOf(frequentCount)+"frequentCount\n";

             

              return result;

       }

}

下面是对应的试用例

public class testCustomerStatement extends TestCase {

       Movie childrenMovie=new Movie("HARRY POTTY",Movie.CHILDRENS);

       Movie regularMovie=new Movie("Titanic",Movie.REGULAR);

       Movie newMovie=new Movie("Ice Age 2",Movie.NEW_RELEASE);

      

       Rental childRental=new Rental(childrenMovie,3);

       Rental newRental=new Rental(newMovie,5);

       Rental regRental=new Rental(regularMovie,5);

      

       Customer tom=new Customer("Tom");

      

       protected void setUp() throws Exception {

              super.setUp();

              tom.addRental(childRental);

              tom.addRental(newRental);

              tom.addRental(regRental);

       }

      

       public void testCaustomerName(){

       assertEquals("Tom",tom.getName());

      

      

       }

       public void testIteratorSize(){

             

       assertEquals(3,tom.getRentals().size());      

       }

       public void testIteratorName(){

              Enumeration rentals=tom.getRentals().elements();

              while (rentals.hasMoreElements()) {

                     Rental each = (Rental) rentals.nextElement();

                     switch(each.getMovie().getPriceCode()){

                     case Movie.CHILDRENS:

                            System.out.println("childrens");

                            assertEquals("HARRY POTTY",each.getMovie().getTitle());

                            assertEquals(3,each.getDayRented());

                           

                            break;

                     case Movie.NEW_RELEASE:

                            System.out.println("new");

                            assertEquals("Ice Age 2",each.getMovie().getTitle());

                            assertEquals(5,each.getDayRented());

                            break;

                     case Movie.REGULAR:

                            System.out.println("regular");

                            assertEquals("Titanic",each.getMovie().getTitle());

                            assertEquals(5,each.getDayRented());

                            break;

                     }

                           

              }

       }

       public void testOutput(){

              System.out.println(tom.statement());

       }

}



amigojava 2006-08-15 17:09 发表评论
]]>
面向对象软g开发的敏捷q程(一)http://www.aygfsteel.com/amigokxz/archive/2006/08/15/63723.htmlamigojavaamigojavaTue, 15 Aug 2006 08:54:00 GMThttp://www.aygfsteel.com/amigokxz/archive/2006/08/15/63723.htmlhttp://www.aygfsteel.com/amigokxz/comments/63723.htmlhttp://www.aygfsteel.com/amigokxz/archive/2006/08/15/63723.html#Feedback1http://www.aygfsteel.com/amigokxz/comments/commentRss/63723.htmlhttp://www.aygfsteel.com/amigokxz/services/trackbacks/63723.html 面向对象软g开发的敏捷q程

软g开发的复杂?/strong> Q?/span>

计算机硬件界的摩定律(每隔 18 个月计算机硬件的q算速度提高一倍,h下降一半)

适用于硬件的发展规律已经过三十q了。h们想当然的认机软g的发展速度和硬件的发展速度相当Q但是不q的是:每次重大的硬件升U之后,随着更大功能更丰富的软g的出玎ͼg的潜能再一ơ被无情的榨取殆。许多开发的软gpȝ不断的遭受进度g期,人员资金和时间等预算无休止的增加QY件质量的不断反复Q开发出来的pȝ对客L新需求响应缓慢,更改困难的噩梦?/span>

q样的现实是pY件的固有复杂性造成的,软g不同于硬件的生q程Q是׃h的智力劳动完成h的需求到机器E序的翻译{换过E。需求可能不清晰Q对需求可能出C人理解上的差异,选择实现Ҏ(gu)的差异,需求的不断变化Q具体实现语aq_的差异,软g生中采用的q程Q具体实Ch员的变动{等都会Ҏ(gu)l的产品产生影响。想象一下,如果一U变化的因素只有两种可能Q那么可以用简单的 0 Q?/span> 1 表示Q只?/span> 10 个变化因素的l合已l达C 2BB10=1024 U可能性,而实际开发中变化的因素轻易就过 10 个以上,每个变化的可能是q不止两个,因此软g的复杂性很快就会超Zh的理解程度。有一句经典的软g开发名aQ?b style="mso-bidi-font-weight: normal">世界上唯一不变的是变化本n。不断出现的变化Q会使初始的设计和最l的需求之间的距离来远?/span>

软g的臭呻I

软g开发,使用Q维护中出现了以下的“臭味”:

僵化性: rigidity 很难对系l进行改动,因ؓ每个改动都会q许多对系l其他部分的其他改动。即使是单的改动Q也会迫使导致右依赖关系的模块的q锁改动?/span>

脆弱性: fragility 对系l的改动会导致系l中和改动的地方在概念上无关的许多地方出现问题。出现新问题的地方和改动的地Ҏ(gu)有概念上的关联,难以排错Q排错的q程中又会引入更多的“臭虫”?/span>

牢固?/span> immobility 很难解开pȝ的纠l,使它成ؓ其他pȝ中重用的lg。系l中包含了对其他pȝ中有用的功能Q当其他人想复用q个功能到新的系l时Q剥d独立的组件的隑ֺq远大于重新实现的难度,在时间和q度的压力下Q大多数人只有选择拯涂鸦的方式来实现新系l的功能?/span>

_滞性: viscosity 做正的事情比错误的事情要困难。程序完成正常的功能L們֐于得C正确的结果?/span>

不必要的复杂性: needless complexity 设计中包含有不具有Q何直接好处的基础l构。ؓ了预防后期维护更攚w求的Ҏ(gu)码的修改Q在设计之初攄了那些处理潜在变化的代码来保持Y件的灉|性,q样的结果是软g中包含了很多复杂的结构,理解h更加困难?/span>

不必要的重复Q?/span> needless repetition 设计中包含有重复的结构,而该重复的结构可以用单一的抽象进行统一。对鼠标右键Q剪切,复制Q粘_的滥用,使得完成同一或类似的代码片断出现在系l各处。如果原始的代码D完成的功能需要变化,或者存在错误,排错和增加新的功能变得非常困难?/span>

晦ӆ性: opacity 很难阅读Q理解。没有很好的表现出意图?/span>

以上讨论了系l构架的臭味Q下面讨论微观层ơ上代码的臭呻I

代码的臭?/span>

重复代码Q重复的代码使得更改功能和排错更加困难。同L模块错误会在拯_脓(chung)的程序各处多ơ出现?/span>

q长的函敎ͼE序长难于理解,q已l是软g业开发的常识。越隄解的E序Q用维护的成本p大。如果一个函数的行数过一,很少有h能够在看C一늚时候还清楚的记得函数开头的变量定义Q理解和查错更加困难?/span>

q大c:在一个类中完成几乎所有需要的功能。十全能的人是不存在的QY件也一栗?/span>

q长的参数列Q如果一个函敎ͼҎ(gu)Q的调用参数q长Q用这个函数的调用q程也一定是困难的。想象一下,调用一个十个以上参数存储过E会有多么痛苦。这q只是开始,如果M个参数的定义Q名UͼcdQ发生轻微的变化Q函数的调用客户端会有多么大的改动?/span>

其他的臭呌有发散式变化Q散Ҏ(gu)修改Q依恋情l,数据泥团Q基本型别偏执,复杂?/span> switch 分支语句Q^行的l承体系Q冗赘类Q夸夸其谈的未来性,令hqh的暂时值域Q过度耦合的消息链Q中间{手hQ狎昵关p,异曲同工的类Q不完美的程序库c,U数据类Q数据哑元)Q子cM需要父cȝ某些Ҏ(gu),q多注释。详l的讨论可以参见《重构》的介绍?/span>

面向对象软g设计的原?/strong> Q?/span>

M原则 Q?/span>

1Q?span style="FONT: 7pt 'Times New Roman'">  针对于接口(抽象Q编E,而不要针对于实现Q具体)~程?/span>

举例来说Q操作系l是寚w辑计算机的抽象Q通过操作pȝ的抽象我们不需要考虑具体使用的硬仉|,可以在较高的层次上进行更高生产力的应用。再如:汇编语言Ҏ(gu)器的 0 Q?/span> 1 代码q行了抽象,大大加快了开发效率,后来使用的高U语a和第四代语言模型驱动抽象的别更高,生力也更高。再如: java ?/span> .net 实现于一个抽象的软g虚拟机,q一步开发出来的lg可以跨^台和操作pȝ。通过抽象出数据访问层Q持久化层)Q可以业务逻辑和具体的数据库访问代码分,更换数据库提供商对已有的lg没有影响。具体实现可以参?/span> hibernate 实现?/span> dao Q数据访问对象)模式?/span>

优势Q?/span> 1 Q降低程序各个部分之间的耦合性,使程序模块互换成为可能。调用的客户端无需知道具体使用的对象类型,只要对象有客户希望的接口可以用,对象具体是如何实现这些接口的Q客户ƈ不需要考虑?/span> 2 Q简化了E序各个部分的单元测试,需要测试的E序模块中通过重构提炼出抽象的接口Q然后编制和接口一致的 Mock c,试׃变得很容易。如果应用了试优先的方法,从简化客L调用的角度,q可以经q抽象改善Y件模块的设计?/span> 3 Q模块的部v升׃模块之间的耦合度降低变得更加容易?/span>

相关的设计模式有创徏型模式中的工厂模式,l构型模式中的代理模式和l合模式{?/span>

2Q?span style="FONT: 7pt 'Times New Roman'">  对象l合优于cȝѝ?/span>

面向对象Y件开发引入了三大工具Q承,多态和重蝲。承得程序员可以快速的通过扩展子类来增加功能,但是׃l承是在~译时确定的Q因此增加的功能较多Ӟl承不够灉|Q还有可能出现“子cȝ炸”的局面(Z完成新添功能Q不得不在承体pMd大量的之间只有细微差别的子类Q掌握用扩展都会变得非常困难)。而通过对象的组合,可以动态透明的添加功能。相兌计模式有装饰模式和代理模式等?/span>

 

3Q?span style="FONT: 7pt 'Times New Roman'">  分离变化。前面说q需求是在不断变化的Q不同的变化可能是仓库安全库存的计算Ҏ(gu)Q可能是报表和数据的展现形式Q通过把这些不同的变化识别q分d来不同的对象委托Q简化了客户端的调用和升U。相关的设计模式有命令模式,观察者模式,{略模式Q状态模式,模版Ҏ(gu)模式{?/span>

 

具体原则Q?/font>

1Q?span style="FONT: 7pt 'Times New Roman'">  单一职责原则 srp Q?/span> single responsibility principle Q:一个模块的功能应该可能的内聚。如果一个类发生了变化,引v变化的原因应该有且只有一个。每一个类承担的职责都是一个变化的轴线Q需求变化时Q会体现为类的职责的变化。如果一个类承担的职责过多,q于把q些职责耦合在了一P一个职责的变化会媄响这个类完成其他职责的能力,会出现前面所说的软g的臭味之一脆弱性。相关的设计模式?/span>

2Q?span style="FONT: 7pt 'Times New Roman'">  开攑ְ闭原?/span> ocp Q?/span> open closed principle Q:一个模块应该对功能的扩展开放,支持新的行ؓQ对自n的更改封闭。每ơ对模块的修攚w可能会引入新的错误和新的依赖。因此扩展新功能Ӟ已经~好的模块源码和二进制代码都是不应该修改的。相关的设计模式有适配器模式,桥接模式Q访问者模式等?/span>

3Q?span style="FONT: 7pt 'Times New Roman'">  Liskov 替换原则 lsp Q?/span> liskov subtitle principle Q子cd必须可以替换掉他的基cd。一个基cȝ多个子类型之间要完成动态的替换Q各个子cd必须都可以被他们的基cd替换Q这样他们之间动态替换后Q客L调用的代码就不需要冗赘的 switch cd判断代码。如?/span> 子类型无法替换基cdQ将会导致在zcd象作为基cd象进行传值时的错误。这样多态机制处于瘫痪状态了。相兌计模式ؓl合模式?/span>

4Q?span style="FONT: 7pt 'Times New Roman'">  依赖倒置原则 dip Q?/span> dependent inverse principle Q高层模块不应该依赖于底层模块,抽象不应该依赖于l节Q细节应该依赖于抽象。假定所有的具体c都是回变化的,因此如果一个客L依赖于(调用或声明)具体的类型,那么当这个具体的cd变化Ӟ依赖的客L业必d时进行修攏V这些具体的更改可能出现在用了某个特定的网l协议,Ҏ(gu)的系l?/span> api 调用Q特定的数据库储存过E等Q这些用法或多或都会客户端调用和具体cd成ؓ铁板一块,比较难于重用?/span> Java C֌中比较热门的 j2ee 轻量U容器框?/span> spring 很好的实现了本原则?/span>

5 Q接口隔d?/span> isp Q?/span> interface segregation principle Q不应该客户依赖于它们不使用的方法。因为每一个实现接口的对象必须实现所有接口中定义的方法。如果接口的_度比较?yu),实现接口的对象可以用一U即用即付的方式动态实现接口。每个接口的_度很小Q复用v来也非常Ҏ(gu)?/span>

q体C一个趋势:Z更好的实现重用,接口Q函敎ͼ模块和类{們֐于更Ҏ(gu)使用的“小”体U?/span>

敏捷软g开发的宣言和实践:

软g开发项目的p|使得Z开始思考Y件开发的q程Qh们希望通过引入严格的过E控制生Y件生命周期中各个阶段的文档和制品来保证Y件的质量。比较出名的业界实施Ҏ(gu)论有 cmmi Q能力成熟度模型Q和 rup Q瑞理统一q程Q,q些Ҏ(gu)论都是重型的。D例来_没有l过剪裁?/span> Rup 实现hQ至需要在全周期完成四十个以上的制品文档,文档的编写维护和源代码的同步{需要非常多的资源,十h以下的开发团队一般没有精力、时间、h员配|完成这些制品。失控的q程的膨胀qZL一U快速工作,相应变化的“敏L”方法。敏捷团队提倡通过团队成员之间充分有效的沟?/b>l一大家的目标,l伴的方式完成开发技术的团队内传承,使用?b style="mso-bidi-font-weight: normal">够用好”的轻量甚至免费的工L理过E。可以正常工作的代码摆在首要CQ只有必要的时候才生必要的文档。强调和客户面对?/b>C合作,U极?b style="mso-bidi-font-weight: normal">响应客户需求的变化而不是遵循机械的计划。?b style="mso-bidi-font-weight: normal">较短的P代周?/b>Q近早和持箋提交有h(hun)值的软gl客h验证q修正和用户需求的dE度。提倡可以持l的E_的开发节奏,长期?b style="mso-bidi-font-weight: normal">步快走”的方式代替H然的“百c_刺”。保持设计最?/b>Q?b style="mso-bidi-font-weight: normal">最?/b>的设计ƈ且持l改q,不断调整?/span>



amigojava 2006-08-15 16:54 发表评论
]]>
spring mvc step by step 阅读W记Q?Q?/title><link>http://www.aygfsteel.com/amigokxz/archive/2006/08/10/62734.html</link><dc:creator>amigojava</dc:creator><author>amigojava</author><pubDate>Thu, 10 Aug 2006 02:37:00 GMT</pubDate><guid>http://www.aygfsteel.com/amigokxz/archive/2006/08/10/62734.html</guid><wfw:comment>http://www.aygfsteel.com/amigokxz/comments/62734.html</wfw:comment><comments>http://www.aygfsteel.com/amigokxz/archive/2006/08/10/62734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/amigokxz/comments/commentRss/62734.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/amigokxz/services/trackbacks/62734.html</trackback:ping><description><![CDATA[   看spring framework 好长旉了,一直都是用简单的bean注入Q声明式事务Qdao集成hibernate的简单c/sE序Q一直没有完整的做过一个b/sE序。最q,狂啃了一阵jspQjstlQ终于有信心作b/sE序了?br />      废话说Q新Z个简单的webapp目录Q在WEB-INF目录中,~写web.xml文gQ由于一开始ƈ没有Mservlet?lt;web-app></web-app>一节空|。编写一个首|Ӟ攑ֈwebapp根目录。通过q行ant 脚本 部v到web容器中,输入 <a >http://127.0.0.1:8080/springapp/hello.htm</a>Q检基本的webapp配置?br /> <img src ="http://www.aygfsteel.com/amigokxz/aggbug/62734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/amigokxz/" target="_blank">amigojava</a> 2006-08-10 10:37 <a href="http://www.aygfsteel.com/amigokxz/archive/2006/08/10/62734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Eclipse中运行Ant中的junitd出错解决办法http://www.aygfsteel.com/amigokxz/archive/2006/08/10/62725.htmlamigojavaamigojavaThu, 10 Aug 2006 02:08:00 GMThttp://www.aygfsteel.com/amigokxz/archive/2006/08/10/62725.htmlhttp://www.aygfsteel.com/amigokxz/comments/62725.htmlhttp://www.aygfsteel.com/amigokxz/archive/2006/08/10/62725.html#Feedback0http://www.aygfsteel.com/amigokxz/comments/commentRss/62725.htmlhttp://www.aygfsteel.com/amigokxz/services/trackbacks/62725.html  但是使用ant之后Qbuild.xml~译试案例的时候出玎ͼ  
package   junit.framework   does   not   exist  
解决办法Q?br />Windows>>Preference>>Ant>>Runtime>>Classpath
d一个junit.jar ?[eclipse home]\plugins\org.junit_3.8.1可以扑ֈ?br />

独立在命令行使用antӞ出现

Ant could not find the task or a class this task relies upon.

This is common and has a number of causes; the usual 
solutions are to read the manual pages then download and
install needed JAR files, or fix the build file: 
 - You have misspelt 'junit'.
   Fix: check your spelling.
 - The task needs an external JAR file to execute
     and this is not found at the right place in the classpath.
   Fix: check the documentation for dependencies.
   Fix: declare the task.
 - The task is an Ant optional task and the JAR file and/or libraries
     implementing the functionality were not found at the time you
     yourself built your installation of Ant from the Ant sources.
   Fix: Look in the ANT_HOME/lib for the 'ant-' JAR corresponding to the
     task and make sure it contains more than merely a META-INF/MANIFEST.MF.
     If all it contains is the manifest, then rebuild Ant with the needed
     libraries present in ${ant.home}/lib/optional/ , or alternatively,
     download a pre-built release version from apache.org
 - The build file was written for a later version of Ant
   Fix: upgrade to at least the latest release version of Ant
 - The task is not an Ant core or optional task 
     and needs to be declared using <taskdef>.
 - You are attempting to use a task defined using 
    
<presetdef> or <macrodef> but have spelt wrong or not 
   defined it at the point of use

Remember that for JAR files to be visible to Ant tasks implemented
in ANT_HOME/lib, the files must be in the same directory or on the
classpath

Please neither file bug reports on this problem, nor email the
Ant mailing lists, until all of these causes have been explored,
as this is not an Ant bug.
解决办法Q?br />把junit.jar拯到ANT_HOME\lib目录下?br />


amigojava 2006-08-10 10:08 发表评论
]]>
վ֩ģ壺 ǧ| | | | | ̨| | | ˶| | ˮ| | ȷɽ| Ϣ| | ʩ| | | | ʹ| Ϫ| | | | | | | | | ҵ| | ƽ| ̨| | Դ| Ͷ| ƴ| ϼ| ֦| ƽ| »Ȱ|