什么使代码遗留下来?

我听说很多开发者将代码称为“遗留”。 大多数情况下,代码是由不再在项目中工作的人编写的。 这是什么使代码,遗留代码?

更新回应:“从祖先或前身或从过去传下来的东西” http://www.thefreedictionary.com/legacy 。 显然你想知道别的东西。 你能澄清或扩大你的问题吗? 美国洛特

我正在寻找遗留代码的症状,使其无法使用或噩梦工作。 什么时候扔掉它更好? 我认为应该更频繁地丢弃代码,重新发明代码是发展的重要部分。 不重新发明轮子的学术理想是一个很好的理想,但不是很实际。

另一方面,显然遗留的代码值得保留。

通过使用不再被支持或被取代的硬件,软件,API,语言,技术或function,通常与几乎不可能替代该代码的可能性相反,直到它或系统死亡。

这是什么使代码,遗留代码?

就像传统的遗产一样,当作者死了或失踪的时候,你作为inheritance人得到他的全部或部分代码。

你stream下了眼泪,试图弄清楚如何处理这些垃圾。

Michael Feathers在其着作“有效使用传统代码”中有一个有趣的定义。 据他说,遗留代码是没有自动化testing的代码。

这是一个非常普遍的(经常被滥用的术语),但以下任何一个都是称为应用程序遗留的合法理由:

  1. 代码库基于一种完全不受原始产品制造商支持的语言/平台(通常说制造商已经停业)。

  2. (真的是1a)它所构build的代码库或平台太旧,以至于为系统获得合格或有经验的开发人员既困难又昂贵。

  3. 该应用程序支持业务不再积极发展的一些方面,对于这些方面的改动是非常罕见的,通常如果在其周围出现完全意想不到的变化(典型的例子是2000年版的问题)或者一些调节/外部压力它。 既然这两个原因都是紧迫的,通常是不可避免的,但是项目没有发生重大的发展,那么分配给这个人的这个人很可能不熟悉这个系统(这是累积的行为和错综复杂的)。 在这些情况下,这通常会增加与项目相关的风险和计划风险。

  4. 该系统已经/或正在被另一个replace。 因此,这个系统的使用可能比原来预想的要less得多,或者可能只是作为查看历史数据的手段。

遗产通常是指不再被开发的代码 – 意思是说,如果你使用它,你必须以原来的术语来使用它 – 你不能只编辑它来支持世界今天的样子。 例如,遗留代码必须在当今可能不存在的硬件上运行 – 或者不再支持。

据遗产代码工作高效的作者Michael Feathers所述,遗留代码是没有testing的代码。 当代码改变时无法知道什么是中断的。

遗留代码与非遗留代码的主要区别在于testing,或者说是缺lesstesting。 我们可以通过一个小小的思考实验来了解这一点:如果它能够反弹,修改代码库是多么的容易,如果它可以告诉你什么时候你犯了一个错误? 这很容易,不是吗? 大部分的恐惧都是为了修改庞大的代码库,害怕引入微妙的错误; 害怕无意中改变事物。 通过testing,你可以让事情更好而不受惩罚。 对我来说,差别是如此重要,它压倒了其他的区别。 通过testing,你可以让事情变得更好。 没有他们,你只是不知道事情是变好还是变坏。

传统代码是与不再支持或制造的操作系统或其他计算机技术相关的源代码。

一位同事曾经告诉我,遗留代码是你自己没有写的任何代码。

可以说,这只是一个贬义的代码术语,不pipe出于什么原因我们都不会再喜欢它(通常是因为它不是很酷或者很时髦,但是很有效)。

TDD旅可能会build议没有testing的代码是遗留代码。

http://en.wikipedia.org/wiki/Legacy_code

“传统代码是与不再支持或制造的源代码”

任何支持(或文档)缺less的代码。 是吧:

  • 内联评论
  • 技术文档
  • 口头文件(写它的人)
  • logging代码工作的unit testing

