问题标签 [backwards-compatibility]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - DataContractSerializer:为什么不删除成员?
我正在阅读 Microsoft's Best Practices: Data Contract Versioning,他们指出:
不要在以后的版本中删除数据成员,即使IsRequired属性在以前的版本中保留为默认属性false 。
任何人都可以提出任何理由吗?他们没有详细说明。由于他们说可以在以后的版本中添加数据成员,因此删除似乎也可以 - 实际上,旧版本会将其视为添加。
我想,不同之处在于您应该在最后添加新成员(使用 DataMemberAttribute 上的 Order 属性),而被删除的属性可能不会在最后。但是他们也说在加载的时候丢失的成员会保持默认值,所以很明显,丢失的成员是可以的。
我错过了什么?如果我废弃了我的产品的某个功能并删除了与之相关的 [DataMember] 属性,我会导致哪些版本互操作问题(向前兼容和向后兼容)?
此外,如果我决定对前向兼容性不感兴趣(即,如果我不担心旧版本打开新文件),是否还会存在此类问题?
.net - 处理旧应用程序中的新库功能
我们正在开发一个新的库版本,其中包含一些其他应用程序使用的 UI 控件。其中一些控件具有旧应用程序不知道的新功能。默认情况下,我们将禁用新功能,但我们希望为某些特定应用启用它们。这些应用程序可能存在于同一台机器上。
你会如何建议实施这个?
更新: 我想出的最佳解决方案是使用 Process.GetCurrentProcess() 并使用类似 proc.MainModule.FileVersionInfo.InternalName 的东西来查找指定覆盖值的注册表项。也许还要查看版本号以检查它是否太旧而无法了解新功能。这种方法有问题吗?
更新: 添加的功能封装在控件中,只是它们在某些情况下有意义,而在其他情况下没有意义。
objective-c - 10.5 基础 SDK,10.4 部署:如何实现缺少的方法
我有一个同时针对 Mac OS X 10.4 和 10.5 的项目,其中 10.5 是基础 SDK。
有些方法-[NSString stringByReplacingOccurrencesOfString:withString]
在 10.4 中不可用。我可以手动实现该功能。另一种选择是将方法实现为一个类别,但这会与 10.5 实现混淆,这是我想避免的。
那么如何在 10.4 中实现这些方法而不会弄乱 10.5,并且当我决定停止支持 10.4 时,我可以轻松地取出实现呢?
c++ - 扩展现有 API:使用默认参数或包装函数?
我有一个现有的方法(或一般的函数),我需要增加额外的功能,但我不想在代码的其他地方破坏该方法的任何使用。例子:
在代码库中被广泛使用。现在我需要将 4 变成一个参数,但是任何已经调用 foo::bar 的代码仍然应该收到它所期望的。我是否应该扩展并重命名旧方法并将其包装成一个新方法,例如
或者我应该在头文件中声明一个默认参数,比如
并且只是扩展功能
每个变体的优点和缺点是什么?
java - 哪些 Java 设计明确地支持向后兼容?
由于这个问题回到了四票结束,我再次尝试提出一个更狭窄的问题,希望社区会更积极地看待这个问题。
Java 中的哪些特定设计决策被记录为以它们的方式完成,不是因为这是首选的设计决策,而是因为有必要支持向后兼容性。
最明显的情况是泛型,您无法在运行时检测到类型参数。(所以你不能这样做:
语言设计和标准 API 中还有哪些此类示例?
java - 编译为 1.5 编写的 Java 代码以使用 1.4 JRE?
我有一个使用泛型和一些 Java 1.5/6 的项目。是否可以编译此代码以在运行 1.4 JRE 的系统上工作?
我使用 ANT 构建脚本和 javac 任务来编译库。这在目标属性为 1.5 时构建良好。
如果我将目标更改为 1.4,则会收到以下错误:
所以我添加了一个源属性并尝试了 5 和 1.5 的值。新错误:
我是否必须检查所有代码并更改 1.5 的内容才能使其正常工作?
java - Java API 中断
我有以下 API:
我现在在我的 API 实现中执行以下修改
替换为:
您认为这是 API 损坏吗?
客户端的代码仍将编译,但 API javadoc 定义的方法协定不再受到尊重,因为 MyExcepiton 是由“新”条件引发的。
如果只更新我的 API jar 文件,客户端应用程序仍然可以工作,但取决于客户端捕获异常的方式,应用程序行为可能会发生很大变化。
你对此有何看法?
concurrency - 如何为 IPC API 提供向后兼容性
我正在设计一个(类 SOAP)进程间通信协议,用于通过网络进行函数调用。我想确保较旧的客户端可以与较新的服务器通信。想了一会儿,似乎我唯一能做的就是:
- 避免 API 更改
- 使添加功能成为可能
- 可以添加函数参数
但是,当服务器的功能彻底改变时,这还不够。例如:
- 必须从一个函数调用移动到另一个函数调用的参数。
- 改变的参数类型,例如从整数到字符串。
我的问题是:可以在保持向后兼容的同时进行这种更改,还是唯一的选择就是不进行更改?
注意:我知道,我患有此处未发明综合症,但在我看来,这并没有使这个问题无效。
php - php 5 与 php 4 的向后兼容性如何?
我使用 php 4 编写的代码库。我想完成将代码升级到 php 5(我的主机提供的最新版本)的过程。我想知道是否有其他人经历过类似的升级体验并且可以分享有哪些陷阱/陷阱,我的代码有什么需要改变的,两个版本之间不向后兼容的地方是什么?
iphone - 如何在 iPhone 项目中指定 dylib 的兼容版本?
我最近在我的 iPhone 项目中添加了一个静态库 (mobclix),它要求我将 Base SDK 设置为 3.0。该库声称与 2.2 兼容,到目前为止它看起来是真的。我将项目的部署目标设置为 2.2。那里没有问题。
现在,我也在同一个项目中使用 libxml2。显然,OS 3.0 中的 libxml2.2.dylib 比 OS 2.X(分别为版本 10 和 9)更新。但是,我使用 libxml2 的代码已经与 OS 2.X 中包含的 libxml2 版本兼容。由于我需要将 Base SDK 设置为 3.0,因此“兼容性版本”/最低版本要求/依赖项会自动设置为较新版本的 libxml2。当我尝试在 OS 2 中运行该应用程序时,我收到此运行时错误(显然):
是否可以在某处覆盖版本要求?或者解决这个问题的其他想法?