我建议使用Test-Driven-Development,这需要一些时间来适应,尤其是在使用诸如eclipse之类的良好IDE时,但是优势很大。
基本上,您要做的是在编写代码本身之前将测试写入代码。因此,您不得不从如何使用代码的角度来查看代码,这意味着您的界面会随着您实现的更多方案而发展。
另一个特点是,您以很小的块来实现(随着您在技术和编程方面的经验越丰富,它们就会变得越大),因此每次您都必须将精力集中在非常小的和定义明确的问题上。
而且,由于您首先编写了一个测试,然后才实施,所以您面前的测试失败了。因此,如果您像大多数程序员一样,就不会对疯狂的分析感到迷恋,因为您会认为:“我需要使此测试有效”。
一个简短的Java示例:
说我想开发一个程序,该程序可以从db读取和写入消息。
因此,从第一个明确定义的动作开始,我需要一个数据库:
@Test
public void testDB() {
DB db = DbConnector.getDB(address);
assertNotNull(db);
}
好的,所以在这里我看到我需要实现DbConnector.getDB类,以便它返回数据库,直到此测试失败。我去做...
不,我添加我想做的下一件事,从数据库加载消息:
@Test
public void testDB() {
DB db = DbConnector.getDB(address);
assertNotNull(db);
String message = db.fetchMessage(key);
assertEquals("hello world", message);
}
现在,我向数据库添加了另一个小功能,该功能是获取一条消息,然后执行该功能,完成后,我每次都会继续使用一个功能,直到出现类似这样的情况:
@Test
public void testDB() {
DB db = DbConnector.getDB(address);
assertNotNull(db);
String message = db.fetchMessage(key);
assertEquals("hello world", message);
message = "foo bar";
db.storeMessage(message);
message = db.fetchMessage();
assertEquals("foo bar", message);
}
这似乎是一个非常简单的示例,但这也适用于更复杂的任务。我知道一开始非常耗时,但是随着您习惯它,您会发现它实际上要高效得多。对于一种方法,您可以避免分析引起的瘫痪,而对于另一种方法,您可以获得更健壮的代码,这些代码通常具有较少的错误并经过较少的迭代。