如何写出更好的Java代码(5)

发表于:2014-05-27来源:不详作者:不详点击数: 标签:
它同时支持Java和Scala。它优先使用Scala这点可能有点令人沮丧,但是用Java进行开发的话也非常不错。 如果你习惯了Python里的Flask这类的微框架,那么你应该

  它同时支持Java和Scala。它优先使用Scala这点可能有点令人沮丧,但是用Java进行开发的话也非常不错。

  如果你习惯了Python里的Flask这类的微框架,那么你应该会对Spark感到很熟悉。有了Java 8它简直如虎添翼。

  SLF4J

  Java打印日志有许多不错的解决方案。我个人最喜欢的是SLF4J,因为它是可挺插拔的,并且可以同时混合不同的日志框架中输出的日志。有个奇怪的工程同时使用了java.util.logging, JCL, 和log4j?没问题,SLF4J就是为它而生的。

  想入门的话,看下它的这个两页的手册就足够的了。

  jOOQ

  我不喜欢很重的ORM框架,因为我喜欢SQL。因此我写了许多的JDBC模板,但它们很难维护。jOOQ是个更不错的解决方案。

  你可以在Java中以一种类型安全的方式来书写SQL语句:

  // Typesafely execute the SQL statement directly with jOOQ

  Result> result =

  create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)

  .from(BOOK)

  .join(AUTHOR)

  .on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))

  .where(BOOK.PUBLISHED_IN.equal(1948))

  .fetch();

  将它以及DAO模式结合起来,你可以让数据库访问变得更简单。

  测试

  测试对软件来说至关重要。下面这些库能让测试变得更加容易。

  jUnit 4

  jUnit就不用介绍了。它是Java中单元测试的标准工具。

  不过可能你还没有完全发挥jUnit的威力。jUnit还支持参数化测试,以及能让你少写很多样板代码的测试规则,还有能随机测试代码的Theory,以及Assumptions。

  jMock

  如果你已经完成了依赖注入,那么它回报你的时候来了:你可以mock出带副作用的代码(就像和REST服务器通信那样),并且仍然能对调用它的代码执行断言操作。

  jMock是Java中标准的mock工具。它的使用方式是这样的:

  public class FooWidgetTest {

  private Mockery context = new Mockery();

  @Test

  public void basicTest() {

  final FooWidgetDependency dep = context.mock(FooWidgetDependency.class);

  context.checking(new Expectations() {

  oneOf(dep).call(with(any(String.class)));

  atLeast(0).of(dep).optionalCall();

  });

  final FooWidget foo = new FooWidget(dep);

  Assert.assertTrue(foo.doThing());

  context.assertIsSatisfied();

  }

  }

  这段代码通过jMock设置了一个FooWidgetDependency ,然后添加了一些期望的操作。我们希望dep的call方法被调用一次而dep的optionalCall 方法会被调用0或更多次。

  如果你反复的构造同样的FooWidgetDependency,你应该把它放到一个测试设备(Test Fixture)里,然后把assertIsSatisfied放到一个@After方法中。

  AssertJ

  你是不是用jUnit写过这些?

  final List result = some.testMethod();

  assertEquals(4, result.size());

  assertTrue(result.contains("some result"));

  assertTrue(result.contains("some other result"));

  assertFalse(result.contains("shouldn't be here"));

  这些样板代码有点太聒噪了。AssertJ解决了这个问题。同样的代码可以变成这样:

  assertThat(some.testMethod()).hasSize(4)

  .contains("some result", "some other result")

  .doesNotContain("shouldn't be here");

  连贯接口让你的测试代码可读性更强了。代码如此,夫复何求?

  工具

  IntelliJ IDEA

  备选方案: Eclipse and Netbeans

  最好的Java IDE当然是 IntelliJ IDEA。它有许多很棒的特性,我们之所以还能忍受Java这些冗长的代码,它起了很大的作用。自动补全很棒,< a href="http://i.imgur.com/92ztcCd.png" target="_blank">代码检查也超赞,重构工具也非常实用。

  免费的社区版对我来说已经足够了,不过在旗舰版中有许多不错的特性比如数据库工具,Srping框架的支持以及Chronon等。

  Chronon

  GDB 7中我最喜欢的特性就是调试的时候可以按时间进行遍历了。有了IntelliJ IDEA的Chronon插件后,这个也成为现实了。当然你得是旗舰版的。

  你可以获取到变量的历史值,跳回前面执行的地方,获取方法的调用历史等等。第一次使用的话会感觉有点怪,但它能帮忙你调试一些很棘手的BUG

原文转自:http://it.deepinmind.com/java/2014/05/21/better-java.html