代码格式的重要性
Posted 骆宏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码格式的重要性相关的知识,希望对你有一定的参考价值。
代码格式的重要性
在软件开发过程中,我们经常会做审阅代码,重构代码,在这个过程中,常常会接触他其他开发同事的代码,有些优秀的代码让人赏心悦目,有些恶心的代码,则让你恶心不已。一个好的代码,可以让后面的开发者,带来阅读上的极大便利,如果该模块一旦需要重构,那么优秀的代码会提高不少开发效率。所以养成一个好的开发习惯,于你于我都是一个非常棒的事情,开发者的基本技能之一。
先放一段我们公司内部的代码作为一个实例,如下:
getAddrData : function(){ var rowJsonStr=new StringBuffer(); rowJsonStr.append("["); $("#addrDiv").find("li").each(function(){ var partyId = $("input[name=id]").val(); var id = $(this).attr("id"); var coRid = $(this).attr("coRid"); var coName = $(this).attr("coName"); var prRid = $(this).attr("prRid"); var prName = $(this).attr("prName"); var ciRid = $(this).attr("ciRid"); var ciName = $(this).attr("ciName"); var arRid = $(this).attr("arRid"); var arName = $(this).attr("arName"); var addr = $(this).attr("addr"); var zipcode = $(this).attr("zipcode"); var isDefault = $(this).attr("isDefault"); var name = $(this).attr("name"); var title = $(this).attr("title"); var mobile = $(this).attr("mobile"); var position = $(this).attr("position"); var fax = $(this).attr("fax"); var email = $(this).attr("email"); var im = $(this).attr("im"); var createBy = $(this).attr("createBy"); var createTime = $(this).attr("createTime"); var updateBy = $(this).attr("updateBy"); var updateTime = $(this).attr("updateTime"); rowJsonStr.append("{"); rowJsonStr.append("'id':'").append(id).append("',"); rowJsonStr.append("'isDefault':'").append(isDefault).append("',"); rowJsonStr.append("'types':'").append("contact").append("',"); rowJsonStr.append("'partyId':'").append(partyId).append("',"); rowJsonStr.append("'isSnapshot':'").append("n").append("',"); rowJsonStr.append("'coRid':'").append(coRid).append("',"); rowJsonStr.append("'coName':'").append(coName).append("',"); rowJsonStr.append("'prRid':'").append(prRid).append("',"); rowJsonStr.append("'prName':'").append(prName).append("',"); rowJsonStr.append("'ciRid':'").append(ciRid).append("',"); rowJsonStr.append("'ciName':'").append(ciName).append("',"); rowJsonStr.append("'arRid':'").append(arRid).append("',"); rowJsonStr.append("'arName':'").append(arName).append("',"); rowJsonStr.append("'addr':'").append(addr).append("',"); rowJsonStr.append("'zipcode':'").append(zipcode).append("',"); rowJsonStr.append("'name':'").append(name).append("',"); rowJsonStr.append("'title':'").append(title).append("',"); rowJsonStr.append("'mobile':'").append(mobile).append("',"); rowJsonStr.append("'position':'").append(position).append("',"); rowJsonStr.append("'fax':'").append(fax).append("',"); rowJsonStr.append("'email':'").append(email).append("',"); rowJsonStr.append("'im':'").append(im).append("',"); // rowJsonStr.append("'createBy':'").append(createBy).append("',"); // rowJsonStr.append("'createTime':'").append(createTime).append("',"); // rowJsonStr.append("'updateBy':'").append(updateBy).append("',"); // rowJsonStr.append("'updateTime':'").append(updateTime).append("',"); rowJsonStr.append("},"); }); //移除多余逗号 var str=""+ rowJsonStr; if(rowJsonStr.length>1){ rowJsonStr=rowJsonStr.substring(0, rowJsonStr.length-1); } str=str+"]"; return str; }
从上面的代码中,我们可以发现,代码存在一些非常的明显的问题。具体问题如下:
getAddrData : function(){ var rowJsonStr=new StringBuffer(); //缩进不对,=没有加入合适的空格 rowJsonStr.append("["); $("#addrDiv").find("li").each(function(){ var partyId = $("input[name=id]").val(); //缩进不对 var id = $(this).attr("id"); var coRid = $(this).attr("coRid"); var coName = $(this).attr("coName"); var prRid = $(this).attr("prRid"); var prName = $(this).attr("prName"); var ciRid = $(this).attr("ciRid"); var ciName = $(this).attr("ciName"); var arRid = $(this).attr("arRid"); var arName = $(this).attr("arName"); var addr = $(this).attr("addr"); var zipcode = $(this).attr("zipcode"); var isDefault = $(this).attr("isDefault"); //此处不应该分行 var name = $(this).attr("name"); var title = $(this).attr("title"); var mobile = $(this).attr("mobile"); var position = $(this).attr("position"); var fax = $(this).attr("fax"); var email = $(this).attr("email"); var im = $(this).attr("im"); var createBy = $(this).attr("createBy"); var createTime = $(this).attr("createTime"); var updateBy = $(this).attr("updateBy"); var updateTime = $(this).attr("updateTime"); rowJsonStr.append("{"); //使用拼接字符串的方式来构造json,麻烦,容易出错,代码复杂度高 rowJsonStr.append("'id':'").append(id).append("',"); rowJsonStr.append("'isDefault':'").append(isDefault).append("',"); rowJsonStr.append("'types':'").append("contact").append("',"); rowJsonStr.append("'partyId':'").append(partyId).append("',"); rowJsonStr.append("'isSnapshot':'").append("n").append("',"); rowJsonStr.append("'coRid':'").append(coRid).append("',"); //缩进不对 rowJsonStr.append("'coName':'").append(coName).append("',"); rowJsonStr.append("'prRid':'").append(prRid).append("',"); rowJsonStr.append("'prName':'").append(prName).append("',"); rowJsonStr.append("'ciRid':'").append(ciRid).append("',"); rowJsonStr.append("'ciName':'").append(ciName).append("',"); rowJsonStr.append("'arRid':'").append(arRid).append("',"); rowJsonStr.append("'arName':'").append(arName).append("',"); rowJsonStr.append("'addr':'").append(addr).append("',"); rowJsonStr.append("'zipcode':'").append(zipcode).append("',"); rowJsonStr.append("'name':'").append(name).append("',"); rowJsonStr.append("'title':'").append(title).append("',"); rowJsonStr.append("'mobile':'").append(mobile).append("',"); rowJsonStr.append("'position':'").append(position).append("',"); rowJsonStr.append("'fax':'").append(fax).append("',"); rowJsonStr.append("'email':'").append(email).append("',"); rowJsonStr.append("'im':'").append(im).append("',"); // rowJsonStr.append("'createBy':'").append(createBy).append("',"); //这部分代码应该删除 // rowJsonStr.append("'createTime':'").append(createTime).append("',"); // rowJsonStr.append("'updateBy':'").append(updateBy).append("',"); // rowJsonStr.append("'updateTime':'").append(updateTime).append("',"); rowJsonStr.append("},"); }); //移除多余逗号 var str=""+ rowJsonStr; //应该调用rowJsonStr.toString()方法 if(rowJsonStr.length>1){ rowJsonStr=rowJsonStr.substring(0, rowJsonStr.length-1); } //缩进不对 str=str+"]"; return str; },
我们通过优化代码,将代码整理为如下格式:
getAddrData : function(){ var addrs = []; $("#addrDiv").find("li").each(function(){ var addr = { partyId: $("input[name=id]").val(), id: $(this).attr("id"), coRid: $(this).attr("coRid"), coName: $(this).attr("coName"), prRid: $(this).attr("prRid"), prName: $(this).attr("prName"), ciRid: $(this).attr("ciRid"), ciName: $(this).attr("ciName"), arRid: $(this).attr("arRid"), arName: $(this).attr("arName"), addr: $(this).attr("addr"), zipcode: $(this).attr("zipcode"), isDefault: $(this).attr("isDefault"), name: $(this).attr("name"), title: $(this).attr("title"), mobile: $(this).attr("mobile"), position: $(this).attr("position"), fax: $(this).attr("fax"), email: $(this).attr("email"), im: $(this).attr("im"), createBy: $(this).attr("createBy"), createTime: $(this).attr("createTime"), updateBy: $(this).attr("updateBy"), updateTime: $(this).attr("updateTime") }; addrs.push(addr); }); return JSON.stringify(addrs); },
我们通过对比,可以发现,代码从原来68行变成了现在的32行,整整变少了34行,并且这里面使用了更加面向对象的方式来写代码,让代码也更加的通俗易懂,为后期重构的人员,提供了一个较好的代码格式。
如何养成一个优秀的代码风格?1看2写3重构
1.看
每一个开发者,都会有自己的开发风格,从正确与否而言,并无对错之分,但是从代码的可读性而言,还是有些差别的。在这里面,并没有一个统一的标准,所以这个开发风格,需要我们不断的写代码、重构代码、写代码的过程中去总结,去提高。但是,为了不让自己的代码,变得那个的特立独行,在写代码的过程中,我们应该多参考一些开源项目的代码风格。比如开发java时,参考下java源码的风格,spring的风格;开发javascript时,参考下jQuery的风格,jqGrid的风格等。通过查看一些开源代码,我们可以借鉴里面的风格,从而让自己的代码风格更加的具备通用性(与他人的代码风格一致)、可读性。
2.写
代码就像是打篮球,你整天的趴在床上看NBA,哪怕你看了再多,篮球技术也不会提高。写代码也是同样的道理,一直看开源代码,却不动手去写,哪怕看完了spring的全部源码,也难以形成属于自己的开发风格。
3.重构
重构代码,实际上结合了1看2写,并且读写在同时的进行中。在重构的过程中,我们可以看到别人写的代码,或者是自己前一段时间写的代码,好的可以借鉴过来,不好的,自己可以通过重构的方式,将代码不断的优化,这个过程可以让我们组织代码,使用ide或者文本编辑的技术能加的熟练,所以重构对于提高代码的水平非常有帮助。
笔者的java开发风格(做一个简单的示范,有不足支持的,多多指出)
- 类,变量命,方法等命名:驼峰法,比如:studentId,prodType,studentName
- 赋值语句:String str = ""; //不使用String str=""; String str =""; String= "";
- for循环:for(int i=0; i<10; i++){} //每个;后面加入空格,
- if,while,for都加入{},哪怕只有一条指令
- 所有代码缩进使用四个空格
- 接口统一加入注释
- 类需要加注入
- 接口需要注释
- 方法与方法之间要加入分行,由于笔者开发经验有限,所以下面给出一个笔者的代码,大家可以参考下,不好的多多指出
- 开发的路上没有捷径,需要养好一个好的开发习惯也不易,但是作为开发者,我们必须迎难而上。
下面是笔者的开发风格写的一个java类
/** * 对象功能:合同 领域对象实体 * 开发公司:广州九天软件有限公司 * 开发人员:骆宏 * 创建时间:2016-03-03 12:07:09 */ @SuppressWarnings("serial") @Service @Scope("prototype") public class ContractEntity extends AbstractDomain<String, ContractEntityPo>{ @Resource private ContractEntityDao contractEntityDao; @Resource private ContractAttachDao contractAttachDao; @Resource private ContractAttachQueryDao contractAttachQueryDao; @Resource private ContractTeamDao contractTeamDao; @Resource private ContractTeamQueryDao contractTeamQueryDao; @Resource private ContractSkuDao contractSkuDao; @Resource private ContractSkuQueryDao contractSkuQueryDao; @Resource private IProdSkuService skuService; @Resource private IProdEntityService prodService; @Resource private CustomerService customerService; @Resource private IEmployeeService employeeService; @Resource private IOrganizationService organizationService; @Resource private EavService eavService; protected void init(){ setDao(contractEntityDao); } //创建合同 @Override public void create() { super.create(); createContractSkus(false); createContractTeams(false); createContractAttachs(false); saveEav(); } //更新合同 @Override public void update() { super.update(); createContractSkus(true); createContractTeams(true); createContractAttachs(true); saveEav(); } /** * 加载合同关联的sku,团队,文件,以及日志 * void * @exception * @since 1.0.0 */ public void loadCascade(){ List<ContractAttachPo> attachPos = contractAttachQueryDao.findByContractEntityId(getId()); List<ContractTeamPo> teamPos = contractTeamQueryDao.findByContractEntityId(getId()); List<ContractSkuPo> skuPos = contractSkuQueryDao.findByContractEntityId(getId()); if(skuPos != null && !skuPos.isEmpty()){ for(ContractSkuPo skuPo: skuPos){ ProdSkuVo skuVo = skuService.getSkuVo(skuPo.getSkuId()); if(skuVo != null){ skuPo.setProdId(skuVo.getProdId()); skuPo.setSkuCode(skuVo.getSkuCode()); skuPo.setProdCode(skuVo.getProdCode()); skuPo.setProdName(skuVo.getProdName()); skuPo.setImgUrl(skuVo.getImgUrl()); skuPo.setUnit(skuVo.getUnit()); } } } if(teamPos != null && !teamPos.isEmpty()){ for(ContractTeamPo teamPo: teamPos){ EmployeePo employee = employeeService.get(teamPo.getEmployeeId()); if(employee != null){ teamPo.setEmployeeName(employee.getUserPo().getAccount()); teamPo.setEmployeeUserName(employee.getPartyPo().getName()); } } } CsEntityPo customer = customerService.get(getData().getCsId()); if(customer != null){ getData().setCsName(customer.getPartyPo().getName()); } if(StringUtils.isNotBlank(getData().getEmployeeId())){ EmployeePo employee = employeeService.get(getData().getEmployeeId()); if(employee != null){ getData().setEmployeeName(employee.getPartyPo().getName()); } } if(StringUtils.isNotBlank(getData().getMySigner())){ EmployeePo employeePo = employeeService.get(getData().getMySigner()); if(employeePo != null && employeePo.getPartyPo() != null){ getData().setMySignerName(employeePo.getPartyPo().getName()); } } if(StringUtils.isNotBlank(getData().getOrgId())){ PartyPo partyPo = organizationService.get(getData().getOrgId()); if(partyPo != null){ getData().setOrgName(partyPo.getName()); } } getData().addContractAttachPos(attachPos); getData().addContractSkuPos(skuPos); getData().addContractTeamPos(teamPos); loadEav(); } @Override public void delete() { this.delete(getId()); } private void publishDeleteEvent(){ EntityDeleteEvent contractEntityDeleteEvent=new EntityDeleteEvent(this); contractEntityDeleteEvent.addTaskEventVo(new TaskEventVo(TaskType.jt_contract_entity,getId())); SpringHelper.publishEvent(contractEntityDeleteEvent); } @Override public void delete(String id_) { contractTeamDao.deleteByContractEntityId(id_); contractAttachDao.deleteByContractEntityId(id_); contractSkuDao.deleteByContractEntityId(id_); eavService.deleteByEntityId(id_); super.delete(id_); publishDeleteEvent(); } @Override public void deleteByIds(List<String> ids_) { if(ids_ != null && !ids_.isEmpty()){ for(String id: ids_){ delete(id); } } } //创建合同关联团队 private void createContractTeams(boolean isDeleteOldData) { if(isDeleteOldData){ contractTeamDao.deleteByContractEntityId(getId()); } if(getData().getContractTeamPos() != null && !getData().getContractTeamPos().isEmpty()){ for(ContractTeamPo teamPo: getData().getContractTeamPos()){ teamPo.setId(getIdGenerator().genUuid()); teamPo.setCid(getId()); contractTeamDao.create(teamPo); } } } //创建合同关联附件 private void createContractAttachs(boolean isDeleteOldData) { if(isDeleteOldData){ contractAttachDao.deleteByContractEntityId(getId()); } if(getData().getContractAttachPos() != null && !getData().getContractAttachPos().isEmpty()){ for(ContractAttachPo attachPo: getData().getContractAttachPos()){ attachPo.setId(getIdGenerator().genUuid()); attachPo.setCid(getId()); contractAttachDao.create(attachPo); } } } //创建合同关联商品sku private void createContractSkus(boolean isDeleteOldData) { if(isDeleteOldData){ contractSkuDao.deleteByContractEntityId(getId()); } if(getData().getContractSkuPos() != null && !getData().getContractSkuPos().isEmpty()){ for(ContractSkuPo skuPo: getData().getContractSkuPos()){ skuPo.setCid(getId()); skuPo.setId(getIdGenerator().genUuid()); contractSkuDao.create(skuPo); } } } //保存eav的扩展资料 private void saveEav() { if(getData().getEavUpdateVo() != null){ List<BaseBizTypeEavUpdateVo> bizTypeEavUpdateVoList = getData().getEavUpdateVo().getBizTypeUpdateVoList(); if(bizTypeEavUpdateVoList != null && bizTypeEavUpdateVoList.size() > 0){ for(BaseBizTypeEavUpdateVo baseBizTypeEavUpdateVo: bizTypeEavUpdateVoList){ baseBizTypeEavUpdateVo.setEntityId(getId()); //设置关联实体id } } eavService.save(getData().getEavUpdateVo()); } } //获取该实体的eav属性 private void loadEav(){ Map<String, String> eavKeySetMap = new HashMap<String, String>(); eavKeySetMap.put(BizType.common.name(), eavService.findEavSetKeyByEntityId(BizType.common.name(), getId())); getData().setEavKeyMap(eavKeySetMap); } }
附录:
参考书籍:代码带全,代码重构,Effective Java
以上是关于代码格式的重要性的主要内容,如果未能解决你的问题,请参考以下文章