在使用新的系统概念或新技术的情况下,必须建立一个可以扔掉的系统,因为即使是最好的规划也不是那么无所不知,以至于第一次就做好了。 因此计划抛弃一个; 无论如何,你会的。

- 弗雷德布鲁克斯, 神话人月 [强调我的]

建立一个扔掉。 这就是他们告诉我的。 然后他们告诉我,我们现在都很敏捷 ,所以我们应该无情地重构 是什么赋予了?

重构我的方法总是更好吗? 如果没有,任何人都可以建议一个经验法则来帮助我决定何时坚持下去,何时放弃并重新开始?

===============>>#1 票数:11 已采纳

如果您正在进行测试驱动开发,那么您可以从几乎任何麻烦中重构出来。 我毫不费力地改变了主要的设计决策,并拯救了十年前的代码库。

唯一的例外是当您发现您的架构从始至终完全错误时。 例如,如果您使用线程编写应用程序,但您发现需要一堆异步状态机。 那时,继续扔掉第一稿。

===============>>#2 票数:10

早点扔掉,稍后重构

对于小型系统来说,扔掉是可以的,但是如果系统的规模很大,那么你就没有资源这么做了。

但是,您可以创建一个小型试验项目,该项目仅实现实际项目的非常重要的功能。 经过一些试验和错误以及学习和丢弃的东西,你最终得到了一个坚实的核心和对实际项目更好的理解。 然后,通过添加所需的所有功能,让项目的大小增加。 但是一旦你到达那里,你就无法丢掉核心。 只有重构。

===============>>#3 票数:5

如果你足够无情,那么重构的最终结果将非常接近你从头开始重建时所获得的结果,但在此过程中你不会被困在一个不工作的系统中。

===============>>#4 票数:4

“神话人月”的核心要点之一是,软件开发的难点在于弄清楚要说什么,而不是如何说出来。

我最近对此进行解释的方式是,您从初稿中获得的最大价值是您以测试形式收集和保存的要求。 如果你小心不要测试那些实际上并不是系统要求的东西,那么你可以从任何混乱中重构出来。

只要你不将自己编码到一个必须开始抛出测试的陷阱中,就可以在不丢失大量实际工作的情况下丢弃尽可能多的代码。

===============>>#5 票数:3

我的一般建议是将现有系统从其糟糕的设计重构为具有更好设计的系统。 这样可以维护系统并允许它始终部署。 如果从头开始,可能需要一段时间才能部署,或者永远不会。

如果你所说的只是在没有现有系统的情况下编写一些全新的代码,那么通常最好编写一些代码,无论你想要什么,然后抛弃它,因为它从未部署过并重新开始(使用TDD)。

===============>>#6 票数:2

有一点,重构是浪费时间。 你只需要从头开始。 如果你保持你的设计相当灵活,并且你认识到你还不知道所有的东西,你就不必扔掉任何东西。 当然,课程可能会变得多余,但你不会丢掉整个系统。

必须具有灵活的设计才能正确地重构。 没有设计或严格的设计意味着你最终会扔掉一些东西 - 要么因为你无法重构,要么因为不断的重构会降低你的代码库的可维护性。 很少有人细致而且训练有素,能够完成一系列轻微的重构以保持完整性。 除非你有一支全明星队,否则会发生这种退化!

TL; DR:你可以从大多数麻烦中重构出来。 但有时,您将无法重构某些设计元素。 当发生这种情况时,是时候重新开始了 - 尽管希望你可以重新使用你现有的一些组件。

===============>>#7 票数:2

不同情况需要不同的方法。 就个人而言,我会尽可能地重构为更好的设计。 重构导致比重写更少的错误。

但是,即使你打算扔掉一个,但是编写一堆验收测试仍然是一个好主意,以确保你的第二个版本在正确的轨道上。 然后,您可以逐个迁移到下一个版本,同时确保您的功能不会从用户的角度改变。 听起来有点像重构,我觉得有点邋..

