Questions tagged «backward-compatibility»

14
保持编程语言向后兼容与修复其缺陷
首先,是一些上下文(您大多数人仍然知道的东西): 每种流行的编程语言都有明显的演变,大多数时候都以其版本标记:您拥有Java 5、6、7等,PHP 5.1、5.2、5.3等。发布新版本可提供新的API,修复错误,添加新功能,新框架等。总而言之:很好。 但是该语言(或平台)的问题呢?如果某种语言存在问题,开发人员要么避免使用(如果可以的话),要么学习忍受它。 现在,这些语言的开发人员从使用它们的程序员那里得到了很多反馈。因此,随着时间(和版本号)的流逝,这些语言中的问题将慢慢但必定会消失,这是有道理的。好吧,不是真的。为什么?向后兼容,这就是原因。但是为什么会这样呢?请阅读以下内容,了解更具体的情况。 我可以解释我的问题的最好方法是使用PHP作为示例: PHP被成千上万的人所喜爱和憎恨。所有语言都有缺陷,但是显然PHP是特殊的。查看此博客文章。它有很多所谓的PHP缺陷列表。现在,我不是PHP开发人员(尚未),但是我通读了所有内容,并且确定列表中的很大一部分确实是真正的问题。(并非全部,因为它可能是主观的)。 现在,如果我是积极开发PHP的人之一,那么我肯定会一一解决这些问题。但是,如果这样做,则依赖于该语言特定行为的代码将在新版本上运行时中断。用两个词概括一下:向后兼容。 我不明白的是:为什么要保持PHP向后兼容?如果我发布了修正了所有这些问题的PHP版本8,就不能在上面发出一个大警告:“不要在该版本上运行旧代码!”? 有一种叫做过时的东西。我们拥有它好多年了,而且行得通。在PHP的背景下:看看这些天来人们如何积极地劝阻这些mysql_*功能的使用(推荐使用mysqli_*PDO和PDO)。弃用工程。我们可以使用它。我们应该使用它。如果它适用于函数,为什么不适用于所有语言? 假设我(PHP开发人员)这样做: 启动新版本的PHP(假设8),并修复所有这些缺陷 新项目将开始使用该版本,因为它会更好,更清晰,更安全等。 但是,为了不放弃旧版本的PHP,我会不断发布更新,修复安全问题,错误等。这出于我未在此处列出的原因是有道理的。这是常见的做法:例如,看看Oracle如何继续更新MySQL 5.1.x版,即使它主要关注5.5.x版。 大约3或4年后,我停止更新PHP的旧版本并使其消失。很好,因为在这3或4年中,无论如何大多数项目都会改用PHP 8。 我的问题是:所有这些步骤是否合理?会很难吗?如果可以做到,那为什么不做呢? 是的,缺点是您破坏了向后兼容性。但这不是值得付出的代价吗?有好处的是,在3到4年内,您将拥有一种可解决90%问题的语言。它的名字将确保它的流行。 编辑:好的,所以当我说3或4年内人们将转向假设的PHP 8时,我没有正确表达自己的意思。我的意思是:3或4年内,如果人们开始使用PHP 8,他们将使用PHP 8。新项目。

7
何时更新jQuery?
当您建议更新jQuery / jQuery UI时?换句话说:更新jQuery / jQuery UI的最佳实践是什么? 我正在进行一个长期的项目,至少需要一年。在那段时间内,我确定jQuery / jQuery UI将被多次更新。 您是否建议每次发布更新时都更新我的jQuery / jQuery UI文件?还是坚持使用特定版本直到项目结束? 我担心“破坏”代码更改,并且每次发布更新时,我都必须测试所有内容。这需要太多时间。但是,另一方面,如果我不进行更新,则我担心以后会被我咬伤的错误。 该项目是一个ASP.MVC,我经常使用jQuery。 有什么想法吗?

