a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 246|回复: 2

[其他] JAVA技巧:如何高质量地编写Java代码

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
火速开发的理念已经风行了很长的时刻,在火速开发中的开发迭代阶段中,我们可以经由过程五个轨范,滥暌剐效的提高整个项目的代码质量。. v0 L- L* T6 F4 S* h
Java项目开发过程中,因为开发人员的经验、Java代码编写习惯,以及缺乏统一的尺度和打点流程,往往导致整个项目的代码质量较差,难于维 护,需要较年夜的测试投入和周期等问题。这些问题在一个项目组初建、需乞降设计均具有不完全可预期性和完整性的全新项目中将尤为凸起。
. A' W; m% Y6 ~  w4 q9 Y9 w# s$ Y  q如图1所示,火速开发过程履历需求调研,用例剖析和用例分化,进入开发迭代阶段。在每个迭代过程中,可以采用以下轨范来保证和提高整个项目的代 码质量:统一编码规范、代码样式;静态代码剖析(staticcodereview);单元测试;持续集成;代码评审和重构 (Review&Refactor)。下文将针对每个轨范和其所使用的工具、体例进行具体描述。. w0 R+ Z7 H  n
6 `( W/ W) F) @* k
图1.火速开发中的Java代码质量保证轨范 & F$ r9 B/ X, n6 r
轨范一:统一编码规范、代码样式
5 H  l0 `$ a- d3 H- u规范统一的编码会增添项目代码的可读性和可维护性,但现实情形往往是项目组内的Java代码开发人员的编码气概经常各不不异,这可能是因为分歧 的经验习惯或者缺乏编码规范方面的进修造成的。这样一来,其他项目成员或者维护人员在阅读项目代码时就需要破耗更多的时刻来理解代码作者的意图,所以拟定 并采纳统一的编码规范就显得很主要。编码规范首要应包含以下几个方面:4 o* A% L) C# k
◆一般轨则和名目规范。例如代码缩进、轨范块规范、每行最年夜代码长度等。
2 c2 k  l6 `& ^3 D( x/ T8 H" i◆命名轨则。例如包名、类名、变量、体例、接口、参数等命名规范1 b% c! a$ V" N3 ^. D
◆文档规范。例如类文件头声明、类注释、成员变量捉式注释等规范。
/ |( `% h5 G8 a' S: {" {◆编程规范。例如异常、并发、多线程等方面的措置体例。) h0 E$ |! e# R; [% h. W6 C  x# \: x, l
◆其他规范。例如日志名目、属性文件名目,返回值和动静名目。
- g+ m) C$ h! M项目的编码规范可以参考已有的一些Java编程规范书籍和其他相关资料并连系项目的自己来拟定,可供参考的书籍有《Java编程气概》(英文书 名为:TheElementsofJavaStyle)。编码规范要形成文档,而且要精练了然,并组织项目成员一路进修,确保所有成员正确理解所有条目。
: i- ?6 h/ {2 d) S3 \/ ^一旦编码规范确定,就可以操作Eclipse自身供给的功能来节制代码样式和名目。具体做法是,点击Eclipse的 Windows->Preference菜单项,在打开的Preferences对话框的左侧栏中找到Java节点下的子项CodeStyle(如图2),该项 和它的子项许可您对Java代码的样式进行节制。" l, T- ^6 D! R/ X$ T, w$ g5 o

0 n0 D/ B8 D7 p6 y( f& N) q图2.Eclipse代码样式设置窗口
/ g3 l4 [$ V5 P例如,为了使用自动名目化工具,可以在Eclipse供给的默认代码名目设置装备摆设的基本上成立自界说的名目。在Formatter面板中,点击 New,输入新的名字并选择一个默认的设置装备摆设作为初始化名目,如图3所示。+ ^& Y6 ]- Y, P. N/ \) p/ B
  @5 V  b" P8 m5 V2 ]
