今天在聊天的时候,大囧说一本书里提到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 });

}
```
Comments
Write a Comment