版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档名称文档密级1 类、方法和变量缺少注释1.1 【问题描述】变量没有注释:方法没有注释:类没有注释: 文件名:ConfigNetworkService.java起始行:40上下文:public class ConfigNetworkService【问题解读】 变量、方法缺少注释,影响代码走读效率,对java类没有做注释说明,会导致使用该类的人不知道这个类的功能是什么【纠正措施】在变量、方法和类上面添加必要的注释,方便后来维护者维护理解【举一反三】平时开发是严格按照华为java编程规范编码2 代码注释未与上方代码空行隔开2.1 【问题描述】为了提高代码的可读性,跟层次感,注释应该跟上面的代码空
2、一行紧贴下面代码(以DGAlarmService.java为例)/* * 获取油机的原始当前告警列表 * * param dgInfo * return */ public List<OmsAlarm> getOrginalCurAlarms(DGInfo dgInfo) List<String> tempDns = dgInfo.getDgDnList(); List<OmsAlarm> currentAlarmList = getDGAlarmsBySiteDn(dgInfo.getSiteDN(); / 告警分2套,原来的告警可以取到subFdn,新的
3、告警取不到,只有Mocid和InsId if (currentAlarmList != null) return currentAlarmList; 在上面的代码中红色字体中的注释没有跟上面代码中空一行或者跟下面代码空一行,都不符合编码规范。【问题解读】为了提高代码的可读性(减少歧义)跟层次感,代码规范要求注释应该跟上面的代码空一行,紧贴下面代码行。【纠正措施】根据编码规范,该场景的解决方法如下:/* * 获取油机的原始当前告警列表 * * param dgInfo * return */ public List<OmsAlarm> getOrginalCurAlarms(DGIn
4、fo dgInfo) List<String> tempDns = dgInfo.getDgDnList(); List<OmsAlarm> currentAlarmList = getDGAlarmsBySiteDn(dgInfo.getSiteDN(); / 告警分2套,原来的告警可以取到subFdn,新的告警取不到,只有Mocid和InsId if (null != currentAlarmList) return currentAlarmList; 【举一反三】在编码中为了之后的维护,我们要增强代码的可读性我们在编码的过程中应适当加一些注释,提高代码的层次感,以
5、方便维护人员能更好的维护。3 对象判断是否为空,应该把Null放在前面(常量和变量作比较未把常量放在前面)3.1 【问题描述】判断一个对象是否为null时,应该把null放在前面如if(null = XXX),null放后面不符合编码规范(以DGAlarmService.java为例)/* * 获取油机的原始当前告警列表 * * param dgInfo * return */ public List<OmsAlarm> getOrginalCurAlarms(DGInfo dgInfo) List<String> tempDns = dgInfo.getDgDnLis
6、t(); List<OmsAlarm> currentAlarmList = getDGAlarmsBySiteDn(dgInfo.getSiteDN(); / 告警分2套,原来的告警可以取到subFdn,新的告警取不到,只有Mocid和InsId if (currentAlarmList != null) String subFdn = null; String mocId = null; String insId = null; for (Iterator<OmsAlarm> it = currentAlarmList.iterator(); it.hasNext(
7、);) Properties userData = it.next().getUserData(); subFdn = userData.getProperty(FmDataPropertyDefine.PROP_SUB_FDN); if (subFdn = null | subFdn.isEmpty() mocId = userData.getProperty(FmDataPropertyDefine.PROP_MOC_ID); insId = userData.getProperty(FmDataPropertyDefine.PROP_INS_ID); if (!tempDns.conta
8、ins(mocId + "_" + insId) it.remove(); else if (!tempDns.contains(subFdn) it.remove(); return currentAlarmList; 在上面的代码中红色字体中的空判断虽然不会对系统跟逻辑产生影响但不符合编码规范。【问题解读】为了防止程序报空指针异常,对象为null的比较经常会用到,按照编码规范来可以养成良好的习惯,减少程序异常率。【纠正措施】根据编码规范,该场景的解决方法如下:/* * 获取油机的原始当前告警列表 * * param dgInfo * return */ public L
9、ist<OmsAlarm> getOrginalCurAlarms(DGInfo dgInfo) List<String> tempDns = dgInfo.getDgDnList(); List<OmsAlarm> currentAlarmList = getDGAlarmsBySiteDn(dgInfo.getSiteDN(); / 告警分2套,原来的告警可以取到subFdn,新的告警取不到,只有Mocid和InsId if (null != currentAlarmList) String subFdn = null; String mocId = n
10、ull; String insId = null; for (Iterator<OmsAlarm> it = currentAlarmList.iterator(); it.hasNext();) Properties userData = it.next().getUserData(); subFdn = userData.getProperty(FmDataPropertyDefine.PROP_SUB_FDN); if (null = subFdn | subFdn.isEmpty() mocId = userData.getProperty(FmDataPropertyDe
11、fine.PROP_MOC_ID); insId = userData.getProperty(FmDataPropertyDefine.PROP_INS_ID); if (!tempDns.contains(mocId + "_" + insId) it.remove(); else if (!tempDns.contains(subFdn) it.remove(); return currentAlarmList; 【举一反三】在编码中我们要防止null对象的引用,防止因抛空指针程序无法正常运行,所以对Null的判断要按照编码规范来,比方对二个对象进行equals比较,
12、就应该把有可能为Null的放在equals里面,把不可能为null的放equals前面。对null进行 = 比较时,把null放在前面在阅读代码时也能让一眼就看出做了Null 判断4 代码包含很多 Tab 键4.1 【问题描述】【问题解读】程序块缩进风格不规范,采用的是 Tab 键缩进方式,违反规则程序块要采用缩进风格编写,缩进的空格数为4个,不允许使用TAB缩进【纠正措施】导入项目组通用的代码格式模板样式【举一反三】导入项目组通用的代码格式模板样式5 重复代码5.1 【问题描述】【问题解读】 重复代码,影响系统运行效率【纠正措施】把重复代码重构为公共方法调用【举一反三】 平时编码严格按照华为
13、java编程规范编写,重复代码可以重构公共方法6 “”未换行,出现 100 多次6.1 【问题描述】【问题解读】 违法规则分界符(如大括号)【纠正措施】 应各独占一行【举一反三】 平时编码严格按照华为java编程规范编写7 注释有误/方法命名不规范7.1 【问题描述】【问题解读】 违反华为的Java编码规范。错误的注释对不了解系统的员工产生误导。降低工作交接、定位解决问题的效率。【纠正措施】 在代码调整后,应该同步更新相关注释。【举一反三】 方法的注释应一句话介绍方法的功能及使用场景。还应介绍输入参数条件限制条件,出差参数的含义等。8 对象、字符串强转之前没有非空判断8.1 【问题描述】对一个
14、对象、字符串进行强制转换时,必须要先做类型、非空判断(包含空字符)。若未做校验,可能直接导致功能不可用。(QueryRemoteHAStatusTask.java) Override public int getTimeout() String stringtimeout=getConfigName("timeout"); if (null != stringtimeout) int timeout = Integer.valueOf(stringtimeout); LOGGER.info("timeout valure is: " + timeout)
15、; return timeout; else return 600000; 在上面的代码中红色字体中的方法有可能会返回空字符串,而黄色字体处未对空字符串添加判断就进行类型强制转换,会报异常。【问题解读】为了防止程序报类型转换异常,在对对象、字符串进行强制转换时,添加必要的判断是必须的,否则会导致功能失效。【纠正措施】此处正确的判断应该为(添加代码中加粗代码的判断): Override public int getTimeout() String stringtimeout=getConfigName("timeout"); if (null != stringtimeout
16、 && !"".equals(stringtimeout) int timeout = Integer.valueOf(stringtimeout); LOGGER.info("timeout valure is: " + timeout); return timeout; else return 600000; 【举一反三】在编码中经常会用到强制转换,如果必要的校验没有处理的话,会导致异常,从而可能功能不可用的现象。如对象的强转,那么我们在强转之前必须添加:if (name instanceof type) 类似的判断,若是字符串的强转
17、,就必须添加:if (null != string && !"".equals(string)判断。9 对校验的充分考虑能提高代码的可读性9.1 【问题描述】为了提高代码的可读性,不应该添加没必要的判断以及必要的校验需要充分考虑添加或者去除:(RpcQueryHAStatus.java) public static String getConfigName(String configName) String path = getOSSPath() + File.separator + "engr" + File.separator + &
18、quot;engineering" + File.separator + "ha_review" + File.separator + "change_timeout.conf" File file = new File(path); FileInputStream fis = null; String configValues = "" try fis = new FileInputStream(file); catch (FileNotFoundException e) LOGGER.error("getCon
19、figName exception: " + e.getMessage(); InputStreamReader read = new InputStreamReader(fis); BufferedReader br = new BufferedReader(read); String line = "" StringBuffer sb = new StringBuffer(); try while (true) line = br.readLine(); if(null = line) break; if(line.indexOf(configName) !=
20、 -1) sb.append(line); catch (IOException e) LOGGER.error("getConfigName exception: " + e.getMessage(); if (null != sb.toString() String str = sb.toString().split("="); configValues = str1.trim(); LOGGER.info("getConfigName success: the key " + configName +" value i
21、s :" + configValues); else LOGGER.error("getConfigName error: the file: " + path +" doesn't have the key :" + configName); try if (null != br) br.close(); if (null != read) read.close(); if (null != fis) fis.close(); catch (IOException e) LOGGER.error("getConfigName
22、 exception: " + e.getMessage(); return configValues; 在上面的代码中红色字体中代码StringBuffer 在声明的时候已经new了一个对象,后面的null判断永远为true(null != sb.toString() ),且在判断里对数组直接使用:configValues = str1.trim(),如果数组的大小不大于等于2的话会报数组越界。【问题解读】为提高代码的可读性,非必要的判断应该去掉,以及对数组大小的校验需要添加。【纠正措施】 public static String getConfigName(String conf
23、igName) String path = getOSSPath() + File.separator + "engr" + File.separator + "engineering" + File.separator + "ha_review" + File.separator + "change_timeout.conf" File file = new File(path); FileInputStream fis = null; String configValues = "" try
24、 fis = new FileInputStream(file); catch (FileNotFoundException e) LOGGER.error("getConfigName exception: " + e.getMessage(); InputStreamReader read = new InputStreamReader(fis); BufferedReader br = new BufferedReader(read); String line = "" StringBuffer sb = new StringBuffer(); t
25、ry while (true) line = br.readLine(); if(null = line) break; if(line.indexOf(configName) != -1) sb.append(line); catch (IOException e) LOGGER.error("getConfigName exception: " + e.getMessage(); String str = sb.toString().split("="); if (str.length >= 2) configValues = str1.tri
26、m(); LOGGER.info("getConfigName success: the key " + configName +" value is :" + configValues); else LOGGER.error("getConfigName error: the file: " + path +" doesn't have the key :" + configName); try if (null != br) br.close(); if (null != read) read.clos
27、e(); if (null != fis) fis.close(); catch (IOException e) LOGGER.error("getConfigName exception: " + e.getMessage(); return configValues; 【举一反三】在编码中对于非必要的校验以及必要的校验需要充分考虑到,只有充分考虑了这些情况,写出来的代码的可读性才可能直观,后续维护也更容易。10 校验的顺序以及变量的抽取能有效的提高性能10.1 【问题描述】校验的顺序能够有效的提高性能以及内存的使用,局部变量的抽取能有效的提高效率。(ParseResul
28、tXmlTask.java)private static void parseDesc(final String lang, final Element desc, final ErrorInfo errorInfo, final List<CheckItem> checkItemList) throws DataConversionException final String type = desc.getAttributeValue("type"); if (null= lang | HAStatusUtil.isEmpty(type) return; fi
29、nal CheckItem checkItem = new CheckItem(); checkItem.setCheckSubItemList(new ArrayList<CheckSubItem>(); checkItem.setItemType(type); final List<Element> scriptList = desc.getChildren("SCRIPT"); if (HAStatusUtil.isEmpty(scriptList) return; for (final Element script : scriptList)
30、 final int id = script.getChild("ID").getAttribute("name").getIntValue(); final int result = script.getChild("RESULT").getAttribute("name").getIntValue(); final String enName = script.getChild("check_item_en").getAttribute("name").getValue(
31、); final String cnName = script.getChild("check_item_cn").getAttribute("name").getValue(); final String alarmLevel = script.getChild("alarm_level").getAttribute("name").getValue(); final String enDesc = script.getChild("desc_en").getAttribute("n
32、ame").getValue(); final String cnDesc = script.getChild("desc_cn").getAttribute("name").getValue(); final CheckSubItem checkSubItem = new CheckSubItem(); checkSubItem.setSubItemID(id); checkSubItem.setSubItemType("zh_CN".equals(lang) ? cnName : enName); checkSubIte
33、m.setAlarmLevel(HAStatusUtil.getAlarmLevel(alarmLevel); checkSubItem.getErrorInfo().setErrorCode(result); checkSubItem.getErrorInfo().setErrorMsg("zh_CN".equals(lang) ? cnDesc : enDesc); if (HAStatusConstant.ErrorCode.NOT_SUPPORT = result) continue; / 设置检查大项的值 if (HAStatusConstant.SUCCESS
34、!= result) checkItem.getErrorInfo().setErrorCode(result); if (HAStatusUtil.getAlarmLevel(alarmLevel) > checkItem.getAlarmLevel() checkItem.setAlarmLevel(HAStatusUtil.getAlarmLevel(alarmLevel); checkItem.getCheckSubItemList().add(checkSubItem); if (!HAStatusUtil.isEmpty(checkItem.getCheckSubItemLi
35、st() checkItemList.add(checkItem); 在上面的代码中标红的判断位置不对,可能会导致内存消耗过大;标红加粗代码,数据量大的时候可能会导致效率低,性能存在问题。【问题解读】在编码过程中,所需的校验应该在方法(循环)的入口,这样可以避免不必要的内存开销,而局部变量的抽取,多次使用的值,抽取成局部变量,对性能是有很大的提高的,不需要每次使用都需要去取值。【纠正措施】校验放在方法(循环)入口,多次使用的值,抽取成局部变量: SuppressWarnings("unchecked") private static void parseDesc(final
36、 String lang, final Element desc, final ErrorInfo errorInfo, final List<CheckItem> checkItemList) throws DataConversionException final String type = desc.getAttributeValue("type"); if (null= lang | HAStatusUtil.isEmpty(type) return; final CheckItem checkItem = new CheckItem(); checkI
37、tem.setCheckSubItemList(new ArrayList<CheckSubItem>(); checkItem.setItemType(type); final List<Element> scriptList = desc.getChildren("SCRIPT"); if (HAStatusUtil.isEmpty(scriptList) return; int tempAlarmLevel = 0; for (final Element script : scriptList) final int result = scrip
38、t.getChild("RESULT").getAttribute("name").getIntValue(); if (HAStatusConstant.ErrorCode.NOT_SUPPORT = result) continue; final int id = script.getChild("ID").getAttribute("name").getIntValue(); final String enName = script.getChild("check_item_en").ge
39、tAttribute("name").getValue(); final String cnName = script.getChild("check_item_cn").getAttribute("name").getValue(); final String alarmLevel = script.getChild("alarm_level").getAttribute("name").getValue(); final String enDesc = script.getChild(&qu
40、ot;desc_en").getAttribute("name").getValue(); final String cnDesc = script.getChild("desc_cn").getAttribute("name").getValue(); final CheckSubItem checkSubItem = new CheckSubItem(); checkSubItem.setSubItemID(id); checkSubItem.setSubItemType("zh_CN".equals
41、(lang) ? cnName : enName); tempAlarmLevel = HAStatusUtil.getAlarmLevel(alarmLevel); checkSubItem.setAlarmLevel(tempAlarmLevel); checkSubItem.getErrorInfo().setErrorCode(result); checkSubItem.getErrorInfo().setErrorMsg("zh_CN".equals(lang) ? cnDesc : enDesc); / 设置检查大项的值 if (HAStatusConstant
42、.SUCCESS != result) checkItem.getErrorInfo().setErrorCode(result); if (tempAlarmLevel > checkItem.getAlarmLevel() checkItem.setAlarmLevel(tempAlarmLevel); checkItem.getCheckSubItemList().add(checkSubItem); if (!HAStatusUtil.isEmpty(checkItem.getCheckSubItemList() checkItemList.add(checkItem); 【举一
43、反三】在编码中对于校验的位置,我们是尽可能的减少开销,提高效率,校验一般都放在入口,而校验顺序一般是:权限校验 -参数合法性校验 - 需求特定的条件性校验。11 固定值字符串需要定义成静态常量11.1 【问题描述】为了提高代码的可读性,一些特殊的固定值的字符串要定义成静态常量,并且准确命名常量,方便维护的时候理解和阅读。(以BatchUpgradeNeByModbusExecutor.java为例)if ("WHOLE_VERSION".equals(neVersionPackage.getReleaseType() / 标识升级包 releaseType = "
44、0xE0"else / 标识补丁包 releaseType = "0xE1"在上面的代码中红色字体中的字符串应该用静态常量表示【问题解读】为了提高代码的可阅读性,以及方便后面的代码维护修改,应该将固定值的字符串定义成静态常量。【纠正措施】根据编码规范,该场景的解决方法如下:public static final String RELEANSE_TYPE_WHOLE_VERSION = "WHOLE_VERSION"public static final String RELEANSE_TYPE_UPGRADE_CODE = "0xE0"public static final String RELEANSE_TYPE_PATCH_CODE = "0xE1"if(RELEANSE_TYPE_WHOLE_VERSION.equals(neVersionPackage.getReleaseType() / 标识升级包 releaseType = RELEANSE_TYPE_UPGRADE_CODE;else / 标识补丁包 releaseType = RELEANSE_TYPE_PATCH_CODE;【举一反三】在编码中为了之后的维护,我们要增强代码的可读性我们在编码的过程中应适当加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论