JAVADOC格式及注意的地方
- 格式:pdf
- 大小:231.83 KB
- 文档页数:16
静态代码分析一、什么是静态代码分析静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。
在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。
统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。
但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。
静态代码分析工具的优势1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
二、主流Java静态分析工具Findbugs、checkstyle和PMD都可以作为插件插入eclipse,当然也有单独的工具可以实现他们的功能,比如Findbugs Tool就可以不必插入eclipse就可以使用。
CheckStyle检查源文件主要关注格式检查Java源文件是否与代码规范相符主要包括:Javadoc注释命名规范多余没用的ImportsSize度量,如过长的方法缺少必要的空格Whitespace重复代码三者作为开源的软件,不用考虑版权问题。
他们的源代码保存在/上,下载也可以去这里下载。
三、Findbugs、checkstyle、PMD的安装1. 下载插件因为Findbugs、checkstyle、PMD都在/这个开源的网站上进行管理,所以直接去该网站下载。
工具下载地址截图注意事项Findbugs http://source/projects/findbugs/files/findbugs%20eclipse%20plugin/下载的时候要注意红框里一定是findbugseclipse plugin,有可能你在这个网站上下载到Findbugs,但他不能用做eclipse插件使用。
1 Java 编程规范1.1 排版1.1.1 规则规则1程序块要采用缩进风格编写,缩进的空格数为4个,不允许使用TAB缩进。
(1.42+)说明:缩进使程序更易阅读,使用空格缩进可以适应不同操作系统与不同开发工具。
规则2分界符(如大括号‘{’和‘}’)应各独占一行,同时与引用它们的语句左对齐。
在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序或者static、,synchronized等语句块中都要采用如上的缩进方式。
(1.42+) 示例:if (a>b){doStart();}规则3较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
(1.42+)示例:if (logger.isDebugEnabled()){logger.debug("Session destroyed,call-id"+ event.getSession().getCallId());}规则4不允许把多个短语句写在一行中,即一行只写一条语句(1.42+)说明:阅读代码更加清晰示例:如下例子不符合规范。
Object o = new Object(); Object b = null;规则5if, for, do, while, case, switch, default 等语句自占一行,且if, for, do, while,switch等语句的执行语句无论多少都要加括号{},case 的执行语句中如果定义变量必须加括号{}。
(1.42+)说明:阅读代码更加清晰,减少错误产生示例:if (a>b){doStart();}case x:{int i = 9;}规则6相对独立的程序块之间、变量说明之后必须加空行。
(1.42+)说明:阅读代码更加清晰示例:if(a > b){doStart();}//此处是空行return;规则7在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如.),后不应加空格。
狂神说Java--Java学习笔记(基础合集)笔记参考来源狂神说Java视频https:///video/BV12J41137hu 本篇笔记有点长,可以根据⽬录定位,建议配合视频学习。
预科什么是计算机1. 名称:Computer,全称电⼦计算机,俗称电脑。
2. 定义:能够按照程序运⾏,⾃动、⾼速处理海量数据的现代化智能电⼦设备。
3. 组成:由硬件和软件组成。
4. 形式:常见显⽰有台式计算机、笔记本计算机、⼤型计算机等。
5. 应⽤:科学计算、数据处理、⾃动控制、计算机辅助设计、⼈⼯智能、⽹络等领域。
硬件及冯诺依曼结构计算机硬件组成:CPU,主板,内存,电源,主机箱,硬盘,显卡,键盘、⿏标,显⽰器。
冯诺依曼结构软件及软件开发计算机软件Windows常⽤快捷键Alt+f4关闭窗⼝ Shift+Delete永久删除 ctrl+w⾃动保存死机:任务管理器结束进程基本的Dos命令打开CMD的⽅式1. 开始+系统+命令提⽰符2. win键+R+输⼊cmd (推荐使⽤)3. 在任意的⽂件夹下,按住Shift键+⿏标右击,打开命令⾏窗⼝4. 在资源管理器地址栏路径前⾯加 “cmd ”5. 管理员运⾏⽅式:命令提⽰符右键以管理员⾝份运⾏(最⾼权限运⾏)常⽤的Dos命令# 盘符切换 E:# 查看当前⽬录下所有⽂件 dir# 切换⽬录 cd /d E:\idea# 返回上⼀级⽬录 cd ..# 进⼊同级⽬录下的下⼀级⽬录 cd tmp(该⽬录下的⽂件名)# 清屏 cls (clear screen)# 退出终端 exit# 查看电脑当前IP地址 ipconfig# 打开计算器 calc# 打开画图 mspaint# 新建记事本 notepad# 在当前⽬录新建⽂件夹 md test(⽂件夹名)# 新建⽂件 cd> a.txt(⽂件名)# 删除⽂件 del a.txt(⽂件名)# 删除⽬录 rd test(⽬录名)# ping命令(复制链接进⼊Dos直接单击⿏标右键粘贴)ping 计算机语⾔发展史第⼀代语⾔:机器语⾔第⼆代语⾔:汇编语⾔第三代语⾔:⾼级语⾔⾼级语⾔C、C++、Java、C#、Python、PHP、JavaScript …⼤体上分为:⾯向过程与⾯向对象两⼤类C语⾔是典型的⾯向过程的语⾔,C++,Java是典型的⾯向对象的语⾔Java⼊门Java帝国的诞⽣Java特性与优势简单性⾯对对象可移植性⾼性能分布式多态性多线程安全性健壮性Java三⼤版本Write Once,Run AnywhereJavaSE: 标准版 (桌⾯程序,控制台开发…)JavaME: 嵌⼊式开发 (⼿机,⼩家电…),已经凉了JavaEE: E企业级开发 (Web端,服务端开发…),JavaSE为基础JDK JRE JVMJDK:Java Development Kit (Java开发者⼯具,包括 JRE,JVM)JRE:Java Runtime Environment (Java运⾏时环境)JVM:Java Virtual Machine (Java虚拟机,跨平台核⼼)安装开发环境卸载JDk1. 删除Java安装⽬录2. 删除环境变量JAVA_HOME3. 删除path下关于JAVA的⽬录4. Java -version安装JDK1. 百度搜索JDK8,找到下载地址2. 同意协议,下载电脑对应的版本,如64位操作系统下载 jdk-8u281-windows-x64.exe3. 双击安装JDK4. 记住安装路径5. 配置环境变量1. 我的电脑-》属性-》系统⾼级设置-》环境变量2. 系统变量新建–> JAVA_HOME 输⼊对应的jdk安装路径3. path变量–>% JAVA_HOME%\bin6. 测试是否成功 cmd–>Java -versionJava基础注释1. 单⾏注释 //2. 多⾏注释 /* */3. ⽂档注释 /** */标识符和关键字Java 所有的组成部分都需要名字。
简介Doxygen一.什么是Doxygen?Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件。
通常我们在写程序时,或多或少都会写上批注,但是对于其它人而言,要直接探索程序里的批注,与打捞铁达尼号同样的辛苦.大部分有用的批注都是属于针对函式,类别等等的说明。
所以,如果能依据程序本身的结构,将批注经过处理重新整理成为一个纯粹的参考手册,对于后面利用您的程序代码的人而言将会减少许多的负担.不过,反过来说,整理文件的工作对于您来说,就是沉重的负担。
Doxygen 就是在您写批注时,稍微按照一些它所制订的规则。
接着,他就可以帮您产生出漂亮的文档了。
因此,Doxygen 的使用可分为两大部分。
首先是特定格式的批注撰写,第二便是利用Doxygen的工具来产生文档。
目前Doxygen可处理的程序语言包含:•C/C++•Java•IDL (Corba, Microsoft及KDE-DCOP类型)而可产生出来的文档格式有:•HTML•XML•LaTeX•RTF•Unix Man Page而其中还可衍生出不少其它格式。
HTML可以打包成CHM格式,而LaTeX可以透过一些工具产生出PS或是PDF文档。
二.安装Doxygen•1。
1 安装 Doxygen 1。
7。
4(Windows)•1。
2 安装 graphviz 2。
28。
0(Windows)graphviz 是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形.Doxygen 使用 graphviz 自动生成类之间和文件之间的调用关系图,如不需要此功能可不安装该工具包。
•1。
3 安装 Windows Help Workshop 1。
32Doxygen 使用这个工具可以生成 CHM 格式的文档。
三.Doxygen的配置Doxygen 产生文档可以分为三个步骤.一是在程序代码中加上符合Doxygen所定义批注格式。
二是使用Doxywizard进行配置。
软件开发中的文档生成工具在现代软件开发中,文档已经成为一个至关重要的部分,且不仅仅是为了满足法规和合规需求,更是为了确保软件的稳定性和可维护性。
然而,手工编写文档不仅费时费力,还容易产生错误。
因此,越来越多的软件开发者开始使用文档生成工具来简化这个过程。
本文将探讨几个流行的文档生成工具。
1. SwaggerSwagger是一个RESTful API文档生成工具,它可以基于接口文档自动生成可视化的API文档。
Swagger的核心是一个JSON或YAML格式的文档,其中包含了所有API端点、请求方式、请求参数以及响应格式等信息。
通过Swagger UI,开发人员可以以交互式方式测试和文档化API,并导出文档为HTML、PDF或Markdown格式。
Swagger不仅仅是一个文档工具,它还可以用来定义和测试API。
开发人员只需在Swagger中定义API规范,然后使用Swagger自动生成相关的客户端代码和服务器端代码。
这样可以大大减少代码编写时间并确保代码的一致性。
2. DoxygenDoxygen是一个跨平台的文档生成工具,用于生成C++、Java、Python等语言的API文档。
它通过解析源代码中特定注释来生成文档,注释格式符合特定风格。
Doxygen可以生成HTML、LaTeX、RTF、PDF、Man等多种格式的文档,并可用于生成UML类图、调用图和依赖关系图等。
Doxygen还能够将注释注入到源代码中,从而使产生的文档保持同步。
3. SphinxSphinx是一个用于Python项目的文档生成器。
它使用reStructuredText来编写文档,并可以生成HTML、PDF、EPUB、Texinfo等格式的文档。
Sphinx也支持自定义主题,从而让文档风格更加吸引人。
Sphinx还集成了自动化的API文档生成功能。
它可以自动识别Python模块和图像,生成函数和类的文档,并自动链接相关函数和类。
Java编码规范Java编码规范11.说明21.1 为什么要有编码规范21.2 声明22. 文件名<File Names>22.1 文件后缀<File Suffixes>23.1 Java源文件<Java Source Files>23.1.1 开头注释<Beginning ments>23.1.2 包和引入<Package and Import Statements>23.1.3 类和接口声明<Class and Interface Declarations>24.1 行长度34.2 换行<Wrapping Lines>3// CONVENTION INDENTATION3Object andStillAnother> {3|| !<condition5 && condition6>> {35. 注释<ments>35.1 实现注释的格式<Implementation ment Formats>45.1.1 块注释45.1.2 单行注释<Single-Line ments>45.1.3 尾端注释<Trailing ments>45.1.4 行末注释<End-Of-Line ments>45.2 文档注释<Documentation ments>46. 声明<Declaration>56.1 每行声明变量的数量<Number Per Line>56.2 初始化<Initialization>56.3 布局<Placement>57.1 简单语句<Single Statement>57.2 复合语句<pound Statements>57.3 返回语句<return Statements>s57.4 if, if-else, if else-if else语句<if, if-else, if else-if else Statements>5 } else {6} else if <condition> {6} else if <condition> {67.5 for语句<for Statements>67.6 while语句<while Statements>67.7 do-while语句<do-while Statements>67.8 switch语句<switch Statements>67.9 try-catch语句<try-catch Statements>6} catch <ExceptionClass e> {6} catch <ExceptionClass e> {6} finally {68. 空白<White Space>68.1 空行<Blank Lines>68.2 空格<Blank Spaces>69. 命名规范<Naming Convention>710. 编程惯例<Programming Practices>710.1 提供对实例以与类变量的访问控制<Providing Access to Instance and Class V ariables>7 10.2 引用类变量和类方法<Referring to Class Variables and Methods>710.4 变量赋值<Variable Assignments>710.5 其它惯例<Miscellaneous Practices>810.5.1 圆括号<Parentheses>810.5.2 返回值<Returning Values>810.5.3 条件运算符"?"前的表达式<Expressions before "?" in the Conditional Operator>810.5.4 特殊注释<Special ments>811. 代码范例<Code Examples>811.1 Java源文件范例<Java Source File Example>81.说明1.1 为什么要有编码规范编码规范对于程序员而言尤为重要,有以下几个原因:◆一个软件的生命周期中,80%的花费在于维护.◆几乎没有任何一个软件,在其整个生命同期中,均由最初的开发人员来维护.◆编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新代码.◆如果你将源码作为产品发布,就需要确认它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品.为了执行规范,每个软件开发人员必须一致遵守编码规范.每个人!!!1.2 声明本文档反映的是Sun Microsystem公司,Java语言规范中的编码标准部分.主要贡献者包括:Peter King,Patrick Naughton,Mike DeMoney,Jonni Kanerva,Kathy Walrath以与Scott Hommel.本文档现由Scott Hommel维护,有关评论请发至shommeleng.sun .2. 文件名<File Names>这部分列出了常用的文件名与其后缀.2.1 文件后缀<File Suffixes>Java程序使用下列文件后缀:2.2 常用文件名<mon File Names>常用的文件名包括:3. 文件组织<File Orgnization>一个文件由被空行分割而成的段落以与标识每个段落的可选注释共同组成.超过2000行的程序难以阅读,应该尽量避免."Java源文件范例"提供了一个页面布局合理的Java程序范例.3.1 Java源文件<Java Source Files>每个Java源文件都包含一个单一的公共类或接口.若私有类和接口与一个公共类相关联.可以将它们和公共类放入同个源文件.公共类必须是这个文件中的第一个类和接口.Java源文件还遵循以下规则:◆开头注释<参见"开头注释">◆包和引入语句<参见"包和引入语句>◆类和接口声明<参见"类和接口声明>3.1.1 开头注释<Beginning ments>所有的源文件都应该在开头有一个C语言风格的注释,其中列出数出类名、版本信息,日期和声明:/ ** Classname** Version information** Date** Copyright notice* /3.1.2 包和引入<Package and Import Statements>在多数Java源文件中,第一个非注释行是包语句行.在它之后可以跟引入语句.例如:package java.awt;import java.awt.peer.CanvasPeer;3.1.3 类和接口声明<Class and Interface Declarations>下表描述了类和接口声明的免修部分以与它们出现的先后次序.参见"Java源文件范例"中一个包含注释的例子.4. 缩进排版<Indentation>4个空格常被作为缩进排版的一个单位.缩进的确切解释并未详细指定<空格vs.制表符>.一个制表符等于8个空格<而非4个>.4.1 行长度尽量避免一行长度超过80个字符,因为很多终端和工具不能很好处理之.注意:用于文档是的例子应该使用更短的行长,长度一般不超过70个字符.4.2 换行<Wrapping Lines>当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之:◆在一个逗号后面断开.◆在一个操作符前面断开.◆宁可选择较高级别的<higher-level>的断开,而非较低级别<lower-level>的断开.◆新的一行应该与上一行同一级别表达式的开头处对齐.◆如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格.以下是断开方法的一些例子:someMethod<longExpression1, longExpression2,longExpression3, longExpression4, longExpression5>;var = someMethod1<Expression1,someMethod2<longExpression2,longExpression3>>;以下是两个断开算术表达式的例子.前者更好,因为断开处位于括号表达式的外边,这是个较高级别的断开.longName1 = longName2 * <longName3 + longName4- longNeme5>+ 4 * longName6>;//PREFFER longName1 = longName2 * <longName3+ longName4- longName5>+ 4 * longName6; //A VOID 以下是两个缩进方法声明的例子.前者是常规情形,后者若使用常规的缩进方式将会使第二行和第三行移得很靠右,所以代这以缩进8个空格.// CONVENTION INDENTATIONsomeMethod<int anArg, Object anotherArg,String yetAnotherArg,Object andStillAnother> {……}// INDENT 8 SPACES TO A VOID VERY DEEP INDENTSprivate static synchronized horkingLongMethodName<int anArg, Object anotherArg, String yetAnotherArg,Object andStillAnother> {……}if语句的换行通常使用8个空格的规则,因为常规缩进<4个空格>会使语句看起来比较费劲.比如://DON’T USE THIS INDENTATIONif<<condition1 && condition2>|| <condition3 && condition4>|| !<condition5 && condition6>> { //BAD WRAPSdoSomethingAboutIt<>; // MAKE THIS LING EASY TO MISS }// USE THIS INDENTATION INSTEADif <<condition1 && condition2>|| <condition3 && condition4>|| !<condition5 && condition6>> {doSomethingAboutIt<>;}// OR USE THISif<<condition1 && condition2> || <condition3 && condition4>|| !<condition5 && condition6>> {doSomthingAoutIt<>;}这里有三种可行的方法用于处理三元运算表达式:alpha = <aLongBooleanExpression> ? beta : gamma;alpha = <aLongBooleanExpression> ? beta: gamma;alpha = <aLongBooleanExpression>? beta: gamma;5. 注释<ments>Java程序有两类注释:实现注释<implementation ments>和文档注释<document ments>.实现注释是那些在C++中见过的,使用/*…*/和//界定的注释.文档注释<被称为"doc ments">是Java独有的,并由/**…*/界定.文档注释可以通过javadoc工具转换成HTML文件.实现注释用以注释代码或或者实现细节.文档注释从实现自由<implemtentation-free>的角度描述代码的规范.它可以被那些手头没有源码的开发人员读懂.注释应被用来给出代码的总括,并提供代码自身没有提供的附加信息.注释应该仅包含与阅读和理解程序有关的信息.例如,相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中.在注释里,对设计决策中重要的或者不是显而易见的地方进行说明是可以的,但应避免提供代码中已清晰表达出来的重复信息,多余的注释很容易过时.通常应避免那些代码更新就可能过时的注释.注意:频繁的注释有时反映出代码的低质量.当你觉得被迫要加注释的时候,考虑一下重写代码使其更清晰.注释不应写在用星号或字符画出来的大框里.注释不应包括诸如制表符和回退符之类的特殊字符.5.1 实现注释的格式<Implementation ment Formats>程序可以有4种实现注释的风格:块<Block>,单行<single-line>,尾端<trailing>和行末<end-of-line>.5.1.1 块注释块注释通常用于提供对文件,方法,数据结构和算法的描述.块注释被置于每个文件的开始处以与每个方法之前.它们也可以被用于其他地方,比如方法的内部.在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式.块注释之首应该有一个空行,用于把块注释和代码分割开来,比如:/ ** Here is a block ment.*/块注释可以以/ *-开头,这样indent<1>就可以将之识别为一个代码块的开始,而不会重排它./ *-* Here is a block ment with some very special* formatting that I want indent<1> to ignore.** one* two* three*/注意:如果你不使用indent<1>,就不必在代码中使用/ *-, 或为他人可能对你的代码运行indent<1>让步.参见"文档注释".5.1.2 单行注释<Single-Line ments>短注释可以显示一行内,并与其后的代码具有一样的缩进层级.如果一个注释不能在一行内写完,就该块注释<参见"块注释">.单行注释之前应该有一个空行.以下是一个Java代码中单行注释的例子:if<condition> {/ * Handle the condition. */……}5.1.3 尾端注释<Trailing ments>极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释.若有多个短注释出现于大段代码中,它们应该具有相同的缩进.以下是一个Java代码中尾端注释的例子:if<a ==2> {return TRUE; / * special case */} else {return isPrime<a>; / * works only for odd a */ }5.1.4 行末注释<End-Of-Line ments>注释界定符"//",可以注释掉整行或者一行中的一部分.它一般不用于连续多行的注释文本;然而,它可以用来注释掉多行的代码段.以下是所有三种风格的例子:if<foo > 1> {// Do a double-filp.……}else {return false;}// if <bar > 1> {//// // Do a triple-filp.//……// }// else {//return false;// }5.2 文档注释<Documentation ments>注意:此处描述的注释格式之范例,参见"Java源文件范例"若想了解更多,参见"How to Write Doc ments for Javadoc",其中包含了有关文档注释标记的信息<return,param,see>:java.sun /javadoc/writingdocments/index.html若想了解有关文档注释和javadoc的详细资料,参见javadoc的主页:java.sun /javadoc/index.html文档注释描述Java的类、接口、构造器、方法,以与字段<field>.每个文档注释都会被置于注释界定符/ **…*/之中,一个注释对应一个类、接口或成员.该注释应位于声明之前:/ *** The Example class provides …*/public class Example { …注意:顶层<top-level>的类和接口是不缩进的,而其成员是缩进的.描述类和接口的文档注释的第一行会被置于注释的第一行</ **>不需要缩进;随后的文档注释每行都缩进1格<使星号纵向对齐>.成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格.若你想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释<见5.1.1>或紧跟在声明后面的单行注释<见 5.1.2>.例如,有关一个类实现的细节应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中.文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联.6. 声明<Declaration>6.1 每行声明变量的数量<Number Per Line>推荐一行一个声明,因为这样以利于写注释.亦即,int level; // indentation levelint size; // size of table要优于,int level, size;不要将不同类型变量的声明放在同一行,例如:int foo, fooarry[]; // WRONG!注意:上面的例子中,在类型和标识之间放了一个空格,另一种被允许的替代方法是使用制表符:int level;// indentation levelint size;// size of tableObject currentEntry; // currently selected table entry6.2 初始化<Initialization>尽量在声明局部变量的同时进行初始化.唯一不这么做理由是变量的初始值依赖于某些先前发生的计算.6.3 布局<Placement>只在代码块的开始处声明变量<一个块是指任何被包含在大括号"{"和"}"中间的代码>.不要在首次用于该变量时才声明之,这会把注意力不集中的程序员搞糊涂,同时会妨碍代码在该作用域内的可移植性.void myMethod<> {int int1 = 0;if<condition> {int int2 = 0;…}}该规则的一个例外是for循环的索引变量for <int i = 0; I < maxLoops; i++> { … }避免声明的局部变量覆盖上一级声明的变量.例如,不要在内部代码块中声明相同的变量名:int count;…myMethod<> {if <condition> {int count = 0; // A VOID…}…}6.4 类和接口的声明<Class and Interface Declarations>当编写类和接口时,应该遵守以下格式规则:1◆在方法名与其参数列表之前的左括号"<"间不要有空格.◆左大括号"{"位于声明语句同行的末尾.◆右大括号"}"另起一行,与相应的声明语句对齐,除非是一个空语句,"}"应紧跟在"{"之后.class Sample extends Object {int ivar1;int ivar2;Sample<int i, int j> {ivar1 = i;ivar2 = j;}int emptyMethod<> {}…}方法与方法之间以空行分隔.7. 语句<Statements>7.1 简单语句<Single Statement>每行至多包含一条语句,例如:argv++; // Correctargc--; // Correctargv++; argc--; // A VOID!7.2 复合语句<pound Statements>复合语句是包含在大括号中的语句序列,形如"{ 语句}".例如下面各段.◆被括其中的语句应该较之复合语句缩进一个层次.◆左大括号"{"应位于复合语句起始行的行尾;右大括号"}"应另起一行并与复合语句首行对齐.◆大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如if – else或for控制结构的一部分.这样便于添加语句而无需担心由于忘了加括号而引入bug.7.3 返回语句<return Statements>s一个带返回值的return语句不使用小括号"<>",除非它们以某种方式使返回值更显见.例如:return;return myDisk.size<>;return <size ? size ; defaultSize>;7.4 if, if-else, if else-if else语句<if, if-else, if else-if else Statements>if-else语句应该具有如下格式:if <condition> {statements;}if <condition> {statements;} else {statements;}if <condition> {statements;} else if <condition> {statements;} else if <condition> {statements;}注意:if语句问题用"{"和"}"括起来,避免使用如下容易引起错误的格式:if <condition> // A VOI! THIS OMITS THE BRACES {}! statement;7.5 for语句<for Statements>一个for语句应该具有如下格式:for <initialization; condition; update> {statements;}一个空的语句<所有工作都在初始化,条件判断,更新子句中完成>应该具有如下格式:for <initialization; condition; update>;当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高.若需要,可以在for循环之前<为初始化子句>或for循环末尾<为更新子句>使用单独的语句.7.6 while语句<while Statements>一个while语句应该具有如下格式:while <condition> {statements;}一个空的while语句应该具有如下格式:while <condition>;7.7 do-while语句<do-while Statements>一个do-while语句应该具有如下格式:do {statements;} while <condition>;7.8 switch语句<switch Statements>一个switch语句应该具有如下格式:switch <condition> {case ABC:statements;/ * falls through */case DEF:statements;break;case XYZ:statements;break;}每当一个case顺着往下执行时<因为没有break语句>,通常应在break语句的位置添加注释.上面的示例代码中就包含注释/ * falls through */.7.9 try-catch语句<try-catch Statements>一个try-catch语句应该具有如下格式:try {statements;} catch <ExceptionClass e> {statements;}一个try-catch语句后面也可能跟着一个finally语句,不论try代码块是否顺利执行完,它都会被执行.try {statements;} catch <ExceptionClass e> {statements;} finally {statements;}8. 空白<White Space>8.1 空行<Blank Lines>空行将逻辑相关的代码段分隔开,以提高可读性.下列情况应总是使用两个空行:◆一个源文件的两个片段<section>之间.◆类声明和接口声明之间.下列情况应该总是使用一个空行:◆两个方法之间.◆方法内的局部变量和方法的第一条语句之间.◆块注释<参见"5.1.1”>或单行注释<参见5.1.2>之前.◆一个方法内的两个逻辑段之间,用以提高可读性.8.2 空格<Blank Spaces>下列情况应该使用空格:◆一个紧跟着括号的关键应该被空格分开,例如:while <true> {….}注意:空格不应该置于方法名与其左括号之间,这将有助于区分关键字和方法调用.◆空白应该位于参数列表中逗号的后面.◆所有的二元运算符,除了".",应该使用空格将之与操作数分开.一元操作符和操作数之间不应该加空格,比如:负号<"-">,自增<"++">和自减<"--">.例如:a += c + d;a = <a + b> / <c * d>;while <d++ + s++> {n++;}printSize<"size is " + foo + "\n">;◆for语句中的表达式应该被空格分开,例如:for <expr1; expr2; expr3>◆强制转型后应该跟一个空格,例如:myMethod<<byte> aNum, <Object> x>;myMethod<<int> <cp + 5>, <<int> <i + 3>> + 1>;9. 命名规范<Naming Convention>9.1包<Packages>一个唯一包名的前缀总是全部小写的ASCⅡ字母并且是一个顶级域名,通常是,gov,edu,mil,net,org,或1981年ISO 3166标准所指定的标识的国家的英文双字符代码.包名的后续部分根据不同机构各自内部的命名规范而不尽相同.这类命名规范可能以特定目录名的组成来区分部门<department>,项目<project>,机器<machine>,或注册名<login names>.例如:.sun.eng.apple.quicktime.v2edu.cmu.cs.bovik.cheese9.2类<Classes>类名是一个名词,采用大小写混合方式,每个单词的首字母大写.尽量使你的类名简洁而富于描述.使用完整单词,避免缩写词<除非该缩写词被广泛的使用,如URL,HTML>.例如:class Rasterclass ImageSprite9.3接口<Interfaces>interface RasterDelegateinterface Storing9.4方法<Methods>方法名是一个动词,采用大小写混合方式,第一个单词的首字母小写,其后单词的首字母大写.例如:run<>runFase<>getBackground<>9.5变量<Variables>除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写.变量名不应以下划线或美元符号开头,尽管这在语法上是允许的.例如:char cint ifloat myWidth9.6实例变量<Instance Variables>实例变量名应简短且富于描述.变量名的选用应该易于记忆,即,能够指出其用途.尽量避免单个字符的变量名,除非是一个性临时变量.临时变量通常被取名为i,j,k,m和n,它们一般用于整形;c,d,e,它们一般用于字符型.int _employeeldString _nameCustomer _customer9.7常量<Constants>大小写规则和变量名相似,除了前面需要一个下划线隔开.尽量避免ANSI常量,容易引起错误.例如:static final int MIN_WIDTH = 4static final int MAX_WIDTH = 999static final int GET_THE_CPU = 1命名规范使程序更易读,从而更易于理解.它们也可以提供一些有关标识符功能的信息,以助于理解代码.例如,不论它是一个常量、包,还是类<如9.7的例子所示>.10. 编程惯例<Programming Practices>10.1 提供对实例以与类变量的访问控制<Providing Access to Instance and Class Variables>若没有足够的理由,不要把实例或类类变量声明为public.通常,实例变量无需显式的设置<set>和获取<gotten>,通常这作为方法调用的边缘效应<side effect>而产生.一个具有public实例变量的恰当例子,是类仅作为数据结构,没有行为.亦即,若你要使用一个结构<struct>而非一个类<如果Java支持结构的话>,那么把类的实例变量声明为public是合适的.10.2 引用类变量和类方法<Referring to Class Variables and Methods>避免用一个对象访问一个类的静态变量和方法.应该用类名替代.例如:classMethod<>; // OKAClass.classMethod<>; // OKanObject.classMethod<>; // A VOID!10.3常量<Constants>位于for循环中作为计数器值的数字常量,除了-1,0和1之外,不应被直接写入代码.10.4 变量赋值<Variable Assignments>避免在一个语句中给多个变量赋相同的值.它很难读懂.例如:fooBar.fChar = barFoo.lchar = ‘c’; // A VOID!不要将赋值运算符用在容易与相等关系运算符混淆的地方.例如:if <c++ = d++> { // A VOID! <Java disallows>….}应该写成if <<c++ = d++> ! = 0> {…}不要使用内嵌<embedded>赋值运算符试图提高运行时效率,这是编译器的工作.例如:d = <a = b +c> + r; // AOVID!应该写成a =b + c;d = a + r;10.5 其它惯例<Miscellaneous Practices>10.5.1 圆括号<Parentheses>一般而言,在含有多种运算符的表达式中使用括号来避免运算符优先级问题,是个好方法.即便运算符的优先级对你而言可能很清楚,但对其他人未必如此.你不能假设别的程序员和你一样清楚运算符的优先级.if <a == b && c ==d> // A VOID!if <<a == b> && <c == d>> // RIGHT10.5.2 返回值<Returning Values>设法让你的程序结构符合目的.例如:if <booleanException> {return true;else {return false;}应该代之以如下方法:return booleanException;类似地:if <condition> {return x;}return y;应该写为:return <condition ? x : y>;10.5.3 条件运算符"?"前的表达式<Expressions before "?" in the Conditional Operator>如果一个包含二元运算符表达式出现在三元运算符" ? : "之前,那么应该给表达式添上一对圆括号.例如:<x >= 0> ? x : -x;10.5.4 特殊注释<Special ments>在注释中使用##X来标识某些方法未实现<bogus>的但可以工作的内容.用FIXME来标识某些假的和错误的内容.11. 代码范例<Code Examples>11.1 Java源文件范例<Java Source File Example>下面的例子,展示了如何合理布局一个包含单一公共类的Java 源程序.接口的布局与其相似.更多信息参见"类和接口"以与"文档注释"./** <#>Blah.java 1.82 99/03/18** Copyright <c> 1994-199 Sun Microsystems, Inc.* 901 San Antonio Road, Palo Alto, California, 94303,* U.S.A* All rights reserved.** This software is the confidential and proprietary* information of Sun Microsystems, Inc. <"Confidential* Information">. You shall not disclose such Confidential * Information and shall use it only in accordance with the * terms of the license agreement you entered into with Sun. */package java.blah;import java.blah.blahdy.BlahBlah;/***Classdescriptiongoeshere.**verison1.8218Mar1999*author FirsnameLastname*/publicclass Blah extends SomeClass {/* A class implementation ment can go here. *//**classVar1documentationment*/publicstaticint classVar1;/***classVar2documentationmentthathappentobe*morethanonelinelong*/privatestatic Object classVar2;/**instanceVar2documentationment*/public Object instanceVar1;/**instanceVar3documentationment*/private Object[] instanceVar3;/***…constructorBlahdocumentationment…*/public Blah<> {//…implementation goes here…}/***…methoddoSomethingdocumentationment…*/publicvoid doSomething<> {//…implementation goes here…}/***…methoddoSomethingElsedocumentation*ment…*param someParamdescription*/publicvoid doSomethingElse<Object someParam> { //…implementation goes here…}}。
软件工程中的代码文档自动生成方法软件工程是一个复杂而庞大的领域,其中代码文档起着非常重要的作用。
代码文档记录了软件开发的过程、设计思路和实现细节,对于项目的管理和后续维护都至关重要。
然而,传统的手动编写文档的方式往往费时费力,容易出错。
因此,自动生成代码文档成为了提高开发效率和文档质量的重要手段之一。
本文将介绍几种常见的代码文档自动生成方法。
一、注释规范注释规范是代码文档自动生成的基础。
通过在代码中添加规范的注释,可以为自动生成工具提供足够的信息来生成文档。
注释规范应该明确定义注释的格式、位置和内容,例如使用特定的注释标签来标识函数的输入输出参数、异常情况等。
同时,注释规范应该与实际代码同步更新,保证文档的准确性。
二、代码文档自动生成工具1. DoxygenDoxygen是一种流行的代码文档自动生成工具,支持C++、Java 等多种编程语言。
它可以根据源代码中的注释自动生成函数、类和模块的文档,并支持导出为HTML、PDF和CHM等格式。
Doxygen还支持根据源代码的UML图生成类之间的关系图,提供了更为直观的代码结构展示。
2. SphinxSphinx是一个适用于Python项目的文档生成工具。
它可以将项目中的注释、文档字符串和扩展的reStructuredText语法转换成专业的文档格式,如HTML和PDF。
Sphinx提供了丰富的主题和插件,可以定制化生成的文档风格,非常适合用于大型项目的文档生成。
3. JavadocJavadoc是Java语言中常用的代码文档自动生成工具。
它通过解析源代码中的注释,生成HTML格式的文档,并提供了丰富的API浏览和搜索功能。
Javadoc可以根据代码中的注释标签来区分不同的元素和属性,并生成对应的文档片段。
三、代码静态分析工具除了以上的自动生成工具,代码静态分析工具也能帮助我们生成代码文档。
例如,常见的Lint工具可以对源代码进行语法和风格检查,并生成相应的警告和错误信息。
再读阿⾥JAVA开发⼿册(嵩⼭版)阿⾥的JAVA开发规范是阿⾥多位优秀的⼯程师多年经验的累积,其中⼤多数规范都是值得学习的。
但是并不是说我们要100%按⾥⾯规范去写代码,有些部分还是要按照⾃⼰公司的规范来。
阿⾥JAVA开发⼿册(嵩⼭版)编程规约(⼀) 命名风格1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:_name / __name / $name / name_ / name$ / name__2. 【强制】所有编程相关的命名严禁使⽤拼⾳与英⽂混合的⽅式,更不允许直接使⽤中⽂的⽅式。
说明:正确的英⽂拼写和语法可以让阅读者易于理解,避免歧义。
注意,纯拼⾳命名⽅式更要避免采⽤。
正例:ali / alibaba / taobao / cainiao/ aliyun/ youku / hangzhou 等国际通⽤的名称,可视同英⽂。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / String fw[福娃] / int 某变量 = 33. 【强制】代码和注释中都要避免使⽤任何语⾔的种族歧视性词语。
正例:⽇本⼈ / 印度⼈ / blockList / allowList / secondary反例:RIBENGUIZI / Asan / blackList / whiteList / slave4. 【强制】类名使⽤ UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO /PO / UID 等。
正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion5. 【强制】⽅法名、参数名、成员变量、局部变量都统⼀使⽤ lowerCamelCase 风格。
JAVADOC格式及注意的地方对于Java注释我们主要了解两种://注释一行/*......*/注释若干行但还有第三种,文档注释:/**......*/注释若干行,并写入javadoc文档通常这种注释的多行写法如下:/***.........*.........*/很多人多忽视了这第三种注释,那么这第三种注释有什么用?javadoc又是什么东西?下面我们就谈谈。
一.Java文档和JavadocJava程序员都应该知道使用JDK开发,最好的帮助信息就来自SUN发布的Java文档。它分包、分类详细的提供了各方法、属性的帮助信息,具有详细的类树信息、索引信息等,并提供了许多相关类之间的关系,如继承、实现接口、引用等。
Java文档全是由一些html文件组织起来的,在SUM的站点上可以下载它们的压缩包。但是你肯定想不到,这些文档我们可以自己生成。――就此打住,再吊一次胃口。安装了JDK之后,安装目录下有一个src.jar文件或者src.zip文件,它们都是以ZIP格式压缩的,可以使用WinZip解压。解压之后,我们就可以看到分目录放的全是.java文件。是了,这些就是Java运行类的源码了,非常完整,连注释都写得一清二楚……不过,怎么看这些注释都有点似曾相识的感觉?
这就不奇怪了,我们的迷底也快要揭开了。如果你仔细对比一下.java源文件中的文档注释(/**...*/)和Java文档的内容,你会发现它们就是一样的。Java文档只是还在格式和排版上下了些功夫。再仔细一点,你会发现.java源
文件中的注释还带有HTML标识,如<B>、<BR>、<Code>等,在Java文档中,该出现这些标识的地方,已经按标识的的定义进行了排版。
终于真像大白了,原来Java文档是来自这些注释。难怪这些注释叫做文档注释呢!不过,是什么工具把这些注释变成文档的呢?
是该请出javadoc的时候了。在JDK的bin目录下你可以找到javadoc,如果是Windows下的JDK,它的文件名为javadoc.exe。使用
javdoc编译.java源文件时,它会读出.java源文件中的文档注释,并按照一定的规则与Java源程序一起进行编译,生成文档。
介绍javadoc的编译命令之前,还是先了解一下文档注释的格式吧。不过为了能够编译下面提到的若干例子,这里先介绍一条javadoc命令:
javadoc-d文档存放目录-author-version源文件名.java这条命令编译一个名为“源文件名.java”的java源文件,并将生成的文档存放在“文档存放目录”指定的目录下,生成的文档中index.html就是文档的首页。-author和-version两上选项可以省略。
二.文档注释的格式文档注释可以用于对类、属性、方法等进行说明。写文档注释时除了需要使用/**....*/限定之外,还需要注意注释内部的一些细节问题。1.文档和文档注释的格式化生成的文档是HTML格式,而这些HTML格式的标识符并不是javadoc加的,而是我们在写注释的时候写上去的。比如,需要换行时,不是敲入一个回车符,而是写入<br>,如果要分段,就应该在段前写入<p>。
因此,格式化文档,就是在文档注释中添加相应的HTML标识。文档注释的正文并不是直接复制到输出文件(文档的HTML文件),而是读取每一行后,删掉前导的*号及*号以前的空格,再输入到文档的。如
/***Thisisfirstline.<br>
*****Thisissecondline.<br>
Thisisthirdline.*/编译输出后的HTML源码则是Thisisfirstline.<br>
Thisissecondline.<br>
Thisisthirdline.前导的*号允许连续使用多个,其效果和使用一个*号一样,但多个*号前不能有其它字符分隔,否则分隔符及后面的*号都将作为文档的内容。*号在这里是作为左边界使用,如上例的第一行和第二行;如果没有前导的*号,则边界从第一个有效字符开始,而不包括前面的空格,如上例第三行。
还有一点需要说明,文档注释只说明紧接其后的类、属性或者方法。如下例:/**commentforclass*/publicclassTest{/**commentforaattribute*/intnumber;/**commentforamethod*/publicvoidmyMethod(){......}......}上例中的三处注释就是分别对类、属性和方法的文档注释。它们生成的文档分别是说明紧接其后的类、属性、方法的。“紧接”二字尤其重要,如果忽略了这一点,就很可能造成生成的文档错误。如
importjava.lang.*;/**commnetforclass*/publicclassTest{......}//此例为正确的例子
这个文档注释将生成正确的文档。但只需要改变其中两行的位置,变成下例,就会出错:
/**commnetforclass*/importjava.lang.*;publicclassTest{......}//此例为错误的例子
这个例子只把上例的import语句和文档注释部分交换了位置,结果却大不相同――生成的文档中根本就找不到上述注释的内容了。原因何在?
“/**commnetforclass*/”是对classTest的说明,把它放在“publicclassTest{......}”之前时,其后紧接着classTest,符合规则,所以生成的文档正确。
但是把它和“importjava.lang.*;”调换了位置后,其后紧接的就是不classTest了,而是一个import语句。由于文档注释只能说明类、属性和方法,import语句不在此列,所以这个文档注释就被当作错误说明省略掉了。
2.文档注释的三部分根据在文档中显示的效果,文档注释分为三部分。先举例如下,以便说明。/***show方法的简述.*<p>show方法的详细说明第一行<br>*show方法的详细说明第二行*@parambtrue表示显示,false表示隐藏*@return没有返回值*/publicvoidshow(booleanb){frame.show(b);}第一部分是简述。文档中,对于属性和方法都是先有一个列表,然后才在后面一个一个的详细的说明。列表中属性名或者方法名后面那段说明就是简述。如下图中被红框框选的部分:
简述部分写在一段文档注释的最前面,第一个点号(.)之前(包括点号)。换句话说,就是用第一个点号分隔文档注释,之前是简述,之后是第二部分和第三部分。如上例中的“*show方法的简述.”。
有时,即使正确地以一个点号作为分隔,javadoc仍然会出错,把点号后面的部分也做为了第一部分。为了解决这个问题,我们可以使用一个<p>标志将第二分部分开为下一段,如上例的“*<p>show方法的详细说明第一行....”。除此之外,我们也可以使用<br>来分隔。
第二部分是详细说明部分。该部分对属性或者方法进行详细的说明,在格式上没有什么特殊的要求,可以包含若干个点号。它在文档中的位置如下图所示:
这部分文档在上例中相应的代码是:*show方法的简述.*<p>show方法的详细说明第一行<br>
*show方法的详细说明第二行
发现什么了?对了,简述也在其中。这一点要记住了,不要画蛇添足――在详细说明部分中再写一次简述哦!第三部分是特殊说明部分。这部分包括版本说明、参数说明、返回值说明等。它在文档中的位置:
第三部分在上例中相应的代码是*@parambtrue表示显示,false表示隐藏*@return没有返回值除了@param和@return之外,还有其它的一些特殊标记,分别用于对类、属性和方法的说明……不要推我,我马上就说。
三.使用javadoc标记javadoc标记是插入文档注释中的特殊标记,它们用于标识代码中的特殊引
用。javadoc标记由“@”及其后所跟的标记类型和专用注释引用组成。记住了,三个部分――@、标记类型、专用注释引用。不过我宁愿把它分成两部分:@和标记类型、专用注释引用。虽然@和标记类型之间有时可以用空格符分隔,但是我宁愿始终将它们紧挨着写,以减少出错机会。
javadoc标记有如下一些:
下面详细说明各标记。1.@see的使用
@see的句法有三种:
@see类名
@see#方法名或属性名
@see类名#方法名或属性名
类名,可以根据需要只写出类名(如String)或者写出类全名(如java.lang.String)。那么什么时候只需要写出类名,什么时候需要写出类全名呢?
如果java源文件中的import语句包含了的类,可以只写出类名,如果没有包含,则需要写出类全名。java.lang也已经默认被包含了。这和javac编译java源文件时的规定一样,所以可以简单的用javac编译来判断,源程序中javac能找到的类,javadoc也一定能找到;javac找不到的类,javadoc也找
不到,这就需要使用类全名了。
方法名或者属性名,如果是属性名,则只需要写出属性名即可;如果是方法名,则需要写出方法名以及参数类型,没有参数的方法,需要写出一对括号。如
有时也可以偷懒:假如上例中,没有count这一属性,那么参考方法count()就可以简写成@seecount。不过,为了安全起见,还是写全@seecount()比较好。