今天在聊天的时候,大囧说一本书里提到TDD开发,说道:类里的方法大都4-5行是不是很优雅?TDD的说法是如果一个方法超过4-5行就要考虑重构。我在看本TDD的书,例子很优雅
我的观点:我觉得那是到了境界了..我要是4-5行,就需要刻意的去处理,这样就工作效率低下了.于是我发了一段自己的代码
@Override
public <T> PreparedStatement createStatement(Connection connection,
String sql, Class<T>... entity) throws SQLException {
Field[] fields = entity[0].getDeclaredFields();
String pkFieldName = "";
for (Field field : fields) {
// 只有非static和非final类型的变量才能作为主键
if (!Modifier.isStatic(field.getModifiers())
&& !Modifier.isFinal(field.getModifiers())) {
pkFieldName = StringUtils.underscoreName(field.getName());
break;
}
}
logger.debug("pk field name:" + pkFieldName);
if (StringUtils.isNullOrEmpty(pkFieldName)) {
throw new DBException("can not get pk field name from " + entity[0]);
}
return connection.prepareStatement(sql, new String[] { pkFieldName });
}
大囧:第一行,getfields,第二行,调方法,是还能拆,可读性更好一点。
教主:可以无限拆,让你一年写一个方法。。这样比较好。。
好吧。上面的不是重点,kk提了我代码的几个问题
1、entity 只用到 [0
2、entity 没有判断nul
3、pkFieldName初始化时多余
4、logger没有加 enabled判
5、isNullOrEmpty直接换成 == null就
仔细看了下。确实有问题。我解释
1.这个是之前设计的时候,为了解决多个数据库差异写的方言类(实际我也不明白当时咋想的。。。用不定参数
2.这个我在上层调用已经判断过了。所以不是什么大问题,但是也要注意参数检
3.kk指的是初始化pkFieldName=null就可以了,pkFieldName=“”浪费,嗯。这个是我的问
4.先说第5个.isNullOrEmpty只需要使用==null判断就可以了..因为字段的名字不可能为“”啊,这样的话只要循环里赋值了,就不会为 “”,没赋值就是 null.我真是太2了.有些事一些参数的验证。得好好想想参数的来
5.关于isDebug的问题,我的体会没有很深
我:isDebug的影响到底有多大..我没太深的体会.
kk:不大,有一个区别,你的debug里有一个字符串相加的操作,优先于方法调用,如果加上enabled判断,这个 string操作可以省
解决了我一直的一个疑问,一直听说isDebug是为了性能,但是不清楚具体的什么性能.
修改后的代码
```java
@Override
public <T> PreparedStatement createStatement(Connection connection,
String sql, Class<T> entity) throws SQLException {
Field[] fields = entity.getDeclaredFields();
String pkFieldName = null;
for (Field field : fields) {
// 只有非static和非final类型的变量才能作为主键
if (!Modifier.isStatic(field.getModifiers())
&& !Modifier.isFinal(field.getModifiers())) {
pkFieldName = StringUtils.underscoreName(field.getName());
break;
}
}
if (logger.isDebugEnabled()) {
logger.debug("pk field name:" + pkFieldName);
}
if (pkFieldName == null) {
throw new DBException("can not get pk field name from " + entity);
}
return connection.prepareStatement(sql, new String[] { pkFieldName });
}
```