1
为什么(/ did)Bertrand Meyer认为子类化是扩展“封闭式”模块的唯一方法?
在Meyer的“ 面向对象的软件构造”(1988)中,他将开放/封闭原则定义如下: 如果模块仍可扩展,则称其为打开状态。例如,应该可以向其包含的数据结构添加字段,或者向其执行的功能集添加新元素。 如果某个模块可供其他模块使用,则将其称为已关闭。假设已为模块提供了良好定义的稳定描述(信息隐藏的界面)。 他接着说: 如果重新打开模块,则还必须重新打开其所有客户端以对其进行更新,因为它们依赖于旧版本。…[此问题]每当模块必须由新功能或数据元素扩展时触发,从而触发直接和间接客户端中的更改。...使用经典的设计和编程方法,无法编写打开和关闭的模块。 Meyer解决这个难题的方法是:永远不要通过修改现有的类来扩展库模块;而是编写一个新模块来对现有类进行子类化,并使新客户端依赖于该新模块。 现在,在1988年,我正在用Turbo Pascal和Blankenship Basic编写玩具(程序)程序,而我在21世纪的专业经验是使用JVM,CLR和动态语言,所以我不知道Meyer的意思。通过“经典的设计和编程方法”。 Meyer的一个具体示例说明了为什么必须重新打开客户端模块(枚举上的switch语句,现在有更多的成员,需要更多的情况)似乎很合理,但是他几乎没有断言每次向库添加功能时都会断言模块,您需要更新其所有客户端。 是否有历史原因使该主张在1988年显得不言而喻?例如,向C静态库添加函数或数据结构是否更改了布局,以至于即使使用向后兼容的API,也必须重新编译客户端?还是Meyer真的只是在谈论一种用于强制API向后兼容的机制?

13
假设不需要向后兼容,C#或.Net功能会中断吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 任何产品或框架都会发展。主要是为了满足用户需求,利用新的计算能力并使其变得更好而做的。有时,主要设计目标也会随产品而改变。C#或.net框架也不例外。我们看到,今天的第四版与第一版相比有很大不同。但是事情成为阻碍这种向后兼容的障碍。 在大多数框架/产品中,如果不需要支持向后兼容性,则某些功能将被切断。据您介绍,C#/。net中的这些功能是什么? 请为每个答案提及一项功能。

3
我应该使用哪种Java版本的桌面应用程序吸引最多的用户?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我是否可以假设大多数最终用户使用的版本都比Java 8老?由于我不想强迫人们升级以使用我的应用程序,因此我是否应该计划从一开始就使用Java 7甚至6,即使这意味着我不能自己使用较新版本的好处作为开发者?

3
是否有任何机制可使编程语言更稳定(兼容)以进行更改?
有大量的编程语言。他们中的一些人长大后变得非常受欢迎。人们越来越多地使用这种语言。此类语言的创建者(或创始组织/社区)可能会尝试实施更改以使语言更好。但是有时由于向后兼容性而很难进行一些更改,并且这种丑陋的东西已经在该语言中存在多年了,并为许多用户所使用。 在语言设计阶段是否有任何架构原则或步骤可以帮助使其更稳定,以使语言设计人员不会害怕破坏向后兼容性?

3
允许不同版本的软件之间的文件向后兼容的最佳设计是什么?
有什么好的设计可以允许文件类型在不同版本的软件之间向后兼容? 例如,Microsoft如何将Word 2007、2010和2013等信息获取到所有打开的docx文件,但是不同版本可以保存更多/更少的数据,并以略有不同的方式保存数据,所有数据都保存到相同的文件类型,并且保存在一个版本中的文件可以在另一个版本中打开,但是文件的某些元素可能在较早版本中不可用? 我的意思是,最明显的方法是 private string openfile(string filename) { File.Open(filename) ... some logic that gets a header from the file that will never change switch (fileversion) case 2007: ..... case 2010 ..... case 2013 ..... } 但这似乎是令人难以置信的整体,不是很可扩展,并且可能导致大量复制/粘贴代码。 因此,我正在考虑对所有版本使用基本接口,该接口定义文件中需要存在的不变结构(例如标头)和需要用于序列化/反序列化的方法,然后进行多次继承,以便每个实现该接口的新版本的类继承了旧版本,并且仅覆盖已更改的内容,因为该文件在大多数情况下都是相同的。 我并没有真正为文件的结构而烦恼,因为它已经决定我们将使用XML,并且基本上已经确定了初始模式。但是,毫无疑问,将来会对其进行更改,我只希望能够以一种易于适应这些更改的方式来设计代码。

2
什么是.NET Framework向后兼容?
我们使用MySQL数据库在.NET 4中开发Windows应用程序。当我们要部署该应用程序时,我们在客户端中安装.NET 4框架,然后在安装用于MySQL的.NET连接器时,它需要一个.NET Framework 3.5。但是.NET 4已经安装。.NET框架不向后兼容吗? 我们最终安装了两个.NET框架(3.5和4),它们的磁盘大小都不小。向后兼容到底意味着什么?
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.