一段代码群里的讨论

今天在聊天的时候,大囧说一本书里提到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是为了性能,但是不清楚具体的什么性能.

修改后的代码

	@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 });

	}
	```