===============>>#8 票数:2

在谈论敏捷时,你可以做到这两点,但一般来说,你会做尖峰 (原型)只是为了尝试特定问题,了解它们并能够做出更好的估计。 当你真正编写应用程序时,当你进行简单的尖峰和重构时就扔掉了。

亲切的问候

===============>>#9 票数:1

当我试图解决一个新的问题或功能时,我将进行原型设计。 之后,我会根据我学到的东西重建它。 实际上,这听起来很像重构......什么? 也许这是一回事? 嗯...

===============>>#10 票数:1

我认为扔掉一个有时是最好的方式,但它可能会受到伤害。 我发现一件可行的事情就是扔掉一件,但要好好选择你的技术。

例如,我在Ruby on Rails中编写了一个大型代码库,在过去的2 - 3年中,RoR已经取得了很大的进步。 我还在架构中做了一些需要修复的决定。 所以,我扔了一个,从头开始构建一个新的。 但是,我仍然可以使用70-80%左右的旧代码,因为我还在编写Ruby和Rails。

有助于此的主要因素是Rails强迫您编写结构良好的代码,并分离业务逻辑和表示层。 我第一次没有完美地完成它,但由于一切都相当分离和干,将代码移植到Rails v2.1,重新设计问题区域,并重写一些“问题”功能一直是相当痛苦的经历。

因此,从一开始就选择了一项伟大的技术,我已经能够扔掉一个,但仍然带走了70-80%仍然有效的旧东西。

===============>>#11 票数:1

在“神话人月”的后期文章中,布鲁克斯警告他发现如果你确实打算扔掉一个,你最终会扔2个!

我个人认为这发生在现实生活中; 我们将该项目的第1版分配给了一个平庸的程序员,因为“我们计划稍后将它扔掉 - 我们无论如何都会。” 我们最终不得不为第2版重写它,但那个也被扔掉了。 我从未见过第3版 - 该公司倒闭了。

我认为,当布鲁克斯说“计划扔掉一个,你会反正”,这更像是声明“剩下的错误数量是'n + 1'。” 也就是说,这是一个关于墨菲定律的哈哈认真的陈述,而不是实用的建议。 从中汲取的教训是,原型是有价值的,良好的写作是重写的,并且不要害怕放弃不起作用的东西。

然而,它必须归结为一个判断调用,因为正如Joel Spolsky在几篇文章中所讨论的那样,抛弃和重新开始的选择是诱人的,因为代码比编写更容易编写,写入比编写更有趣因此,即使这不是最好的事情,你的自然倾向也将始终重新开始。

===============>>#12 票数:0

我认为您的版本控制系统在这里发挥着重要作用。 如果您使用简单的分支(git,mercurial,这些天)运行分布式版本控制系统,那么您将能够更轻松地进行原型设计,并且重构更轻松,同时仍然拥有有效的工作副本。 其他任何事情都需要更多纪律。

===============>>#13 票数:0

作为该组织的开发经理,我“不被允许”编写生产代码。

我(ab)使用该规则来敲除快速,肮脏的概念验证代码,解决一个或其他问题点,然后我检查它来源控制并指出一个“适当的”开发并说“这是它的方式完成了,现在做得很好。“

这就像我们在这里“扔掉一个人”一样接近,而且我可能需要花费几个小时的时间来拼凑起来。 花时间处理诸如错误处理,边界检查以及制作好代码的所有其他部分这些都是浪费时间进行这类工作,但这意味着那些获得编写生产代码报酬的人可以花费他们的时间在编写代码审查时,编写生产代码的时间并没有像“它只是原型”这样的借口。

建造一个扔掉的东西经常被用来作为不能正常工作的借口。 这意味着你实际上并没有在过程中遇到足够的问题来学习足以让它充分利用任何人的时间。 正确地做到这一点,只是扔掉它,更加浪费。

