当我开始一个新项目时,我经常会立即开始思考实现的细节。“我应该把DataBaseHandler放在哪里?我应该如何使用它?想要使用它的类应该从某个抽象超类中扩展吗……我应该使用接口吗?我要在类中使用包含用于发送请求和解析数据的方法的抽象级别吗?”
最后,由于我希望代码具有可扩展性和可重用性,所以我不得不拖延很长一段时间。但我觉得,要想忘记如何完美地实现,几乎是不可能的。
然后,如果我试着说“去他的,完成它!”,我很快就撞上了砖墙,因为我的代码没有组织,我混合了抽象级别,等等。
在启动一个新项目时,您有哪些技术/方法可以同时建立一个具有良好扩展性的逻辑/模块结构?
-编辑--
嗯,这已经是一个很难接受的问题,但是想得到更多的反馈,看看是否有共识。TDD听起来很酷,坦率地说,我一直想更快地使用JUnit等等。同时,TDD的粉丝们认为,与TDD解决特定问题有关的一个合理观点是,TDD似乎并没有真正解决设计问题。当然,我同意TDD将帮助我定义我想要做的事情,然后我可以逐步完成如何工作,但是有许多不同的总体设计模式/结构都可以通过单元测试。仅此而已:它测试单个单位。我想我有点困惑..。我不知道。也许我只是想通过找出一些神奇的公式来拖延更久,但我想听听一些老兵是如何对待这一领域的。
谢谢!
发布于 2011-06-23 03:56:18
我使用测试驱动-开发重新评论,它需要一些习惯,特别是当使用一个好的IDE,如eclipse时,但好处是很大的。
基本上,您要做的是在编写代码之前先将测试写到代码中。因此,您不得不从如何使用代码的角度来看待代码,这意味着您的接口会随着您实现的场景的增加而发展。
另一个特点是,您以非常小的块实现(它们越大,您在技术和编程方面的经验越丰富),因此它迫使您每次都专注于一个非常小且定义良好的问题。
而且,由于您首先编写了一个测试,然后才实现,所以您面前有一个失败的测试。所以,如果你像大多数程序员一样,你不会因为疯狂的分析而着迷,因为你会想:“我需要让这个测试工作起来”。
一个简短的java示例:
假设我想要开发一个程序来读取和写来自db的消息。
因此,我从第一个定义良好的操作开始,我需要一个DB:
@Test
public void testDB() {
DB db = DbConnector.getDB(address);
assertNotNull(db);
}好的,这里我看到我需要实现DbConnector.getDB类,这样它才能返回DB,直到这个测试失败。我去做那个..。
不是我添加了我想做的下一件事,而是从DB加载消息:
@Test
public void testDB() {
DB db = DbConnector.getDB(address);
assertNotNull(db);
String message = db.fetchMessage(key);
assertEquals("hello world", message);
}现在,我在DB中添加了另一个小特性,即获取消息,我去实现它,一旦完成,我就一次执行一个特性,直到达到这样的目的:
@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);
}这似乎是一个非常简单的例子,但这也适用于更复杂的任务。我知道这在一开始很费时,但当你习惯了它,你会发现,事实上它更有效率。一种是通过分析来避免瘫痪,而另一种则是获得更健壮的代码,这些代码通常具有较少的bug和较少的迭代次数。
发布于 2011-06-23 03:55:41
这种情况发生在我身上,所以我养成了接受(并接受)不断重构的心态的习惯。我做了最简单的事情,可能会起作用,然后我清理它,组织它,解耦它,测试它,然后继续前进。
这并不是说没有太多的计划,但它发生得很快,而且更多--经常是乱涂乱画,或是在我脑子里乱画。总之,我有时把这个小流程称为微迭代,因为每个过程只需要5-20分钟,根据经验,完成我正在做的工作需要2-3分钟(显然,这取决于我正在做什么)。
顺便提一句:我教了很多人不同形式的写作(报告、论文和技术写作),这和我让他们写东西来克服写作障碍的方法一样。“只要脱口而出任何在页面上出现的话题。然后我们就能理解它,把它分成段落,检查流程。如果需要的话,我们甚至会重写它。”
发布于 2011-06-23 05:57:03
一些可能有用的东西:
https://softwareengineering.stackexchange.com/questions/86364
复制相似问题