在软件开发过程中经常遇到这样的一件事就是,昨天写的代码今天就读不懂了.这很大的一个原因就是代码没有写注释和代码太长和逻辑很乱.前几天我看一项目中一个同事写的代码....
public String getSql(final String code, final String name, final String type) {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer("select count(labo.id) from CntCodeValueBO cnt, MdProcLabelBO labo where ");
if (type != null) {
if (type.equals("")) {
sb.append(" labo.typeId like '%" + type + "%' ");
} else {
sb.append(" labo.typeId = '" + type + "' ");
}
if (code != null) {
sb.append(" and labo.code like '%" + code + "%'");
}
if (name != null) {
sb.append(" and labo.name like '%" + name + "%'");
}
sb.append("and cnt.codeTypeId=21 and labo.typeId=cnt.key order by labo.id ");
} else {
if (code != null) {
sb.append(" labo.code like '%" + code + "%'");
if (name != null) {
sb.append(" and labo.name like '%" + name + "%'");
}
sb.append("and cnt.codeTypeId=21 and labo.typeId=cnt.key ");
} else {
if (name != null) {
sb.append(" labo.name like '%" + name + "%'");
sb.append("and cnt.codeTypeId=21 and labo.typeId=cnt.key order by labo.id ");
} else {
sb.append(" cnt.codeTypeId=21 and labo.typeId=cnt.key ");
}
}
}
return sb.toString();
}
是不是很惊叹一个方法中有7个IF 4个 ELSE 逻辑是不是很乱.不易读吧,据重构:改善既有代码的设计一书的思想:可用方法代替IF重构代码为:
public String getSql(final String code, final String name, final String type){
StringBuffer sql = new StringBuffer("select count(labo.id) from CntCodeValueBO cnt, MdProcLabelBO labo where ");
sql.append(checkType(type)+checkCode(code)+checkName(name)+" order by labo.id ");
return sql.toString();
}
public String codeNoNull(String code){
return "and labo.code like '%" + code + "%' ";
}
public String nameNoNull(String name){
return " and labo.name like '%" + name + "%' ";
}
public String typeNoNullAndValue(String type){
return " cnt.codeTypeId=21 and labo.typeId=cnt.key labo.typeId like '%" + type + "%' ";
}
public String typeNoNullNoValue(String type){
return " cnt.codeTypeId=21 and labo.typeId=cnt.key labo.typeId = '" + type + "' ";
}
public String checkType(final String type){
if(type != null && type.equals(""))return typeNoNullNoValue(type);
if(type != null) return typeNoNullAndValue(type);
return " cnt.codeTypeId=21 and labo.typeId=cnt.key ";
}
public String checkCode(final String code){
if(code != null) return codeNoNull(code);
else return "";
}
public String checkName(final String name){
if(name != null) return nameNoNull(name);
else return "";
}
这样代码就易读易维护多了...