图3.建树新的代码名目设置装备摆设
0 H. o8 y* x8 @, s6 `% d& q单击OK后就可以在新打开的窗口中进行改削定制自己需要的名目。如图4所示。! o) q1 J9 s& |) t7 c' d4 X

3 L" U. \' @0 r6 d4 C4 ?- Y; V图4.建树新的代码名目设置装备摆设
# N( E1 D& }  v2 l' j% u# Y改削完成后点击Apply保留所作改削。同时可以点击Export将当前的名目界说导出成一个XML文件,这样项目组的其他成员就可以很便利通 过点击图3中的Import按钮来导入该XML文件来使用统一个代码名目界说。
2 ~; u4 s. Q! e  `% J+ I" H
8 o4 Z2 {( @& r$ Z7 B& m' G这样每次在提交接码到版本节制处事器前就可以经由过程Eclipse界面里的Source->Format菜单来对代码进行名目化,年夜而 使整个项目的代码具有不异的名目。同样可以经由过程对CodeStyle下的其他项目进行设置来辅佐对Java代码的样式进行节制。将所有这些样式文件导出成 XML文件后,同编码规范一路归档,供所有项目成员使用。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:如何高质量地编写Java代码

</p>轨范二:静态代码剖析1 P3 Y/ K6 J" s* u6 W$ l! G
在完成源代码的开发往后,下面要进行的工作就是审阅和测试代码。除了经由过程运行测试代码来搜检功能之外,还能操作一些静态剖析工具来快速、直接地 提高代码质量。静态代码剖析工具并不需要运行代码,可以直接对Java文件和Class文件进行剖析,经由过程一些搜检前提的设置,快速找到代码中的错误和潜 在缺陷。此刻的静态剖析工具良多,有FindBugs、PMD、IBMRationalTool,等等。在这里,选择FindBugs作为静态代码剖析工 具。FindBugs可以和日常开发工具Eclipse进行集成,在开发过程中,就可以便利的起头静态代码的搜检。经由过程搜检Class文件或者JAR文 件,将字节码和一组缺陷模式进行对比,来发现可能存在的代码问题。在Eclipse的开发情形中,用插件安装的体例安装了Findbugs后,在 Eclipse的配制揭捉项中就会多出来FindBugs的配制揭捉项。可以对自己的项目进行设置装备摆设,选择需要的Detector搜检代码。+ G  H" Y% a& S# n% ]9 @
7 s0 D2 W4 k" P
图5.FindBugs的配制揭捉项
$ l9 l6 Q4 x4 o设置好自己的轨则后,在需要搜检的代码文件夹上点击右键,就可以启动FindBugs搜检。代码可所以一个项目,也可以只是几个文件。
1 e$ P* a: A1 P( L0 V+ y$ f
1 H% b: k% d# U+ {$ [, d图6.运行FindBugs
# |. }) _  l8 C! H+ |  m搜检完毕后,会呈现FindBugs视图,把所有搜检的结不美观按照错斡分组展示。点击结不美观琅缦沔的每一个错误,会自动打开对应的代码。当按照轨则改 正了所有的错误,或者说潜在错误,这些代码也就经由过程了静态代码搜检。FindBugs的搜检结不美观可所以XML文件,也可所以文本文件,便于项目的集成打点 和搜检保留。; @6 L. i' e- D

# u" y$ r4 s# `! i$ H图7.FindBugs搜检结不美观
7 L# @7 `4 r& k/ {轨范三:单元测试 ; ?; I! w3 N. G; w0 x2 _
单元测试用例设计和评审
# x. y3 j% ^  _/ a单元测试是软件开发过程中主要的质量保证环节,在此环节中,设计和评审对于保证整个单元测试过程的完整性和有用性来说十分主要。设计阶段需要具 体考虑要对哪些代码单元进行测试,被测单元之间的关系,测试策略,以及单元测试用例设计等,并最终输出《单元测试用例设计》文档,用来指导具体的单元测试 执行。在用例设计中,经由过程对代码单元输入和等候输出的界说来保证该单元的功能正确性,鸿沟值的测试和异常测试很是主要。同时也配合测试用例和功能块的匹配 体例来权衡用例设计的完整性。  H0 c2 Z) V) B7 T2 w, D( K
在用例设计完成之后,下一步的工作就是进行测试用例的评审。小我的理解和经验始终是有限的,用例评审可以借集体之力,对用例设计进入查漏补缺, 进一步保证测试用例的有用性。因为单元测尝康复白盒测试规模,它首要经由过程对代码的逻辑结构进行剖析来设计测试用例,是以,评审员的选择最好以理解代码逻辑 结构为前提,如不美观评审员来自相关模块,还能够有用的发现模块相关性和依靠性所带来的问题。! o7 P2 G. d0 U
模拟对象手艺2 Q4 G" Z$ q5 Y0 K9 S* C1 F
在现实项目中,开发人员自己的代码往往需要和其他的代码模块或系统进行交互,但在测试的过程中,这些需要被挪用的真实对象经常很难被实例化,或 者这些对象在某些情形下无法被用来测试,例如,真实对象的行为无法展望,真实对象的行为难以触发,或者真实对象的运行速度很慢。这时辰,就需要使用模拟对 象手艺(Mock),操作一个模拟对象来模拟我们的代码所依靠的真实对象,来辅佐完成测试,提高测试笼盖率,年夜而提高代码质量。模拟对象手艺操作了在面向 接口的编程中,因为代码直接对接口进行挪用,所以代码并不知道引用的是真实对象仍是模拟对象,这样就可以顺遂的完核对代码的测试,模拟手艺有良多种,如 jMock,EasyMock,Mockito,PowerMock等等。其中Mockito消弭了对期望行为的需求,避免了这些代码的年夜量初始化。
1 O& D1 Q, X+ I( Y; d4 W# P+ P2 x3 K# a6 C3 M3 Z
图8.Mockito示例
: l6 L3 j4 P- E" |% u9 z2 N在模拟对象过程中,先模穆矣闽需要挪用的List对象LinkedList,再设定章个对象的行为,当挪用get(0)的时辰,返 回”first”。这样,测试代码就可以操作这个对象来测试我们的功能代码,需要挪用和返回值的时辰,可以顺遂的获得模拟对象的返回值。也需要对模拟对象 进行错误情形的模拟,保证代码对错误的措置的正确性。
' h% \9 c/ x4 u4 J3 L1 h5 p测试笼盖率剖析
2 c7 V2 e$ D5 K* _& t* @为了权衡单元测试的质量和笼盖典型围,需要对单元测试的代码进行测试笼盖剖析。常用的权衡测试笼盖率的指标首要有语句笼盖率、分支笼盖率、路径 笼盖率、前提笼盖率和体例笼盖率等。具体采用哪些指标可以按照项目的现实情形来定,以避免因过高的指标增添了代码开发人员的工作量而影响了项目整体的进 度。
  d+ ~6 \9 e+ U0 a5 dEMMA是一款斗劲风行的开源Java测试笼盖率剖析工具,撑持类、体例、代码行、根基代码块等多种类型的测试笼盖率剖析,撑持将笼盖率剖析结 不美观导出为多种名目的陈述,并采用多种颜色来高亮显示分歧的笼盖率状况。EclEmma是一款基于EMMA的Eclipse插件,便利在 EclipseIDE中进行测试笼盖率剖析。如图9,在测试用例写好后,可以在右键点击测试类,选择CoverageAs->JUnitTest。
2 H- G/ f9 o( z& X" B( v, c# R( z! h. |$ s
图9.运行测试笼盖剖析
. q0 @- \7 P' Z$ q8 H单元测试跑完后,Coverage视图中会显示所选择的测试的笼盖率。双击打开某一具体的类后,可以看到高亮显示的笼盖剖析结不美观,如图10所 示。红色代表测试没有笼盖到该行,黄色暗示部门笼盖,绿色的行暗示该行在本次测试中被笼盖到。# `- I9 z- k% m+ q; s5 c# b

4 W& U: g$ M3 Q* Z6 z, k1 G图10.查看测试笼盖剖析结不美观
1 T8 D- g" {) \3 h在Coverage视图中可以经由过程点击鼠标右键将测试笼盖剖析的结不美观导出成需要的名目,例如HTML。
" a9 d, y6 M& Q3 a) h- J9 w
" q* Z# q- O/ K) e0 P5 Q/ p: L图11.导出测试笼盖剖析结不美观 : H" t$ l% u0 F5 ]" a, m
图12显示了导出的report。, C$ W; n6 J$ T3 V( ]8 \
& V3 F' j- J( k: S0 {
图12.测试笼盖剖析陈述
- e5 s- g: a  m+ A& j; F/ D0 b: @- B( u; p/ Q+ v9 `# U* I0 n
为了保证单元测试的有用性和质量,可以划定一个测试笼盖率的下限,例如所有的包和类的笼盖率必需达到80%以上。不外值得注重的是,不要纯挚追 求高笼盖率,要同时注重测试用例的质量,如不美观测试用例自己就写的有错误,那么即使测试笼盖率很高也没有意义。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:25 | 显示全部楼层

JAVA技巧:如何高质量地编写Java代码

</p>轨范四:持续集成
; M5 X' J& p0 C/ v4 S9 j9 t持续集成(ContinuousIntegration)是操作一系列的工具,体例和轨则,做到快速的构建开发代码,自动的测试化,来提高开发 代码的效率和质量。操作自动构建工具,随时都能把提交的代码构建出来,供给一个可以测试使用的版本,让用户和开发人员同时看到不异的功能,尽早的发现问题 和错误,也可以尽快的获得测试人员和用户的反馈。4 E) C; y8 m& U/ t
要做到持续集成,就要操作一系列工具,把开发过程中的一再工作自动化。搭建自动的构建处事器, 自动的进行单元测试和发布新版本,一个集成的处事器可以供给构建过程的结不美观陈述,自动通知开发人员构建结不美观,而且保留历史数据。 IBMRationalTeamConcert(RTC)可以供给工作使命的打点,项目打算的放置,代码版本打点节制,自动构建可用版本,生成构建结不美观报 告。这些过程组成了项目的持续集成过程,此鱿脯版本的自动构建和代码的自动单元测试是持续集成的关头过程,RTC在这些过程上供给了有力的撑持。/ [) z" N2 m# \3 J
自动构建& q, l3 ~" a( H3 I
RTC供给了buildengine来负责构建build,首选,启动buildengine,并和RTC处事器成立了毗连。再建树项目的 build界说。在这个界说中,需要设定编译哪些模块的代码,需要跳动哪个ANT文件来启动编译,和一些编译过程中的参数的设 定。当这些都筹备好了,编译对于项目而言,就酿成一个简单的工作。
0 \  u3 h  k% [) Y. \  |' B可以看到,经由过程在build界说上,点击请求构建,就可以触发一次构建过程。选择需要的构建参数,这个过程就会在后台运行。每一个开发人员,做 了稍许的代码改变和提交,都可以触发新的构建过程,来保证我们代码的有用性。申请一个新的构建的过程如图13、图14所示。) O5 S" [, Q& @( j* {5 I5 @, `  n

/ ^) u: c! h, `  g* {; G' X8 T8 j0 G图13.申请一个新的构建 / K4 X: j4 o5 _, R
6 L! S+ ~5 u" ]: W! H3 X* H
图14.构建申请界面 5 W. _* G+ X3 K" h
当构建竣事后。RTC处事器会供给构建结不美观陈述。开发人员可以发芽到此次构建的具体信息。! n% x! {' o) x! D% q# y) R1 r7 U
0 _  v( A2 E$ z, j$ r8 w
图15.构建结不美观
4 }8 {+ h$ B0 C: n; b整个开发过程中,构建版本的过程应该是无数次的,经由过程每次构建,都可以获得那时代码的编译情形,而且可以获得一个可运行的软件版本。在构建界说 上,RTC撑持设置构建打算。按时自动的触发一次构建。$ D/ m. G: K) x5 r

8 ?8 P$ e7 F* P7 I7 X# Y图16.构建界说 $ u4 K0 P4 o& N' A# y0 u
自动单元测试
1 n* q' f0 S/ ]. M1 X2 e4 b构建可以自动了,重点提高代码质量的单元测试呢?如不美观每一天的代码,每一个版本的代码,都已经经由过程了我们的单元测试,这样我们就能对代码的质量 有了根基的保证。在构建剧本的自动挪用过程中,经由过程ANT的剧本,可以加上JUnit,EMMA,FindBugs的ANT剧本挪用,每一次的构建,都可 以把这些搜检工作自动的进行一遍测试。这些测试都要生成测试结不美观陈述,RTC不能供给这些陈述的展示,就可以操作Hudson这个开源工具,集成测试陈述 来便利查阅。/ k- e( u6 w, Z* o- r

* D/ n3 y& W1 R+ K0 u2 I图17.自动测试陈述 3 a4 [# g* ?. w2 L* Z
轨范五:代码评审和重构
( t' i3 O8 ?* j代码评审(CodeReview)是Java项目开发过程中的一个主要轨范,代码评审可以辅自觉现静态代码剖析过程中无法发现的一些问题,例如 代码的编写是否合适编码规范,代码在逻辑上或者功能上是否存在错误,代码在执行效率和机能上是否有需要改良的处所,代码的注释是否完整正确,代码是否存在 冗余和一再。代码评审还可以辅悔改进入项目组的成员快速进修和体味项目,促进经验分享,同时也能保证项目成员的精采沟通。代码评审首要搜罗两种形式,同级 评审(PeerReview)和小组评审(GroupReview)。同级评审首要指项目成员间的互相评审,小组评审是指经由过程召开评审会议,项目成员一路 对项目代码进行评审。
2 x" g) u2 K# b2 `8 ~7 t为了提高代码评审的有用性和效率,可以借助一些外部工具,斗劲常用的代码评审工具有Jupiter和CodeStriker。Jupiter是 一款开源的Eclipse插件,许可成员将评审定见定位到真实代码的具体行,因为代码评审的结不美观以XML文件的形式保留,所以可以把结不美观提交到版本打点处事器进 行共享。图18显示了使用Jupiter进行代码评审的界面。
' U4 s7 w! m$ K
0 B% m8 x6 H- V# L: e) }. S8 Y图18.Jupiter代码评审界面
+ w1 j8 {4 W7 ?在代码评审使命建树后,Jupiter将代码评审分成三个阶段,小我评审阶段(IndividualPhase)、团队评审阶段 (TeamPhase)和问题修复阶段(ReworkPhase)。在小我评审阶段,评审成员将发现的代码问题或者缺陷记实下来,每个问题城市作为一个记 录保留在评审表格中。在团队评审阶段,团队的全数或者部门成员会一路对小我评审阶段发现的问题进行定性,如不美观问题确实存在,就将该问题分配给某个成员去解 决,并在Jupiter中将该问题设置成响应的状况。在问题修复阶段,团队成员会修复属于自己的问题,并将响应的记实设置成已解决等正确的状况。. O8 ?+ j* I) c3 t7 x+ @+ S8 z
Codestriker是一款基于Web的常用代码评审工具,对代码的评审可以针对某一具体行,也可以针对折个代码文件,评审定见会被保留在数据库中。评审人员可以同时看到其他人的评论,代码作者也可以针对某一具体的评 论回覆。Codestriker撑持邮件通知,还可以同版本节制处事器进行集成,以跟踪和显示文件内容的改变。图19显示了Codestriker的界 面。
# m- w# g* [  p: b1 c0 A
3 }9 d) p1 v4 D* @图19.Codestriker陈述界面
$ O  {( E6 k5 X8 N1 z在实践中对所有代码进行小组评审会斗劲费时,所以可以按照现实情形来遴选一些焦点代码进行小组评审,或者在项目的前期放置较多的小组评审,等项 目组的成员对代码评审的尺度和要求有较好的理解,进行代码评审的经验提高后,就可以逐渐削减小组评审的次数,年夜而达到年夜部门代码即使只进行同级评审也能保 证很好的质量。
( z3 @* Q: S7 n5 s; V经由过程代码评审发现的问题要经由过程代码重构实时解决失踪,较小的不涉及多人代码的重构可以由项目成员自己借助Eclipse的重构功能完成,分歧项目 成员写的实现不异功能的分歧代码要经由过程谈判整合成公共的类或者体例。斗劲复杂的或者斗劲高条理的重构工作,例如整个项目层面的代码组织形式的改变需要由整 个项目组配合谈判完成。1 O6 M+ X, s/ Z4 G9 G
结论# A$ Z1 S, }: l0 s6 v( o
软件开发没有一成不变、万能通用的流程和体例,但愿巨匠能年夜本文获得启发和收益,连系您的现实项目特点,实践以上轨范和体例,并加以完美和改 进,配合打造高效高质量的Java代码,为您的项目成功奠基坚实的基本。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 09:06 , Processed in 0.292312 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表