范文为教学中作为模范的文章,也常常用来指写作的模板。常常用于文秘写作的参考,也可以作为演讲材料编写前的参考。大家想知道怎么样才能写一篇比较优质的范文吗?接下来小编就给大家介绍一下优秀的范文该怎么写,我们一起来看一看吧。
代码格式规范化篇一
implementation注释用于注释代码或者注释特殊的实现。文档型注释主要是描述代码段的说明,从一种非面向实现的角度来写给开发人员阅读读,这些开发人员可能手边并没有源代码。
通常注释应该是给代码一个总的描述或者提供从代码本身不太容易看出的附加性信息。注释的内容应只与读代码和理解代码有关。例如,关于相应的包(package)是如何构建,以及存放在什么目录中,不应该包括在注释中。对代码中不太明显的设计意图进行说明是应该的,但也应避免对一些明显的信息进行重复说明,尽量避免那些随着代码的维护会过时的注释。
注意:
过于频繁的注释常常意味着代码质量较低。但你觉得必须频繁添加注释时,应考虑重写该段代码了。注释内容不应封在星号(*)或者其它字母围成的矩形框中;注释中不应带有特殊注释字符如制表符(form-feed)和退格符(backspace)。
代码格式规范化篇二
生活本是不易的,每个人都为了生而努力的活着。
或许现在的我们都能快快乐乐的坐在教室里安静的学习,每天都在为自己的学业而奋斗!很安逸!没有经济上的负担,没有太多的琐事琐事困拢着你,没有沉重的责任压在你身上......可你知道吗?你没有体会过生活苦的滋味,这些的这些都是最爱你的人在为你默默承担者,而那个人就是你的父母。
生活真不容易,爸妈为了养家糊口每天起早贪黑,早出晚归地做小本生意,而这不是一两天的事,而是坚持了十几年!作为家里最大的孩子,就应该帮爸妈分担一些事情!所以,我一放假,就去档口帮爸妈打下手,从早上天还未亮就出门一直到晚上的_点才收档,节假日有时更晚收档11点多才收。干完活回到家整个人都是”累成狗“的样子!
从那时起,我便知道了挣钱的不易,父母养家糊口的不易,更加懂得了生活也是真的不容易.
所以,当我看见有人随意挥霍父母的血汗钱,我都非常的愤怒,因为他们都不懂父母挣钱的辛苦,生活的不易!
没有吃过苦的人,他们没有体会过生活带给他们的苦,他们无法做到将心比心,他们或许会觉得生活就是眼前的这般美好!每天开心地玩,该学的学,不用去考虑太多的东西!
生活就是一面镜子,你哭它就对你哭,你笑它就对你笑,你怎样对待它,它就以怎样的方式对待你。
它或甘或苦,我们都需细细品尝它其中的韵味,哪怕不容易,好好珍惜我们现在所拥有的东西不要将某一物抛掉!
代码格式规范化篇三
北京20xx年统招本科按提前批、本科一批、本科二批、本科三批四个批次依次录取。6月25日8时至29日20时填报本科志愿。规则如下:
(一)统考统招本科志愿
统考统招本科招生高校按本科提前批、本科一批、本科二批、本科三批四个批次依次录取。
本科提前批按a、b、c三段顺序依次录取,每段均设置两个顺序志愿,每个志愿填报1所高校。艺术院校(专业)、体育院校(专业)、军事院校、武警部队院校、招收国防生的院校(专业)、公安类等院校(专业)在a段录取;“双培计划”和“外培计划”原则上在b段录取;“农村专项计划”在c段录取。本科一、二、三批均为平行志愿,分别可以填报6所平行志愿高校。以上每个志愿高校设置6个志愿专业,考生填报时须注明是否服从院校内专业调剂(本科提前批b段不设“是否服从院校内专业调剂”选项)。
高校自主招生选拔、高水平艺术团和高水平运动队招生单独设置特殊类型招生志愿,考生可填报1所志愿高校。取得资格认定的考生,须将资格认定高校填报在该志愿中,方能享受相关特殊类型招生政策。
(二)统考统招专科志愿
统考统招专科招生高校按专科提前批、专科普通批两个批次依次录取。专科提前批设置两个顺序志愿,每个志愿填报1所志愿高校,每所志愿高校设置6个志愿专业;专科普通批为平行志愿,设置20个志愿高校,每个志愿高校设置1个志愿专业。
(三)统考统招征集志愿
录取期间,按考生已填报志愿录取结束时,如当前批次高校计划未完成,将根据情况征集考生志愿。
征集志愿设置如下:
本科提前批a段(b、c两段不设置征集志愿)、专科提前批征集志愿设置两个顺序志愿,每个志愿填报1所高校;本科一、二、三批征集志愿均为平行志愿,分别可以填报5所平行志愿高校。以上每个志愿高校设置6个志愿专业。专科普通批征集志愿为平行志愿,设置10个志愿高校,每个志愿高校设置1个志愿专业。考生填报本科各批次征集志愿时须同时注明是否服从院校内专业调剂。
(四)单考单招志愿
单考单招包括职教师资班(本科)招生和高职单考单招。
1、职教师资班招生设置一个志愿,填报1所志愿高校。
2、高职单考单招设置两个顺序志愿,每个志愿填报1所志愿高校。
以上每所志愿高校设置2个志愿专业、1个是否服从院校内专业调剂选项和1个是否愿意走读选项。高职单考单招志愿还包含1个是否愿意调剂到其他学校的选项。
填报职教师资班志愿的考生,必须是中等专业学校、职业高中应届毕业生,否则志愿无效。高职单考单招录取在职教师资班录取结束后进行。
(一)志愿填报方式
(二)志愿填报时间
6月25日8时至29日20时,统考考生填报本科提前批(包含a、b、c三段)志愿、特殊类型招生志愿、本科一批、本科二批、本科三批志愿,单考考生填报职教师资班和高职单考单招志愿。
7月31日8时至8月1日20时,未被录取的统考考生填报专科提前批和专科普通批志愿。
录取时分本、专科按录取批次顺序进行。本科提前批(包含a、b、c三段)、专科提前批以及单考单招志愿实行顺序志愿投档方式,本科一、二、三批、专科普通批实行平行志愿投档方式。
(一)顺序志愿投档
本科提前批(含a、b、c三段)、专科提前批以及单考单招志愿录取时,实行“志愿优先,从高分到低分”的顺序志愿投档方式,即先进行第一志愿录取,所有高校第一志愿录取结束后,再对未完成计划高校进行第二志愿投档录取。第一、第二志愿投档时对选报同一志愿高校的考生按高校确定的录取原则、调档比例从高分到低分进行投档。
(二)本科平行志愿投档
本科一、二、三批志愿均包含多所志愿高校,实行平行志愿投档方式,按照“分数优先,遵循志愿”的原则进行投档。具体投档办法为:对同一科类类批次线上未被录取的考生按成绩从高分到低分排序进行一次性投档。本科平行投档时根据考生所填报志愿高校顺序,投档到排序在前且有计划余额的高校,分数相同的考生符合同一所高校投档条件且计划余额不足时将依次比较语文、数学(文/理)、外语、文科综合/理科综合科目的.成绩,对单科成绩高者进行投档,直至完成该校招生计划,单科成绩均相同的同时投档。
平行志愿只进行一轮投档,多所高校只作为一个志愿,每个考生最多享受一次投档机会,一旦考生被投档,即使被退档,也不能再投到本轮志愿的其他高校。
(三)专科平行志愿投档
专科普通批志愿包含多所志愿高校,实行平行志愿投档方式,按照“分数优先,遵循志愿”的原则进行投档。具体投档办法为:对同一科类分数线上未被录取的考生按总分(语文、数学、外语三科)从高分到低分排序进行一次性投档。每个考生投档时,根据考生所填报志愿高校专业顺序,投档到排序在前、会考成绩符合要求且有计划余额的高校专业,分数相同的考生符合同一所高校同一专业投档条件且计划余额不足时将依次比较语文、数学(文/理)、外语科目的成绩,对单科成绩高者进行投档,直至完成该高校该专业招生计划,单科成绩均相同的同时投档。专科批次录取采取高会统招形式,即招生高校根据各专业培养需求从会考备选科目中选定2或3门确定成绩等级要求,会考备选科目为:历史、政治、地理、物理、化学、生物、信息技术、通用技术等8门,考生会考成绩必须满足所报专业要求方能投档。
四、志愿填报相关政策说明及注意事项
(一)按照《北京市20xx年普通高等学校招生工作规定》(京招考委〔20xx〕8号)文件规定,少数民族考生,在高考成绩总分的基础上增加5分向高校提供档案,由高校审查决定是否录取,该政策仅适用于北京市属高等学校招生录取。
(二)“双培计划”和“外培计划”分区投放计划,同一高校不同区、科类、专业之间的“双培计划”和“外培计划”不得互调;录取时只录取有专业志愿考生,不进行院校内专业调剂。“农村专项计划”只招收户籍和学籍均在城市发展新区和生态涵养发展区(通州、顺义、大兴、昌平、房山、门头沟、平谷、怀柔、密云、延庆)的农业户口考生。“双培计划”、“外培计划”和“农村专项计划”招生执行本科一批录取最低控制分数线(艺术类、体育类专业分别执行相应类别的本科批次录取最低控制分数线)。
(三)因升学原因将户口迁入我市中专校集体户口的考生:艺术类考生只能报考全国统一招生艺术类专业;体育类考生不参加全市统一志愿填报。
(四)进城务工人员随迁子女只能报考统考专科批次或高职单考单招的志愿。
(五)已被保送生录取、高职自主招生录取、运动训练和武术与民族传统体育专业等单独招生录取的考生,不再参加全市统一志愿填报。
(六)考生要严格按照《20xx年全国普通高等学校在京招生专业目录》填报志愿。在填报之前,要仔细参阅院校的招生章程,了解招生院校的具体要求,结合个人的相关成绩、身体情况认真考虑。如:填报艺术类专业志愿须取得相关艺术类专业考试合格证;填报统考专科志愿时须确认本人会考成绩符合专业要求;填报军事院校(含国防生)、公安院校、武警部队院校等本科提前批录取的专业,须按时参加面试、体检等工作;报考外语类专业、经贸类等相关专业的考生,请查阅招生专业目录了解这些专业对外语口试成绩的要求;填报体育类专业的考生,请确认这些专业对体育专业考试分数的要求等等。
(八)考生须在志愿填报时间截止之前完成信息提交,逾期不予补报。考生志愿是录取的重要依据,志愿填报时间一经截止,任何人不得更改。
代码格式规范化篇四
1、员工的录工、存档
我入职以后,首先完成了对自己在开发区相关录工手续,并完成存档工作。经过这次人事业务办理,使我很快的熟练掌握三个公司的录工手续,从而进一步完成了多名员工的录工存档业务,在办理录工时,要注意,录工是有时限的,在员工入司30日内办理,同时办理录工时还必须注意,员工是属于集团内哪个公司的,这些是在录工是都是需要注意的问题。
2、员工的退工、退档
退工及退档工作是比较复杂的工作。首先,退工需要准备很多材料,而且根据三个公司注册地不一样,准备的材料也是有区别的,所以在办理退工时理清需要准备的材料。其次退档,要根据员工的户籍地不同,退到员工的户口所在地。退工及退档工作也是有时限的,所以必须在规定的时限内完成退工及退档工作。
3、退休
退休在人事对外业务中是比较重要的一项工作,涉及员工退休后申领退休金及退休后医疗的问题。3月份亚拓物业名下的一名保洁员到了退休年龄,我带着准备好的材料和该名职工在开发区办理退休工作,核定退休金基数,完成退休金申领,保证了员工的退休后应得的利益。
4、劳动合同的初签、续签及备案工作
初签和续签劳动合同一方面是公司合法用工的依据,另一方面也是维护员工的合法权利的准则。根据合同规定内容,公司需要合理用工,而员工需要按照合同内容完成规定工作内容并依据合同内容维护自己的合法权益。在完成合同初签和续签工作后,需要在公司注册地完成用工合同的备案工作,以确保公司用工合法性,为公司用工提供法律保障。
5、保险及公积金缴费
6、员工在开发区生育备案登记工作
生育备案登记涉及员工生育保险待遇支付及申报生育津贴等工作,对员工是一项很重要的福利。我根据开发区关于生育保险业务的经办政策,准备了生育妊娠登记所需要的材料,在开发区社险中心做好了员工的生育妊娠登记,为员工生育后申报生育保险待遇支付及申报生育津贴做好了基础性工作。在办理此项业务时需要注意的是,生育妊娠登记是有时限的,必须在员工确定妊娠10周内完成登记。
7.其他相关人事工作
1)完成部分岗位职责的整理
2)完成入司及退司人员的司内档案整理及归档工作
3)在领导协助下做好每月的员工关系报表整理工作
4)参加各区招聘会
5)协助制作新员工入司培训材料
6)随时关注及学习社会保险相关新政策。
代码格式规范化篇五
本节的后续部分都将讨论命名规则,这里先提出几项基本命名原则。
较好的命名应该象firstname、grandtotal、corporatecustomer, 而诸如x1、y1等命名反映任何命名含义,而且造成代码难以理解、维护和改进。
如果软件开发人员应注意软件用户的一些约定术语,不应当随意的创造术语。这会降低软件的易用性。
一般情况下应该用小写字母来命名,其中类(class)和接口(interface)名称的首字母用大写。
设计命名中应该慎用缩写命名。如要采用,则应采用统一的缩略规则,并且在文中的相应部分统一采用缩写。例如,采用num作为number的缩写,那么在整个文档中应该始终使用该缩写。
命名的长度应小于15个字母(但是可以使用更长的形式,以便更好的表达意思)。
命名时应避免采用几乎相同的名称。例如,变量名称persistentobject和persistentobjects不应当同时运用;ansqldatabase和ansqldatabase也不应同时使用。
有时名称中会含有固定的缩略词,例如sql代表standard query language. 而在命名时sqldatabase和sqldatabase就比sqldatabase和sqldatabase易于阅读。
代码格式规范化篇六
命名
关于ejb的命名在《java编程规范(平台科)》中提到:remote接口:。
这样的命名,在jbuilder7中存在“警告信息”,它认为javaidl路径名和类
名重复可能会导致corba访问的问题。
所以,建议remote接口如下命名:
remote接口:。
web发布目录移植(websphereweblogic)
绝对不要把websphere的和文件放在weblogic的发布目录下。这将导致莫名其妙的错误,使得weblogic以为xml的配置文件已经更
jbuilder7在win2000中的问题
注意在系统环境中更改temp目录,因为jbuilder7在编译ejb是会到登录用户的临时目录下交换文件。而缺省的目录却是c:\documents and settings\loginuser\local
settings\temp,在路径中存在空格导致ejb在weblogic下无法通过jbuilder的ide环境编译打包。
还有jbuilder7中,需要在weblogic client和weblogic deploy的类
库中加入jdk的运行包。否则,编译ejb时它根本就找不到类。
性能问题
我们知道每个新的jsp文件在没有编译时,一旦要使用它,servlet engineer会在第一次使用时编译它。这时,你会感觉页面有停滞。在websphere中这种停滞太大了,
在weblogic中几乎没什么感觉。不知道是不是因为websphere仅仅是wsad中的测试环
境而不是一个真正的产品。如果不是仅仅因为这个,那么就太失望了。
一:不允许使用汉语拼音命名 欠规范代码示例: public void zengjiayonghu(){} 拼音方法名称 规范代码示例: public void adduser(){} 解析:应当使用国际化语言,拼音使得代码难懂 二:package名必须全部小写,尽量使用单个单词 欠规范代码示例: 单词大写了,daoimpl多个单词 规范代码示例: 解析:这是一个大家都认同的习惯写法,也是一个默认的规范 三:局部变量及输入参数不要与类成员变量同名(get/set方法与构造函数除外) 欠规范代码示例: public class userdaoimpl{ private int count; pubic void page(int count){} } 类字段和方法参数名相同 规范代码示例:public class userdaoimpl{ private int count; pubic void page(int pagecount){}} 解析:类变量会引起逻辑错误,引起覆盖。 四:尽量不要在变量后面加魔法数字,英文单个字母和没有实际意义的英文数字单词来区分变量 欠规范代码示例: string one; 命名一个英文数字的变量 user user1 = new user(); user user2 = new user(); 规范代码示例: user useradd = new user(); user userupdate = new user(); 解析:这样会降低代码的可读性,并且不容易日后开发人员的维护 文字数限制的原因,未完。。。
注:代码中必须要有注释!
代码格式规范化篇七
记得以前的时候我和朋友在周六了海边散步。那是个火热的夏天。
走在路上我热得难受看一下天空哇——!好刺眼哦!蔚蓝的天空悬着火球般的太阳。尽管如此我们还是说着。笑着。
夏天是果子成熟的季节。看在海边旁有好几档小档正在卖新鲜的水果呢!红红的苹果活力的橙子黄澄澄的香蕉应有尽有我都快流口水了呢!
夏天是植物的季节。在海边旁种着一排榕树高大坚固在夏雨过后显得更加碧绿更加着生气勃勃的气势。空气中弥漫着植物和的清香。
我们几个都说着笑着谈一谈有趣的事情都说夏天天气好阳光明媚空气清新。说着我吸了一大口空气感到神清气爽整个人舒服多了!
成群结队的鸟儿在天空中自由地飞看来它们也非常喜欢夏天这个多变的季节。
这真是个美好的星期六!我们都感到心情开心了。
代码格式规范化篇八
通常java源文件中第一个非注释行是一个package声明,然后是import声明。如下所示。
package ;
import ;
类和接口声明
下表描述了类和接口声明中的一些部分,按照其出现顺序列出:
类和接口说明
说明
class/interface 文档型注释/**
*
*/
class或interface声明
class或interface的实现声明
该段注释中应该包括任何与类和接口有关的,但又不适于放在文档注释区中的注释说明
类静态变量
变量出现的顺序为,首先公共变量,然后protected变量,然后是包package一级的变量,然后是私有变量
变量实例
首先是公共变量,然后protected变量,然后是包package一级的变量,然后是私有变量
构造函数(constructors)
方法
方法应该按照功能而不是范围和可访问性来分类。例如,一个私有的类方法可以在两个公共的instance方法的中间。这样做的目的是提高代码的可读性。
文档的缩进规则
文档中的缩进基本单位是4个空格。tab键应当设置为4个空格键(wsad中的缺省设置)。
代码格式规范化篇九
尊敬的各位领导:
作为xx组件技术部的一名技术主管,我在工作过程中严重失职,在生产限额领料单中添加了错误的铝合金边框代码,造成交付给客户的组件边无法安装,给公司信誉造成了无法挽回的损失。在此我表示深深的歉意并递交这份工作失职检讨书向各位领导做出深刻反省和自查。
由于我的工作岗位关系到整个生产订单所使用的物料正确与否,长期以来对自己放松要求,工作作风涣散,无视公司的审批报告流程,最终导致这次严重的质量事故发生,辜负了领导的信任,也损害了公司的信誉。通过这件事,暴露出我个人存在严重的工作松懈问题,以及工作态度不端正,做事情不严谨等不良工作作风。为杜绝今后再犯同样的错误,以此次检讨为契机,深入审视和纠正自身工作中存在的问题:
首先,我作为部门文件的管理者,对于部门文件的管理不严谨,文件没有固定的存放地点,通常是谁想看文件谁拿去看,看完就随手一扔,每当遇到问题想要翻阅时却找不到文件在哪。本次事故就是一个深刻的教训,由于文件是10月份下发而添加错误边框的订单是xx月的生产订单,在核对物料编码时没有查找相关的工作联系单是导致此次事故的一个重要原因。
其次是认识上的问题,总是认为自己是文件的发放者,而别人才是文件的执行者,通常是一扫而过,只理解了文件的表面内容,而忽略了文件所要传递的重要信息。本次事故中,由于之前阅读文件是草草掠过,导致大脑中只记住了4孔边框和6孔边框均可使用并且不得混用于同一个组件,但是却没有记住4孔边框有两种不同孔距的物料代码,正确的代码应该为m510103,而自己却添加了错误的代码m510xx0。
第三是态度上的问题,由于平时领导对我的工作十分信任,因此自己经常不按照规定的流程开展工作,私自做决定,私自更改物料。如果此次添加物料代码时先向部门领导进行请示,就可以避免错误的物料代码被使用,从而也就不会造成如此严重的后果。
为了杜绝今后再次出现类似的错误,我将从以下几个方面来纠正和预防:
第一,严格落实物料添加的审批流程,在每次添加或者变更物料时,都随限额单附加一份物料变更通知单,如附件一所示。在该通知单中详细写明变更或者添加的物料名称及物料代码,然后交由部门主管审核批准,再交由各相关部门会签后随限额领料单一并下发给相关部门。
第二,在装框工段首末三检卡中增加边框孔数量,孔间距的检验要求,如附件二所示。每日生产前以及每次物料切换时都使用此三检卡对物料进行确认。并在每次生产技术准备文件(工艺联络书-订单生产注意事项)中加入边框孔距示意图,作为装框工段三检卡确认以及巡检、外观检验的检查确认的依据。
第三,规范部门文件的管理,每一份新发放的文件都传阅给相关人员进行阅读并签字,阅读完后统一存档保管,并做好文件目录和收发台账,方便随时查阅。
通过这件事我重新反思了自己做人、做事的态度,感悟到:做人要专注,做事也要专注。做事情不专注,就无法清楚的把握细节,就一定无法把事情做得圆满。从今天起对自己严格要求,严肃自身工作态度,强化自身岗位责任感,克服思想涣散等坏毛病,不能再容忍任何的马虎和“差不多”心里,铭记自身工作的重要性,认真履行自己的岗位职责,以加倍努力的工作来弥补自己所犯的错误。
代码格式规范化篇十
1、eclipse code formatter
2、javaddoc
3、junitgenerator
类的私有成员变量名,不与父类的成员变量重名
方法的参数名/局部变量名,不与类的成员变量重名(getter/setter例外)
下面错误的地方,在编译时都是合法的,但给阅读者带来极大的障碍。
10)ide的默认代码格式模板,能简化绝大部分关于格式规范(如空格,括号)的描述。
2)统一的模板避免不同开发者之间,因为格式不统一,产生代码合并冲突。另外,代码变更日志中因为格式不同引起的变更,也会掩盖了真正的逻辑变更。
3)设定项目组统一的行宽,建议120。
4)设定项目组统一的缩进方式(tab或二空格,四空格均可),基于ide自动转换。
一段代码也是一段文章,需要合理的分段。
不同组的变量之间,不同业务逻辑的代码行之间,插入一个空行,起逻辑分段的作用。
而联系紧密的变量之间、语句之间,则尽量不要插入空行。
对于一些特殊场景(如使用大量的字符串拼接成一段文字,或者想把大量的枚举值排成一列),为了避免ide自动格式化,常常会把注释符号//加在每一行的末尾,这会导致很多无意义的视觉干扰。
可以使用@formatter:off和@formatter:on来包装这段不需要格式化的代码,让ide就会跳过这段的格式化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynjfoih9-1624848159255)(c:\users\86134\appdata\roaming\typora\typora-user-images\)]
代码将被大量后续维护,注释如果对阅读者有帮助,不要吝啬在注释上花费的时间。
除了特别简单特别清晰的类(见规则2,3),每个类都尽量编写注释,说明类的目的和使用方法。
对外提供的公有方法,同样需要清晰的描述,期待的输入,对应的输出,错误的处理和返回码,尽量把可能的异常都一一列明。
在编写注释前,考虑是否可以通过更好的命名,更清晰的代码结构,更好的函数和变量的抽取,让代码不言自明,此时不需要额外的注释。
《clean code》建议,如果没有想说的,不要留着ide自动生成的,空的@param,@return,@throws 标记,让代码更简洁。
反例:方法名为put,加上两个有意义的变量名elephant和fridge,已经说明了这是在干什么,不需要任何额外的注释。
代码后续还会有多人多次维护,让我们相信源码版本控制系统能做得更好。
正确的javadoc格式可以用在很多地方,比如在ide中,查看调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
如果为了html版javadoc的显示,大量使用
<p\>
<pre\>
这样的html标签,以及<
"
这样的html转义字符,对严重影响直接阅读代码时的直观性,而直接阅读代码的几率其实比看html版javadoc大得多。有时候java doc的格式化也要求
<p>
之类的标签来换行,可以配置让ide不进行java doc的自动格式化。清晰描述待修改的事项,保证过几个月后仍然能够清楚要做什么修改。
如果近期会处理的事项,写明处理人。
通过标记扫描,经常清理此类标记,线上故障经常来源于这些标记但未处理的代码。
如果后续会恢复此段代码,在目标代码上方用
///
注释详细说明,而不是简单的注释掉。如果无用,则直接删除(版本管理工具保存了历史代码)。
方法尽量不要超过100行,或其他团队共同商定的行数。
另外,方法长度超过8000个字节码时,将不会被jit编译成二进制码。
反例:一个方法里,前20行代码在进行很复杂的基本价格计算,然后调用一个折扣计算函数,再调用一个赠品计算函数。
此时可将前20行也封装成一个价格计算函数,使整个方法在同一抽象层级上。
超过5行以上重复的代码,都可以考虑抽取公用的方法。
1)如果多个参数同属于一个对象,直接传递对象。
例外: 你不希望依赖整个对象,传播了类之间的依赖性。
2)将多个参数合并为一个新创建的逻辑对象。
例外: 多个参数之间毫无逻辑关联。
3)将函数拆分成多个函数,让每个函数所需的参数减少。
1) 调用频次低的方法。
2) 执行时间开销很大的方法。此情形中,参数校验时间几乎可以忽略不计,但如果因为参数错误导致中间执行回退,或者错误,代价更大。
3) 需要极高稳定性和可用性的方法。
4) 对外提供的开放接口,不管是rpc/http/公共类库的api接口。
如果使用apache validate 或 guava precondition进行校验,并附加错误提示信息时,注意不要每次校验都做一次字符串拼接。
1) 极有可能被循环调用的方法。
2) 底层调用频度比较高的方法。毕竟是像纯净水过滤的最后一道,参数错误不太可能到底层才会暴露问题。
比如,一般dao层与service层都在同一个应用中,所以dao层的参数校验,可以省略。
3) 被声明成private,或其他只会被自己代码所调用的方法,如果能够确定在调用方已经做过检查,或者肯定不会有问题则可省略。
即使忽略检查,也尽量在方法说明里注明参数的要求,比如vjkit中的@notnull,@nullable标识。
assert断言仅用于测试环境调试,无需在生产环境时进行的校验。因为它需要增加-ea启动参数才会被执行。而且校验失败会抛出一个assertionerror(属于error,需要捕获throwable)
因此在生产环境进行的校验,需要使用apache commons lang的validate或guava的precondition。
不强制返回空集合,或者空对象。但需要添加注释充分说明什么情况下会返回null值。
本手册明确
防止npe是调用者的责任
。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回null的情况。jdk8的optional类的使用这里不展开。
如果觉得被外部修改的可能性不大,或没有影响时,不强制在返回前包裹成immutable集合,或进行数组克隆。
因为方法重载的参数类型是根据编译时表面类型匹配的,不根据运行时的实际类型匹配。
只能新增新接口,并对已过时接口加@deprecated注解,并清晰地说明新接口是什么。
接口提供方既然明确是过时接口并提供新接口,那么作为调用方来说,有义务去考证过时方法的新实现是什么。
比如 中的方法decode(string encodestr) 这个方法已经过时,应该使用双参数decode(string source, string encode)。
.*
,sun.*
包下的类,或者底层类库中名称为internal的包下的类,都是不对外暴露的,可随时被改变的不稳定类。比如如果a类只依赖b类的某个属性,在构造函数和方法参数中,只传入该属性。让阅读者知道,a类只依赖了b类的这个属性,而不依赖其他属性,也不会调用b类的任何方法。
类尽量不要超过300行,或其他团队共同商定的行数。
对过大的类进行分拆时,可考虑其内聚性,即类的属性与类的方法的关联程度,如果有些属性没有被大部分的方法使用,其内聚性是低的。
曾经试过合并代码时,因为没加括号,单条语句合并成两条语句后,仍然认为只有单条语句,另一条语句在循环外执行。
其他增加调试语句等情况也经常引起同样错误。
可在ide的save action中配置自动添加。
例外:一般由ide生成的equals()函数
所有if/else/for/while/try的嵌套,当层次过多时,将引起巨大的阅读障碍,因此一般推荐嵌套层次不超过4。
通过抽取方法,或哨兵语句(见rule 2)来减少嵌套。
不使用取反的逻辑,有利于快速理解。且大部分情况,取反逻辑存在对应的正向逻辑写法。
1)在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;
2)在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。
1)不必要的耗时较大的对象构造;
2)不必要的try-catch(除非出错时需要循环下去)。
while语句能在循环开始的时候就看到循环条件,便于帮助理解循环内的代码;
do-while语句要在循环最后才看到循环条件,不利于代码维护,代码逻辑容易出错。
反编译出的字节码文件显示,其实每条用
+
进行字符拼接的语句,都会new出一个stringbuilder对象,然后进行append操作,最后通过tostring方法返回string对象。所以上面两个错误例子,会重复构造stringbuilder,重复tostring()造成资源浪费。如上,
+
实际是stringbuilder,本身会调用对象的tostring(),且能很好的处理null的情况。因为内联不成功,逃逸分析并不能抹除stringbuffer上的同步修饰符
参考bigdecimal的tostring()实现,及vjkit中的stringbuilderholder。
其他包括split等方法,在jdk string中未提供针对字符参数的方法,可考虑使用apache commons stringutils 或guava的splitter。
底层数据结构为数组的集合包括 arraylist,hashmap,hashset,arraydequeue等。
数组有大小限制,当超过容量时,需要进行复制式扩容,新申请一个是原来容量150% or 200%的数组,将原来的内容复制过去,同时浪费了内存与性能。hashmap/hashset的扩容,还需要所有键值对重新落位,消耗更大。
默认构造函数使用默认的数组大小,比如arraylist默认大小为10,hashmap为16。因此建议使用arraylist(int initialcapacity)等构造函数,明确初始化大小。
hashmap/hashset的初始值还要考虑加载因子:
为了降低哈希冲突的概率(key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条需要遍历的entry链),默认当hashmap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是100,即需要设定
100/=134
的数组大小。vjkit的maputil的map创建函数封装了该计算。如果希望加快key查找的时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突的概率。
foreach是语法糖,遍历集合的实际字节码等价于基于iterator的循环。
foreach代码一来代码简洁,二来有效避免了有多个循环或嵌套循环时,因为不小心的复制粘贴,用错了iterator或循环计数器(i,j)的情况。
keyset遍历的方式,增加了n次用key获取value的查询。
1) 以对象做为map的key时;
2) 将对象存入set时。
上述两种情况,都需要使用hashcode和equals比较对象,默认的实现会比较是否同一个对象(对象的引用相等)。
另外,对象放入集合后,会影响hashcode(),equals()结果的属性,将不允许修改。
由于hashmap的干扰,很多人认为concurrenthashmap是可以置入null值。同理,set中的value实际是map中的key。
长生命周期集合包括下面情况,都要小心处理。
1) 静态属性定义;
2) 长生命周期对象的属性;
3) 保存在threadlocal中的集合。
如无法保证集合的大小是有限的,使用合适的缓存方案代替直接使用hashmap。
另外,如果使用weakhashmap保存对象,当对象本身失效时,就不会因为它在集合中存在引用而阻止回收。但jdk的weakhashmap并不支持并发版本,如果需要并发可使用guava cache的实现。
推荐使用
(juc)
工具包中的并发版集合,如concurrenthashmap等,优于使用()系列函数进行同步化封装(等价于在每个方法都加上synchronized关键字)。例外:arraylist所对应的copyonwritearraylist,每次更新时都会复制整个数组,只适合于读多写很少的场景。如果频繁写入,可能退化为使用(list)。
例如:即使用了concurrenthashmap,但直接是用get/put方法,仍然可能会多线程间互相覆盖。
list<string>
并不是list<object>
的子类,如果希望泛型的集合能向上向下兼容转型,而不仅仅适配唯一类,则需定义通配符,可以按需要extends 和 super的字面意义,也可以遵循pecs(producer extends consumer super)
原则:定义成
list
,会被ide提示需要定义泛型。 如果实在无法确定泛型,就仓促定义成list<?>
来蒙混过关的话,该list只能读,不能增改。定义成list<object>
呢,如规则10所述,list<string>
并不是list<object>
的子类,除非函数定义使用了通配符。因此实在无法明确其泛型时,使用
list
也是可以的。enummap,以enum为key的map,内部存储结构为
object[]
,访问时以value = object[()]
获取值,同时具备hashmap的清晰结构与数组的性能。(array),如果array是原始类型数组如int[],会把整个array当作list的一个元素,string[] 或 foo[]则无此问题,安全起见统一不使用。
1)创建单条线程时直接指定线程名称
2) 线程池则使用guava或自行封装的threadfactory,指定命名规则。
构造异常时,需要获得整个调用栈,有一定消耗。
不要用来做流程控制,条件控制,因为异常的处理效率比条件判断低。
发生概率较高的条件,应该先进行检查规避,比如:indexoutofboundsexception,nullpointerexception等,所以如果代码里捕获这些异常通常是个坏味道。
异常信息应包含排查问题时足够的上下文信息。
捕获异常并记录异常日志的地方,同样需要记录没有包含在异常信息中,而排查问题需要的信息,比如捕获处的上下文信息。
尽量使用jdk标准的runtime异常如
illegalargumentexception
,illegalstateexception
,unsupportedoperationexception
,项目定义的exception如serviceexception
。是否定义独立的异常类,关键是调用者会如何处理这个异常,如果没有需要特别的处理,直接抛出runtimeexception也是允许的。
如果无特殊处理逻辑,统一捕获exception统一处理是允许的。
捕获throwable是为了捕获error类异常,包括其实无法处理的
oom
stackoverflow
threaddeath
,以及类加载,反射时可能抛出的nosuchmethoderror
noclassdeffounderror
等。【推荐】多个异常的处理逻辑一致时,使用jdk7的语法避免重复代码**
方便后面的阅读者知道,此处不是漏了处理。
关闭动作必需放在finally块,不能放在try块 或 catch块,这是经典的错误。
更加推荐直接使用jdk7的try-with-resource语法自动关闭closeable的资源,无需在finally块处理,避免潜在问题。
使用门面模式的日志框架,有利于维护各个类的日志处理方式统一。
日志框架在每次打印时,通过主动获得当前线程的stacktrace来获取上述信息的消耗非常大,尽量通过logger名本身给出足够信息。
大量地输出无效日志,不利于系统性能,也不利于快速定位错误点。
记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?
例外:-1,0,1,2,3 不认为是魔法数