Api 避免弃用代码的敏捷实践?

Api 避免弃用代码的敏捷实践?,api,agile,deprecated,Api,Agile,Deprecated,我正在将一个开源Java库转换为C#,它有许多标记为不推荐的方法和类。这个项目是一个重新开始的机会,所以我计划完全删除它们。然而,由于我还不熟悉大型项目,我担心这种情况会再次出现。由于敏捷开发的大部分工作都是围绕着现在就开始工作,如果需要的话,以后再进行重构,所以对API的反对似乎是一个常见的问题。即使我不能完全确定项目的未来发展方向,我是否可以采取预防措施来避免/尽量减少API弃用?我不确定您能做多少。需求会发生变化,如果您必须确保API的客户端不会被较新的API版本破坏,那么您只能依赖于简单

我正在将一个开源Java库转换为C#,它有许多标记为不推荐的方法和类。这个项目是一个重新开始的机会,所以我计划完全删除它们。然而,由于我还不熟悉大型项目,我担心这种情况会再次出现。由于敏捷开发的大部分工作都是围绕着现在就开始工作,如果需要的话,以后再进行重构,所以对API的反对似乎是一个常见的问题。即使我不能完全确定项目的未来发展方向,我是否可以采取预防措施来避免/尽量减少API弃用?

我不确定您能做多少。需求会发生变化,如果您必须确保API的客户端不会被较新的API版本破坏,那么您只能依赖于简单的弃用代码,直到您认为没有人在使用弃用的代码为止

如果有任何对过时方法的引用,在代码上放置[Observe]属性会导致编译器创建警告。通过这种方式,如果API的客户端努力修复编译器警告,就可以逐渐转向新方法,而不会与新版本发生任何冲突

如果使用ObsoleteAttribute的重写,它会非常有用,该重写会接受一个字符串:

[Obsolete("Foo is deprecated. Use Bar instead for munging widgets.")]

也许您可以创建一个TimeBombAttribute:

[TimeBomb(new DateTime(2010,1,1), "Foo will blow up! Better use Bar, or else."]
在代码中,反射具有timebomb属性的方法,并在指定日期之后调用它们时抛出KaboomException。这将确保在2010年1月1日之后没有人使用过时的方法,并且您可以很好地清理您的API。:)

正如马特所说,属性是你的朋友。。。但无论何时应用它,都要提供如何更改调用代码的详细信息。这样你就有更多的机会让人们真正改变。您可能还需要考虑指定您期望在(可能是下一个主要版本)中移除方法的版本。


当然,您应该努力确保不调用过时的代码,尤其是在示例代码中。

我认为,不使用代码是敏捷过程(如持续重构和增量开发)不可避免的副产品。因此,如果您在项目中使用了不推荐的代码,那么这不一定是一件坏事——这只是生活中的一个事实。当然,您可能会发现,与其弃用代码,不如保留大量代码,但将其重构为不同的方法、类等


所以,底线是:我不会担心在敏捷开发过程中弃用代码。如果它在一段时间内达到了目的,那么你做的是正确的。

马特的答案是可靠的建议。我只是想提一提,最初你可能想使用一些类似于:

[Obsolete("Please use ... instead ", false)]
一旦移植了代码,将false更改为true,编译器就会将所有对该方法的调用视为错误

因为很多敏捷开发都是围绕着现在就开始工作,如果需要的话,以后再重构

这不是敏捷。这是在敏捷标签下伪装的牛仔编码

理想情况是,无论你完成了什么,根据你所做的任何定义,都是完成的。通常,国防部会按照“功能推动、测试和相关代码重构”的思路陈述一些事情。当然,如果你正在做一个一次性的原型,你可以有一个更轻松的DoD

API修改是一件困难的事情。如果它们只是您正在修改的项目内部API,那么最好的方法就是尽早重构。如果需要更改内部API,只需同时更改所有API客户机即可。通过这种方式,重构债务不会增长得很大,并且您不必使用折旧

对于已发布的API,您可能需要维护一些源代码和二进制兼容性保证,至少在下一个主要版本之前是这样。在保持兼容性的同时,将旧API标记为已弃用。与内部API一样,您应该尽快修复内部代码,以避免使用不推荐的API。

观看Josh Bloch的“

最重要的w/r/t不赞成是知道“当有疑问时,请忽略它。”观看视频以获得澄清,但这与必须永远支持您提供的内容有关。如果您现实地期望API被重用,那么您实际上是在一成不变地做出决定


我认为API设计在敏捷方式中是一件非常棘手的事情,因为您希望它能够以多种不同的方式被重用。你必须担心打破别人对你的依赖,因此虽然可以做到,但如果没有其他团队的快速转变,很难让正确的设计出现。当然,在这里,反对会有所帮助,但我认为雅格尼(YAGNI)对于API来说是一种更好的设计启发。

API设计的经验法则是关注它的功能,而不是它是如何实现的。一旦你知道了最终目标,找出你所需要的绝对最小投入并加以利用。避免将自己的对象作为参数传递,只传递数据

将配置与执行分开。对于exmaple,您可能有一个图像编码器/解码器

而不是像这样打电话:

Encoder.Encode( bytes, width, height,  compression_type, compression_ratio, palette, etc etc);
成功

Encoder.setCompressionType(compression_type);
Encoder.setCompressionType(compression_ratio);
etc,etc
Encoder.Encode(bytes, width, height);

这样,添加或删除设置就不太可能破坏现有的实现。

对于弃用,基本上有3种类型的API:内部、外部和公共

内部是指只有您的团队在处理代码。不推荐这些API并不是什么大问题。你的团队是唯一一个使用它的团队,所以他们不会在这里呆太久,有改变他们的压力,人们不怕改变他们,人们知道如何改变他们

外部是指它在相同的代码库中,但不同的团队使用它。这可能是大公司或pop中的一些常见库