正如几位人士先前所说,任何软件中最重要的特征就是它的出货。 考虑到这一点,我建立了“让人们付钱给我”的任何一天,而我在重构方面的无情只是让它足以让一个有效的产品得到合理维护。

===============>>#14 票数:0

在任何支持分支概念的配置管理系统上构建一个都很容易。 如果您要将现有系统中的激进设计变更引入现场并且是您薪水的来源; 你是一个更好的分支; 原型; 如果它不起作用就扔掉它。

重构一个大型的传统摇钱树系统往往导致普通的老式黑客攻击。 我认为重构听起来比黑客攻击要好得多。

  ask by Pitarou translate from so

未解决问题?本站智能推荐:

1回复

Ruby重构一个方法

愿意将此重构为一行: 必须有一种方法来定义块内的'sum',我可以放弃'return'。
1回复

重构一个罐子的包装

我有一些jar的麻烦,我想重命名所有的clases以避免冲突,但我只有最后的jar :( jar中的类包含在: org.foundation我希望在另一个jar中可用 org.foundation.oldversion 有没有工具可以做到? 我不想反编译。
1回复

如何在一个函数中仅保留一个return语句?

尽管在此进行了讨论,但一个函数应该只有一个return语句吗? ,是否有一些简单的提示或方法仅保留一个return语句? 或如何将多个return语句重构为一个return语句?
2回复

Ruby从另一个方法“返回”一个方法?

由于某些历史原因,在Rails项目中, Tiger和Elephant中的一段代码是相同的。 我不喜欢重复,但是如果我在AnimalController类中创建一个新方法并将这些代码移入其中,则无法从该新方法return walk或running方法。 我认为从另一种方法返回可能不是一
2回复

设计模式将一个DTO转换为另一个

我是设计模式的新手,不知道将一种DTO转换为另一种DTO的最佳方法是什么。 为了最大程度地提高性能,我使用存储过程,该过程连接了多个表(例如, entries , definitions , examples , vocabularies ),并返回具有40多个列的完整数据集-重新创建复合
2回复

将类重构为一个单独的项目

我打算从一个Java项目中提取几个类和包,然后将它们放到另一个Java项目中(它将有一个可分发的jar)。 这并不太困难,但是当然,如​​果进行如此大量的重构,则会产生后果。 即,原始项目中有许多类是我要提取的类的子类。 进行这种重构的最佳方法是什么?
5回复

在emacs中重构一个大文件

我在Emacs的一个文件中重构了一大段代码。 在大型emacs缓冲区中简化跳转到多个位置的最佳方法是什么? 目前我正在使用搜索(CS)和自定义评论 - “标记”。 这变得非常不可靠。 理想情况下,我希望在几个缓冲区中打开相同的文件,因此我可以使用CX B在它们之间切换。 你
1回复

更改第一个ViewController的名称

当我在IoS中创建新项目时,会得到默认的ViewController类,称为ViewController 我正在使用xcode7,当我尝试将类名更改为ViewController时,它告诉我Xcode7不支持(尚未)。 我的问题是,如何手动修改类的名称? 我试过的 更改
1回复

什么是一个接一个地执行多个条件的pythonic方法,同时向用户显示哪个是第一个失败的

假设我有这个有效的代码: (是的,我知道assert很糟糕,但请耐心等一下) 现在,当我调用这个函数时,我可以(或多或少)通过使用except AssertionError:来回溯第一个失败的断言,并使用traceback模块做一些魔术。 但是,这并不理想,因为:
2回复

将Django模型移动到另一个应用程序,该应用程序是另一个模型的父模型

我必须在两个不同的应用程序(如app1和app2)中使用django模型,在app1中,我得到了Model1,在app2中,我得到了BaseModel,而Model1就是这样 Model1和BaseModel在一个应用程序中,但是我将Model1移至app2,现在我也想将BaseMode