JAVA网页设计诊断 Java 代码:计划轻松的代码保护
微软什么都提供了。你可以试想一下,如果你是新手,你是希望你点一下按钮程序就能运行那,还是想自己一点一点的组织结构,然后打包发部,调错再打包......计划本月,EricAllen注释了在使代码更容易于保护的同时,制止和把持在理由的变更怎样会是坚持代码强健性的关头。他会合会商了诸如函数款式代码编写之类的观点,和标志字段、办法和类的办法来处置并避免可变性。Eric还注释了本义务中单位测试和重构的脚色,并供应了帮忙完成重构的两个工具。在相干论坛中与作者和其他读者分享您对本文的意见。(您也能够单击本文顶部或底部的“会商”,会见该论坛。)无效调试源自优秀的编程。计划易于保护的程序是程序员面对的最坚苦应战之一,其部分缘故原由在于程序一般并非由那些编写代码的程序员保护的。为了无效保护如许的程序,新程序员必需可以疾速懂得程序的事情道理,假如程序员可以独自了解全部程序中各个小部分,那末就能够简单地懂得程序的事情道理。
经由过程会商可变性、可译码性、公有办法、终极办法、终极类、当地代码、单位测试和重构成绩,我们将简述编写程序的一些办法,以匡助使程序更容易了解和保护。
可变性和可译码性
起首会商可变性成绩。假如在一个程序的盘算时代,其每部分所处置的数据都没有被该程序的别的、远程部分变动,那末就很简单独自了解该程序的各个部分。
太多信息
比方,请思索一个利用容器类实例的程序,能够修正个中的成份链接。每次将容器从程序某一部分上的办法传送到该程序别的部分的办法,和每次挪用new表达式(个中容器被作为参数传送)时,容器便可能离开挪用办法的把持产生改动。
在我们起首了解挪用办法挪用的每一个办法怎样修正容器之前,我们不克不及真准确保我们了解了挪用办法,由此我们诊断毛病的才能也就更差。假如这些被挪用的每一个办法都顺次挪用别的修正办法,那末保护程序员为了了解单个办法必需浏览的代码总量会敏捷增添,多得没法把持。
因为这个缘故原由,对可变容器和不成变容器利用分歧类会十分有益。在不成变版本中,容器的字段能够标志成final。
乞助于函数款式
相对修正旧数据,为机关新数据而举行代码编写称为函数款式,由于程序的办法与数学函数类似,其举动是依据每一个输出所前往的输入来独自形貌的。
函数款式常常被疏忽的长处是相称简单独自了解程序的一般组件。假如办法所利用的数据决不会被其主体中实行的任何操纵改动,那末程序员要了解该办法必需做的就是了解那些操纵前往的了局。将之与后面的一个办法挪用几个别的办法的计划绝对照,谁人计划中的别的几个办法都修正这一办法所操纵的数据布局。
Java言语的一个相称好的特征是它同意我们利用final关头字(作为范例反省器的伪指令)来声明什么时候我们要使某个数据成为不成变。
利用final关头字来制止变更是“钉住”类的办法举动的一个好办法。每次修正字段时,都有大概改动援用该字段的办法的举动。别的,将字段标志为final让浏览程序的其他程序员当即晓得:不论全部程序有多年夜,决不要修正该字段。比方,请思索以下暗示不成变列表的类条理布局。
清单1.暗示不成变列表的类条理布局
abstractclassList{...}
classEmptyextendsList{...}
classConsextendsList{
privatefinalObjectfirst;
privatefinalListrest;
}
这些类中的一切字段都被标志成final。要确保这些类的实例不成变,如许做够了吗?不太够。固然,即便字段被标志成final,该字段自己的组件大概不是final,记着这一点很主要。当那些组件变动时,援用那些组件的程序的任何部分大概会被修正,而不论字段自己是不是改动。在下面的示例中,只管列表的构成元素不克不及被修正,可是我们必需反省那些元素自己没有包括大概被修正的非终极字段。
在这类情况中,只管列表大概包括可变元素,可是我们能够看到存储在给定列表中的元素序列因为以下缘故原由而不成变:Empty列表(即,长度为零的列表)的实例基本不包括任何元素;因而不克不及修正它们。Cons(非空列表)实例包括两个字段,都是final。第一个字段包括该列表的第一个元素,它不克不及被修正;第二个字段包括一个列表,个中包括一切残剩元素。假如这个列表的内容不成变,那末该包括列表也不成变。
可是包括在这第二个字段中的列表比包括列表的长度小一,以是假如我们晓得长度为n的一切列表都不成变,那末我们就晓得长度为n+1的列表也不成变。由于我们已晓得长度为零的列表不成变,以是我们也晓得长度为1、2、3等的列表一样不成变。
跟踪与此相似的数据布局毗连会很有趣,但当您能断定这类布局的全局特征(诸如不成变性)时,如许做是值得的。
把持变更
避免呈现不希冀的变更的最好战略就是尽量制止一切变更。只要当呈现必定要改动的缘故原由时(比方,当如许做年夜年夜简化了代码布局时),我们才应当利用它。当能够制止变更时,所发生的优点是伟大的(在较低的保护用度和加强的强健性方面)。
即便存在必定要改动数据的缘故原由,最好仍是想法把持那种变更,从而尽量限定大概发生的损坏。迭代器和流是数据布局的极佳示例,这些数据布局明白计划成经由过程同意我们以惯例的、界说优秀的情势使用一系列元素,而不是明白修正这些元素的某个句柄来把持变更。
公有办法
就好像将字段设置成final有助于限定对字段值发生内部影响一样,将它们设置成private有助于限定它们对程序别的部分发生的影响。假如字段是公有的,那末我们能够确信该程序的别的部分都不与它间接相干。假如我们撤除了该字段,并交换了该类数据的外部暗示,那末我们只需体贴修改该类外部的办法,以准确会见新数据。
在后面的示例中,请注重类Cons的字段是公有的。如许的话,我们就能够经由过程读办法(getter)及相似办法来把持怎样会见那些元素。假如我们列表的将来保护职员偶然想要修正列表的外部暗示(比方,能够论证在某些平台上,基于数组的列表也许更无效),那末程序员能够如许做,而不用修正或乃至检察那些列表的任何客户机。他只需重写getter就能够对新数据接纳得当的操纵。
终极办法、终极类和了解当地代码
与将字段标志成final构成对照的是,将办法标志成final一般被求全谴责为与OO计划方针纷歧致,由于如许克制承继多态性。可是在实验了解年夜型程序的举动时,如许有助于懂得甚么办法没有被重写。
如今优秀的OO计划触及利用大批承继,这切实其实是现实。现实上,承继是很多OO计划形式的中心。可是那其实不意味着我们应当同意我们编写的每一个办法都被重写。一般程序将隐式地依附某些没有被重写的关头办法。经由过程将如许的办法标志成final,我们将同意其他程序员更好地舆解挪用该办法的表达式举动。
别的,将类标志成final会极年夜进步可译码性。它会真正有助于开端懂得程序中哪些类决不会被子类化。现实上,我以为:只要不该被标志成final的类才是程序中真正被子类化的类,和那些成心从内部组件上被子类化的类(作为程序计划的固有部分)。
有人大概以为这个观点会束厄局促未来的代码保护职员,使他们不克不及扩大代码。我以为这一定不会限定他们。假如程序未来的保护职员必要扩大代码以包括之前不存在的子类,那末只需他们具有对源代码的会见权(假如他们无权会见,那末怎样成为该代码的“保护职员”呢?),删除响应类上的final关头字偏重新编译其实不太坚苦。
同时,谁人被增加的关头字充任关于该程序的主要稳定量的主动考证文档情势(“主动考证”是由于假如该文档被损坏,那末该程序乃至不会编译)。经由过程强迫开辟职员盲目选择什么时候要删除如许的稳定量,我们能够匡助削减毛病的引进。
单位测试和变更
单位测试老是可以有助于了解具有反作用的代码。假如一套单位测试充实证实了办法在程序中的感化,那末程序员只需经由过程浏览其单位测试就能够更敏捷了解每一个办法。固然,单位测试是不是真的涵盖了一切的感化是个年夜成绩。相似于Clover的无效局限剖析工具在这里能够供应某种水平的匡助。
可是,请注重单位测试自己要比编写严厉的函数办法复杂很多。要测试严厉的函数办法,触及的全体就是用各类具有代表性的输出挪用这些办法,并反省它们的输入(并确保它们在应当抛出非常时能抛出)。
在测试修正数据布局形态的办法时,我们必需起首实行如许的操纵,这些操纵是将输出数据放进该办法所希冀的形态中所必要的,然后在挪用该办法以后,反省是不是准确实行了客户机所希冀的数据的每次修正。
用重构工具封装
在编写新代码时这些技能很有效,可是当您必需保护几近不克不及译码的旧代码时,怎样办呢?重构、重构、仍是重构。
只管重构旧代码很费时,可是这些工夫是值得的,出格是一切撑持重构的工具如今也撑持Java代码了。如今已有很多主动重构Java代码的壮大工具,这些工具能够主动保留关头的稳定量。
重构Java代码的一个功效相称完全的工具是IDEA开辟情况。该情况对相称多的MartinFowler重构形式供应主动撑持。我找到的另外一个十分有效的工具是CodeGuide,它是一个来自德国的IDE。只管相对IDEA,其主动重构的列表很小,可是它显现了一个极为壮大的特征―一连编译。当您输出新代码时,CodeGuide剖析它并告诉您项目中是不是不完全(固然,这发生很短的提早,它避免对每次击键收回毛病旌旗灯号)。
只管一连编译对呼应发生负面影响,可是在某些高低文中十分值得如许的守候。比方,您能够在字段前输出final,会当即看到项目中是不是不完全。假如无,那末您晓得该字段在该程序的任何中央都没有被修正。一样,您能够在字段之前输出private,那末当即取得对该字段的一切内部会见的列表(以毛病的情势)。
CodeGuide的另外一个极佳特征是它用泛型范例对JSR-14实行扩大供应了无缝撑持(企图正式增加到Java1.5)。
只管为了可译码性而编写代码会消费十分多的工夫和精神,可是它会有助于进步代码的性命期和强健性,并且它能够明显进步面对保护代码义务的那些程序员的生存质量。最初,重构旧代码使之更容易保护很费时,但当您下次必需修改毛病时您就会晓得如许做是值得的
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 是一种使用者不需花费很多时间学习的语言 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 是一种将安全性(Security)列为第一优先考虑的语言 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 是一种使网页(Web Page)产生生动活泼画面的语言 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
页:
[1]