您的位置:首页 > 编程语言

代码格式的重要性

2016-05-17 20:22 393 查看

代码格式的重要性

        在软件开发过程中,我们经常会做审阅代码,重构代码,在这个过程中,常常会接触他其他开发同事的代码,有些优秀的代码让人赏心悦目,有些恶心的代码,则让你恶心不已。一个好的代码,可以让后面的开发者,带来阅读上的极大便利,如果该模块一旦需要重构,那么优秀的代码会提高不少开发效率。所以养成一个好的开发习惯,于你于我都是一个非常棒的事情,开发者的基本技能之一。
先放一段我们公司内部的代码作为一个实例,如下:
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象