对我来说,遗留代码是在某种范式转换之前编写的代码。 它可能仍然在使用中,但它正在被重构,以使其成为一个整体。
例如旧的程序代码挂在另一个OO系统中。

代码(或者其他任何东西)当它被新的/更好的东西所取代时变成了“遗留”,尽pipe如此,它仍然被使用,并在“野外”中保持活力。

保留遗留代码不是一个理论上的理想,因为它保持代码的工作,无论多么糟糕。 在许多保守的企业情况下,这被认为比扔掉并从头开始更实用。 更好的魔鬼你知道…

没有人会读这个,但我觉得其他答案不完全正确:

  1. 它有价值,如果它没有用,它早就被扔掉了
  2. 因为两者之一,所以很难推理
    1. 缺乏文件,
    2. 原作者无法find或忘记(是的,2个月后,你的代码也可以是遗留代码!!)
    3. 缺乏testing或types系统
    4. 不遵循现代的做法(即没有环境也坚持)
  3. 有一个要求改变或扩大它。 如果没有要求改变它,它不是遗留代码,因为没有人关心它。 它做它的事情,没有人可以称之为遗留代码。

老实说,遗留代码是其他软件的代码,框架,api,不再是“酷”了。 例如,COBOL被一致认为是遗产,而APL则不是。 现在人们也可以把COBOL认为是遗留和APL的情况,不是因为它具有大约100万安装基础的APL。 但是,如果你说你需要处理APL代码,那么回复就不会是“哦,不是那些遗留的东西”,而是“哦,我的上帝,猜测你下一个世纪不会做任何事情”。

如果满足下列任何或全部条件,我认为代码是“遗留”的:

  • 它是使用当前标准背后的一代语言或方法编写的
  • 代码是一个完整的混乱,没有计划或devise背后
  • 它是用过时的语言写成的,过时的,非面向对象的风格
  • 很难find知道这个语言的开发者,因为它太旧了

与其他一些观点不同的是,我看到很多现代应用程序在没有unit testing的情况下工作得体。 unit testing还没有深入人心。 也许十年后,下一代程序员将会考虑我们当前的应用程序,并认为它们不包含unit testing的“遗留”,就像我认为非面向对象的应用程序是遗留的。

如果需要对遗留代码库进行less量更改,最好将其保留原样并按照stream程执行。 如果应用程序需要大幅度的function改变,GUI大修,和/或找不到任何知道编程语言的人,那么现在是时候抛弃并重新开始。 然而,警告一句话:从零开始重写可能非常耗时,并且很难知道是否复制了所有function。 您可能想要为遗留应用程序和新应用程序编写testing用例和unit testing。

旧版代码是一个多月前写的东西:-)

通常任何不是用时髦的脚本语言编写的代码,我只是半开玩笑。

遗留代码是代码,这是痛苦的/昂贵的,以保持目前的变化的要求。

有两种方法可能发生:

  1. 代码不适合更改
  2. 代码的语义已经被换成了硅片

1)是两人更容易识别的。 它是具有基本限制的软件,无法跟上周围的生态系统。 例如,围绕O(n ^ 2)algorithm构build的系统将不会伸缩超过某个点,如果需求在该方向移动,则必须重新编写该系统。 另一个例子是使用最新操作系统版本不支持的库的代码。

2)难以识别,但这种编码共享人们害怕改变它的特性。 这可能是因为它没有被写入/logging开始,因为它没有被testing,或者因为它是不平凡的,原来的作者理解它离开了团队。

构成生命代码的ASCII / Unicode字符在与之相关联的人的头脑中具有语义,“为什么”,“是什么”以及在某种程度上是“如何”。 遗留代码是非拥有的,或者所有者不具有与大部分相关的意义。 一旦发生这种情况(第二天可能会发生代码写得很差的代码),为了改变这个代码,有人必须学习并理解它。 这个过程是首先编写它的时间的一小部分。