首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码时如何通过分析克服瘫痪?

编码时如何通过分析克服瘫痪?
EN

Software Engineering用户
提问于 2011-06-23 03:22:07
回答 9查看 2.7K关注 0票数 39

当我开始一个新项目时,我经常会立即开始思考实现的细节。“我应该把DataBaseHandler放在哪里?我应该如何使用它?想要使用它的类应该从某个抽象超类中扩展吗……我应该使用接口吗?我要在类中使用包含用于发送请求和解析数据的方法的抽象级别吗?”

最后,由于我希望代码具有可扩展性和可重用性,所以我不得不拖延很长一段时间。但我觉得,要想忘记如何完美地实现,几乎是不可能的。

然后,如果我试着说“去他的,完成它!”,我很快就撞上了砖墙,因为我的代码没有组织,我混合了抽象级别,等等。

在启动一个新项目时,您有哪些技术/方法可以同时建立一个具有良好扩展性的逻辑/模块结构?

-编辑--

嗯,这已经是一个很难接受的问题,但是想得到更多的反馈,看看是否有共识。TDD听起来很酷,坦率地说,我一直想更快地使用JUnit等等。同时,TDD的粉丝们认为,与TDD解决特定问题有关的一个合理观点是,TDD似乎并没有真正解决设计问题。当然,我同意TDD将帮助我定义我想要做的事情,然后我可以逐步完成如何工作,但是有许多不同的总体设计模式/结构都可以通过单元测试。仅此而已:它测试单个单位。我想我有点困惑..。我不知道。也许我只是想通过找出一些神奇的公式来拖延更久,但我想听听一些老兵是如何对待这一领域的。

谢谢!

EN

回答 9

Software Engineering用户

发布于 2011-06-23 03:56:18

我使用测试驱动-开发重新评论,它需要一些习惯,特别是当使用一个好的IDE,如eclipse时,但好处是很大的。

基本上,您要做的是在编写代码之前先将测试写到代码中。因此,您不得不从如何使用代码的角度来看待代码,这意味着您的接口会随着您实现的场景的增加而发展。

另一个特点是,您以非常小的块实现(它们越大,您在技术和编程方面的经验越丰富),因此它迫使您每次都专注于一个非常小且定义良好的问题。

而且,由于您首先编写了一个测试,然后才实现,所以您面前有一个失败的测试。所以,如果你像大多数程序员一样,你不会因为疯狂的分析而着迷,因为你会想:“我需要让这个测试工作起来”。

一个简短的java示例:

假设我想要开发一个程序来读取和写来自db的消息。

因此,我从第一个定义良好的操作开始,我需要一个DB:

代码语言:javascript
复制
@Test
public void testDB() {
  DB db = DbConnector.getDB(address);
  assertNotNull(db);
}

好的,这里我看到我需要实现DbConnector.getDB类,这样它才能返回DB,直到这个测试失败。我去做那个..。

不是我添加了我想做的下一件事,而是从DB加载消息:

代码语言:javascript
复制
@Test
public void testDB() {
  DB db = DbConnector.getDB(address);
  assertNotNull(db);
  String message = db.fetchMessage(key);
  assertEquals("hello world", message);
}

现在,我在DB中添加了另一个小特性,即获取消息,我去实现它,一旦完成,我就一次执行一个特性,直到达到这样的目的:

代码语言:javascript
复制
@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和较少的迭代次数。

票数 17
EN

Software Engineering用户

发布于 2011-06-23 03:55:41

这种情况发生在我身上,所以我养成了接受(并接受)不断重构的心态的习惯。我做了最简单的事情,可能会起作用,然后我清理它,组织它,解耦它,测试它,然后继续前进。

这并不是说没有太多的计划,但它发生得很快,而且更多--经常是乱涂乱画,或是在我脑子里乱画。总之,我有时把这个小流程称为微迭代,因为每个过程只需要5-20分钟,根据经验,完成我正在做的工作需要2-3分钟(显然,这取决于我正在做什么)。

顺便提一句:我教了很多人不同形式的写作(报告、论文和技术写作),这和我让他们写东西来克服写作障碍的方法一样。“只要脱口而出任何在页面上出现的话题。然后我们就能理解它,把它分成段落,检查流程。如果需要的话,我们甚至会重写它。”

票数 12
EN

Software Engineering用户

发布于 2011-06-23 05:57:03

一些可能有用的东西:

  • 找出你想要解决的核心问题--你想要做的事情的核心是什么?实现这一点,并提供最低限度的支持代码以使其运行。一旦它工作到你满意,建立迭代,重建没有怜悯在每一步。
  • 看看其他编程范例是否适合您。尽管有很多优点,面向对象编程并不是所有问题的答案,也不是所有程序员的大脑都是这样工作的。学习一种(纯的)函数式语言;编写一些程序代码;深入到硬件级别,做一些C甚至汇编程序;等等。一些语言可能会动摇你的头脑(假设你目前使用的是C++ / Java / C# / VB /.):Haskell、ML、Lisp (各种方言可供选择)、Erlang、Prolog、Smalltalk、Javascript (如果你放弃尝试使它表现得像Java并接受它的闭包性质)、C、Pascal、awk,以及更多的语言。关键的特点是,它们需要与您现在使用的非常不同。这不是你想要在一个重大项目上做的事情,但做一些附带的项目(个人或工作相关的)会给你新的见解。
  • 使用完全不同的设计方法。看看你能不能从一个不同的角度来选择这个设计。我假设您通常通过布局类来开始设计;从数据结构开始进行更改如何?或者,首先设计UI,在设计任何功能之前按字面绘制输入表单如何?
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/86364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档