在开发项目时经常重新设计是一个不好的信号吗?


39

刚开始编程时,我以为我有一天会坐下来并绘制所有类的UML图,然后开始一个项目,然后再坚持下去。我现在已经编程了两年了,但事实并非如此。当我经历一个项目时,我经常说

  • “嘿,我需要一堂课来做_ _。我以前没想过。”
  • “等等,这个函数实际上应该在该类中,而不是在这个类中。我将其移开。”
  • “这实际上应该是两个类,而不是一个。我将其拆分。”
  • “我应该使这三个独立类都从一个抽象类继承。”
  • Etcetera等。

我经常像这样进行重新设计,这是一个不好的信号吗?这是否意味着我是一个贫穷的程序员,或者这是正常现象吗?

Answers:


41

这是发展的正常部分。连续设计的两个核心原则是:

  1. 您不是无所不知的,您无法在开始之前就从头到尾地了解整个系统。
  2. 设计不是静态的。当一个项目已经使用了很长时间并且现在解决的问题不是它最初编写时正在解决的问题时,这种情况更为普遍。

我对此的个人看法是,您应该对设计有一个好主意,但要允许设计发展。另一种表达方式是,高级设计(就我使用UML /建模工具而言)在整个项目生命周期中极有可能保持静态。哪些方法做什么的详细设计以及类层次结构需要自由地具有可塑性。

当您对所要解决的问题一无所知时,您将犯下更多的初始错误步骤。但是,在使用了足够长的时间之后,整个设计将开始就位,并且您正在谈论的重构是保持代码整洁所需的全部。


3
+1,这就是为什么当人们谈论将对象序列化到数据库时,我总是不愿意->如果明天您的类被分解为多个部分,您如何在不保留旧代码的情况下反序列化呢?我更喜欢Protobuf替代方案(用于存储/消息交换的专用类),在这种替代方案中,您的核心类可以自由发展,而您只需要调整序列化/反序列化层即可。
Matthieu M.

@Matthieu-您编写数据库迁移。编写和测试的时间很少会超过一个小时。Ruby on Rails具有非常好的数据库迁移功能。
凯文·克莱恩

1
@kevin:我猜我们没有相同的数据库,我的数据库包含数亿行。迁移不是一种选择。
Matthieu M.

+1-过于骄傲/固执以至于不能承认自己犯了错不是一件好事。有人认为承认您的错误是每周的标志,但大多数人可能会尊重您,并且肯定地,如果您应对严重错误的策略是否认这是一个错误,那么第二个错误很可能是致命的。
Steve314 2011年

12

您在做什么通常被称为“重构”。如果您停止这样做,那就麻烦了。

事实是,大多数代码是复杂的,人类,即使是非常聪明的人,也无法一次全部弄清。


10

不,您似乎在遵循YAGNI并从给出的示例进行重构。您难道不认为拥有这种更好的解决方案并能够做到这一点比不再再考虑什么更好吗?

敏捷软件开发通常采用与瀑布模型完全不同的方法来适应这种情况


5

完全没问题(除非这些重新设计始终是大修或从头开始重建)。不用担心 在项目开始时从UML图开始可能会很好,但是不要一刀切,因为您几乎总是会发现工作过程中事物会发生变化。您可能会学习一开始并不了解的新技术,可能想以一些在最初的设计中就没有的方式来改进某些功能,业务需求会发生变化,有时在最初的设计中会有很多未知因素,这些只能以后再考虑,等等...

什么重要的是让他们反映在设计任何显著的变化,否则未来的开发者(包括自己)去更新这些初始UML文件最终可能会很困惑。这可能很困难,并且通常需要良好的纪律(和时间)。

从设计开始就非常少见,并坚持100%直到实施。我个人从未见过这样的事情发生,除了非常小的琐碎的程序。


6
步骤1:创建UML图。步骤2:编写代码。第3步:丢掉UML图,以便没人能看到它,并对代码的实际工作方式感到困惑。
kubi

4

您正在做的事情是完全正常的(假设您并非每次都完全从头开始)。我从事此工作已有20多年了,但这仍然是一个反复的过程。

唯一能够预先设计并坚持下去的事情是,如果您要解决与上次解决的问题完全相同的问题,即使这样,您也可能会找到改进的空间。


2

我绝对不是一个经验丰富的开发人员,但是我也这样做。在过去的几年中,我在精神上构建必要的体系结构的能力得到了极大的提高。但是,在编写软件时,无论我做了多少计划,总有一些地方需要重新设计。直到我真正编写代码之前,我才意识到自己会重复自己。

我在这篇文章中的意思是说,我会做您列表中的所有事情,除非这些事情持续发生并对您的生产力产生真正的负面影响,否则我认为这些事情不一定很糟糕。


0

这就是所谓的迭代过程,它是所有现代软件开发技术中的基本概念。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.