代码格式的重要性

代码格式的重要性

        在软件开发过程中,我们经常会做审阅代码,重构代码,在这个过程中,常常会接触他其他开发同事的代码,有些优秀的代码让人赏心悦目,有些恶心的代码,则让你恶心不已。一个好的代码,可以让后面的开发者,带来阅读上的极大便利,如果该模块一旦需要重构,那么优秀的代码会提高不少开发效率。所以养成一个好的开发习惯,于你于我都是一个非常棒的事情,开发者的基本技能之一。
先放一段我们公司内部的代码作为一个实例,如下:
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






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值