水质监测分析编码规范.docx
《水质监测分析编码规范.docx》由会员分享,可在线阅读,更多相关《水质监测分析编码规范.docx(21页珍藏版)》请在课桌文档上搜索。
1、水质监控编码规范XX科技股份有限公司编制目录一、编程规约3(一)命名风格3(二)常量定义7(三)代码格式8(四)OOP规约11(五)集合处理17(六)并发处理22(七)控制语句28(八)注释规约32(九)其它34二、异常日志35(一)异常处理35(二)日志规约38三、单元测试40四、安全规约42五、MySQ1.数据库43(一)建表规约43(二)索引规约46(三)SQ1.语句48(四)ORM映射49六、工程结构50(一)应用分层50(二)二方库依赖51(三)服务器53七、设计规约54附1:专有名词解释58B)领域模型命名规约1)数据对象:xxxDO,XXX即为数据表名。2)数据传输对象:xxxD
2、TO,XXX为业务领域相关的名称。3)展示对象:XXXVO,XXX一般为网页名称。4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxP0J0o(二)常量定义1 .【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。反例:Stringkey=Id#taobao_*+tradeId:cache.put(key,va1.ue);/缓存get时,由于在代码复制时,漏掉下划线,导致缓存击穿而出现问题2 .【强制】在1.ong或者1.ong赋值时,数值后使用大写的1.,不能是小写的1,小写容易跟数字1混淆,造成误解。说明:1.onga=21;写的是数字的21,还是1.ong型的
3、2。3 .【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。正例:缓存相关常量放在类CacheConsts下:系统配置相关常量放在类ConfigConstsT04 .【推荐】常量的熨用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。1)跨应用共享常量:放置在二方库中,通常是c1.ient,jar中的constant目录下。2)应用内共享常量:放置在一方库中,通常是子模块中的constant目录下。反例:易懂变量也要统一定义成应用内共享常量,两位工程
4、师在两个类中分别定义了“YES”的变量:类A中:pub1.icstaticfina1.StringYES=yes:类B中:pub1.icstaticfina1.StringYES=y;A.YES.equa1.s(B.YES),预期是true,但实际返回为fa1.se,导致线上问题。3) 子工程内部共享常量:即在当前子工程的constant目录下。4) 包内共享常量:即在当前包下单独的ConS1.ant目录下。5) 类内共享常量:直接在类内部privatestaticfina1.定义。6) 【推荐】如果变量值仅在一个固定范围内变化用enum类型来定义。说明:如果存在名称之外的延伸属性应使用enu
5、m类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。正例:pub1.icenumSeasonEnuniSPRING(I),SUMMER(2),AUTUMN(3),WINTER(4);privateintseq;SeasonEnum(intseq)this.Seq=seq;Ipuh1.icintgetSeq()(returnseq;)(三)代码格式1.【强制】如果是大括号内为空,则简洁地写成即可,大括号中间无需换行和空格;如果是非空代码块则:1)左大括号前不换行。2)左大括号后换行。3)右大括号前换行。4)右大括号后还有e1.se等代码则不换行:表示终止的右大括号后必须换行。2 .【强
6、制】左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格;而左大括号前需要空格。详见第5条下方正例提示。反例:if(空格a=b空格)3 .【强制】if/for/whi1.e/switch/do等保留字与括号之间都必须加空格。4 .【强制】任何二目、三目运算符的左右两边都需要加一个空格。说吃:运算符包括赋值运算符=、逻辑运算符&、加渡乘除符号等。反例:“TCP连接超时”解释成“传输控制协议连接超时”,理解反而费脑筋。7 .代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。说明:代码与注释更新不同步,就像路网与导航软件更新不同步一样,如果导航软件严重
7、滞后,就失去了导航的意义。8 .【参考】谨慎注释掉代码。在上方详细说明,而不是简单地注释掉。如果无用,则删除。说明:代码被注释掉有两种可能性:1)后续会恢复此段代码逻辑。2)永久不用。前者如果没有备注信息,难以知晓注释动机。后者建议直接删掉(代码仓库已然保存了历史代码)。9 .【参考】对于注释的要求:第一、能够准确反映设计思想和代码逻辑:第二、能够描述业务含义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看的,使其能够快速接替自己的工作。10 .【参考】好的命名、代码结构是自解释的
8、,注释力求精简准确、表达到位。避免出现注释的一个极端:过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。反例:门pute1.ephantintofridgeput(e1.ephant,fridge);方法名put,加上两个有意义的变量名e1.ephant和fridge,已经说明了这是在干什么,语义清晰的代码不需要额外的注释。11 .【参考】特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描,经常清理此类标记。线上故障有时候就是来源于这些标记处的代码。1)待办事宜(TODo):(标记人,标记时间,预计处理时间)表示需要实现,但目前还未实现的功能。这实际上是一个Ja
9、VadOC的标签,目前的JaYadoC还没有实现,但已经被广泛使用。只能应用于类,接口和方法(因为它是一个JaVadoC标签)。2)错误,不能工作(FIXME):(标记人,标记时间,预计处理时间)在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况。(九)其它1 .【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。说明:不要在方法体内定义:Patternpattern=Ppi1.e(规则”);2 .【强制】ve1.ocity调用POJO类的属性时,直接使用属性名取值即可,模板引擎会自动按规范调用POJO的getXxx(),如果是boo1.ean基本数
10、据类型变量(boo1.ean命名不需要加is前缀),会自动调用isXxx()方法。说明:注意如果是Boo1.ean包装类对象,优先调用getXxx()的方法。3 .【强制】后台输送给页面的变量必须加S!var一中间的感叹号。说明:如果var等于nu1.1.或者不存在,那么$var会直接显示在页面上。4 .【强制】注意Math,random()这个方法返回是doub1.e类型,注意取值的范围0x1.(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将X放大10的若干倍然后取整,直接使用Random对象的nextInt或者next1.ong方法。5 .【强制】获取当前毫秒数Syste
11、m.CurrentTimeMi1.1.isO;而不是newDate().getTime();说明:如果想获取更加精确的纳秒级时间值,使用SyStem.nanoTime()的方式。在JDK8中,针对统计时间等场景,推荐使用InStant类。6 .【强制】日期格式化时,传入pattern中表示年份统一使用小写的y。说明:日期格式化时,yyyy表示当夭所在的年,而大写的YYYY代表是weekinwhichyear(JDK7之后引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。另外需要注意: 表示月份是大写的M 表示分钟则是小写的m 24小时
12、制的是大写的11 12小时制的则是小写的h正例:表示日期和时间的格式如下所示:newSimp1.eDateForiiiat(yyyy-MM-ddHH:mm:ss*);7 .不要在视图模板中加入任何复杂的逻辑。说明:根据MVC理论,视图的职责是展示,不要抢模型和控制器的活。8 .:任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。9 .及时清理不再使用的代码段或配置信息。说明:对于垃圾代码或过时配置,坚决清理干净,避免程序过度腌肿,代码冗余。正例:对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(/)来说明注释掉代码的理由。二、异常日志(一
13、)异常处理1 .【强制】JaVa类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过CatCh的方式来处理,比如:NU1.1.POinterEXCeP1.iOn,IndexOutOfBoundsException等等。说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,可能存在数字格式错误,不得不通过catchNuinberFormatException来实现。正例:if(obj!=nu1.1.).反例:tryIobj.method();catch(Nu1.IPoiDterExcep1.ione),!,2 .【强制】异常不要用来做流程控制,条件控制。说
14、明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式要低很多。3 .【强制】Ca1.Ch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的Cateh尽可能进行区分异常类型,再做对应的异常处理。说明:对大段代码进行try-catch,使程序无法根据不同的异常做出正确的应激反应,也不利于定位问题,这是一种不负责任的表现。正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或用户输入密码过于简单,在程序上作出分门别类的判断,并提示给用户。4 .【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将
15、该异常批给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。5 .【强制】有try块放到了事务代码中,catch异常后,如果需要回滚事务,一定要注意手动回滚事务。6.【强制】fina1.1.y块必须对资源对象、流对象进行关闭,有异常也要做try-catcho说明:如果JDK7及以上,可以使用try-with-resources方式。【强制】不要在fina1.1.y块中使用re1.urn0说明:try块中的return语句执行成功后,并不马上返回,而是继续执行fina1.1.y块中的语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try块中的返回点。反例:
16、privateintx=0;pub1.icintCheckReturn()try/x等于1,此处不返回return+x;fina1.1.y/返回的结果是2return+x;)8 .【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。9 .【强制】在调用RPC,二方包、或动态生成类的相关方法时,捕捉异常必须使用Throwab1.e类来进行拦载。说明:通过反射机制来调用方法,如果找不到方法,抛出NosuchMethodExceptiono什么情况会抛出NoSuchMethodError呢?二方包在类冲突时,仲裁机制
17、可能导致引入非预期的版本使类的方法签名不匹配,或者在字节码修改框架(比如:ASM)动态创建或修改类时,修改了相应的方法签名。这些情况,即使代码编译期是正确的,但在代码运行期时,会抛出NoSuchMethodError(10 .【方法的返回值可以为nu1.1.,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回nu1.1.值。说明:本手册明确防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回nu1.1.的情况。11 .【1防止NPE,是程序员的基本修养,注意NPE产生的场景:12
18、返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPEo反例:pub1.icintfOtreturnInteger对象,如果为nu1.1.,自动解箱抛NPEo2) 数据库的查询结果可能为nu1.1.o3)集合里的元素即使isNotEmpty,取出的数据元素也可能为nu1.1.。4)远程调用返回对象时,一律要求进行空指针判断,防止NPE。5)对于Session中获取的数据,建议进行NPE检查,避免空指针。6)级联调用obj.getAO.getBO.getCO;一连串调用,易产生NPEo王例:使用JDK8的OPtiona1.类来防止NPE问题。12 .定义时区分UnCh
19、eCked/checked异常,避免直接抛出newRuntimeExceptionO.更不允许抛出Exception或者Throwab1.e,应使用有业务含义的自定义异常。推荐业界已定义过的自定义异常,如:DAOException/ServiceException等。13 .【参考】对于公司外的http/api开放接口必须使用“错误码”;而应用内部推荐异常拗出:跨应用间RPC调用优先考虑使用Resu1.t方式,封装isSuccess()方法、“错误码”、“错误简短信息”。说明:关于RPC方法返回方式使用Resu1.t方式的理由:1)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。2
20、)如果不加栈信息,只是new自定义异常,加入自己的理解的errormessage,对于调用端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传揄的性能损耗也是问题。14 .【参考】避免出现重复的代码(DontRepeatYourse1.f),即DRY原则。说明:随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副本,容易遗漏。必要时抽取共性方法,或者抽象公共类,甚至是组件化。正例:一个类中有多个pub1.ic方法,都需要进行数行相同的参数校验操作,这个时候请抽取:privateboo1.eancheckParam(DTOdto)(.)(二)日
21、志规约1-【强制】应用中不可直接使用日志系统(1.og4、1.ogback)中的API,而应依赖使用日志框架S1.F4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。importorg.s1.f4j.1.ogger;importorg.s1.f4j.1.oggerEactory;privatestaticfina1.1.ogger1.ogger=1.oggerFactory.get1.ogger(Test,c1.ass);2 .【强制】所有日志文件至少保存15天,因为有些异常具备以“周”为频次发生的特点。网络运行状态、安全相关信息、系统监测、管理后台操作、用户敏感操
22、作需要留存相关的网络日志不少于6个月。3 .【强制】应用中的扩展日志(如打点、临时监控、访问日志等)命名方式:appName_1.ogType_1.ogName.1.og。IogType:日志类型,如stats/monitor/access等;IogName:日志描述。这种命名的好处:通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。说明:推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。土例:force-web应用中单独监控时区转换异常,如:force_web_timeZoneConvert.1.og4 .【强
23、制】在日志输出时,字符串变量之间的拼接使用占位符的方式。说明:因为String字符串的拼接会使用StringBui1.der的append。方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。正例:1.ogger.Processingradewitid:andsymbo1.:,.id.symbo1.;5 .【强制】对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断。说明:虽然在debug(参数)的方法体内第一行代码isDisab1.ed(1.eve1.DEBUGNT)为真时(S1.f4j的常见实现1.og4j和1.ogback),就直接return,但
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 水质 监测 分析 编码 规范
链接地址:https://www.desk33.com/p-1784357.html