淘汰过时的代码的最佳实践是什么?


9

我需要淘汰一种过时的方法。我知道这个[Obsolete]属性。Microsoft是否有推荐的最佳实践指南来执行此操作?

这是我目前的计划:

答:我不想创建一个新的程序集,因为开发人员将不得不为其项目添加新的引用,并且我希望如果老板和同事必须这样做,将会引起很多痛苦。我们也不维护多个程序集版本。我们仅使用最新版本。更改此做法将需要更改我们的部署过程,这是一个大问题(必须教人们如何使用TFS而不是FinalBuilder来做事情,并让他们放弃FinalBuilder)

B.标记旧方法已过时。

C.因为实现正在更改(不是方法签名),所以我需要重命名方法而不是创建重载。因此,为了使用户知道正确的方法,我计划向[Obsolete]属性添加一条消息。这部分让我感到困扰,因为我所做的唯一更改就是将方法与连接字符串分离。但是,由于我没有添加新的程序集,因此无法解决此问题。

结果:

[Obsolete("Please don't use this anymore because it does not implement IMyDbProvider.  Use XXX instead.")];
        /// <summary>
        /// 
        /// </summary>
        /// <param name="settingName"></param>
        /// <returns></returns>
        public static Dictionary<string, Setting> ReadSettings(string settingName)
        {
            return ReadSettings(settingName, SomeGeneralClass.ConnectionString);
        }

        public Dictionary<string, Setting> ReadSettings2(string settingName)
        {
            return ReadSettings(settingName);// IMyDbProvider.ConnectionString private member added to class.  Probably have to make this an instance method.
        }

Answers:


5

Microsoft使用[obsolete]属性来告诉开发人员该方法,属性或类已弃用,并且在将来的发行版中可能会更改(或根本不支持)。

这给了您至少一个发布周期,以通知您的API用户其功能正在“消失”,并在其软件的将来版本中删除对该功能的引用。

您将原始功能保留多长时间完全取决于您。如果您想“强烈鼓励”开发人员在旧功能上使用您的新功能,则只需一个额外的发布周期即可将其删除。如果您打算具有永久的向后兼容性,则可以永久保留。

正如Brian指出的那样,如果仅更改基础实现而不是方法签名,则可能根本不需要执行任何操作。


微软的做法通常是在下一个主要版本中删除不推荐使用的内容。相比之下,Java永远不会删除不推荐使用的东西-由您决定。
Scott C Wilson

我们不会对程序集进行超出应用程序级别的版本化(一个大型应用程序具有许多解决方案)。结合以下事实:依赖于任何给定程序集的解决方案数是不确定的。我无法测试我不知道的应用程序。但是,如果我进行更改导致我不知道的应用程序损坏,那是我的错。这就是为什么我将方法重命名的原因。因此,到目前为止,我没有更好的方法可以解决此问题。
P.Brian.Mackey 2012年

4

因为实现正在更改(不是方法签名),所以我需要重命名方法而不是创建重载。

我不明白 如果实现改变了但签名没有改变,为什么要这么做呢?让“旧”方法使用新的和改进的实现。使用此API的所有开发人员都将在看到具有完全相同的签名创建的方法并在其现有方法调用上弃用警告的情况下转眼。(您能想到API曾经发生过的时间吗?)

如果不确定更改此方法的基础实现是否可行,请在更改实现之前和之后使用单元测试验证行为。


那是一个很好的理想。问题在于我们没有适当的测试工具。这是我希望共同解决的另一个问题。因此,因为没有集成测试,所以我无法按照您的建议进行。有太多尚未定义的缺陷将无法测试。
P.Brian.Mackey 2012年

我提到测试的原因是因为您显然想执行此操作,因此使用API​​的人员将进行测试并帮助您确定两次调用之间的任何问题。最好的选择似乎是将使用您的代码的开发人员扔掉,让他们使用新的实现,并希望他们进行全面的质量检查或进行自己的测试。
brian 2012年

我会把自己扔进火里。我宁愿坚持发布的原始代码。这样一来,没人会在凌晨3点打电话给我,想知道为什么生产代码会中断。然后,依靠开发人员来解决过时的代码并修复警告标志。如果他们当时没有解决问题,那么当连接字符串开始出现故障时,这是由于未修复警告标志而引起的……不是我的。
P.Brian.Mackey 2012年

每当您编写新代码时,都会冒引入问题的风险。通过测试,您可以毫无恐惧地进行重构。恐惧是心灵的杀手。另外,您只是在延迟不可避免的事情;从现在开始,他们会在两次调用中为他们的呼叫添加“ 2”,如果无法使用,您将获得相同的电话。
brian 2012年
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.