繁体   English   中英

界面设计? 我可以迭代吗? 我应该如何处理对界面的更改?

[英]Interface design? Can I do it iteratively? How should I handle changes to the interface?

用C#或Java定义接口的最佳方法是什么? 当真正需要出现时,我们是否需要使泛型或添加方法?

问候,斯里尼瓦斯

一旦一个接口被定义,它的目的是不能改变 您必须考虑界面的用途,并且要尽可能完整。

如果以后发现需要添加方法,则实际上应该使用其他方法定义一个新接口,可能是_V2接口。

附录在这里,您会发现一些有关C#接口设计的良好指南 ,这是有关C#设计的较大,有价值的工作的一部分。 它通常也适用于Java。

摘录:

尽管大多数API最好使用类和结构来建模,但是在某些情况下,接口更合适或者是唯一的选择。
提供至少一种类型的接口实现。 这有助于验证接口的设计。 例如,System.Collections.ArrayList是System.Collections.IList接口的实现。
务必提供至少一个使用您定义的每个接口的API(一种将接口作为参数或将属性作为接口输入的方法)。 这有助于验证界面设计。 例如,List.Sort使用IComparer接口。
不要将成员添加到先前提供的接口中。 这样做会破坏接口的实现。 您应该创建一个新界面以避免版本问题。

我建议依靠广泛的类型设计指南

引用约书亚·布洛赫(Joshua Bloch)的话:

如有疑问,请不要理会。

您以后可以随时添加到界面。 一旦成员成为界面的一部分,就很难更改或删除它。 在创建接口时要非常保守,因为它们是绑定合同。

作为旁注, 这里是对Microsoft CLR团队的Vance Morrison的一次精彩采访 ,他提到了CLR的未来版本可能允许其成员的“ mixins”或具有默认实现的接口的可能性。

好吧,这实际上取决于您的特定情况。 如果您的团队是该界面的唯一用户/维护者,那么请按照您认为合适的方式对其进行修改,而忽略所有有关“最佳实践等等”的东西。 毕竟,这是您的代码...切勿在不了解其基本原理的情况下盲目遵循最佳实践。

现在,如果您要创建其他团队或客户可以使用的公共API(例如插件,扩展点或类似的东西),那么您必须对接口中的内容保持保守。 正如其他提到的那样,您可能必须在这些情况下添加_V2类型的接口。 Microsoft使用了多个Web浏览器COM接口。

Microsoft在Framework Design Guidelines中发布的准则仅仅是:PUBLIC接口准则。 不用于私人内部物品; 艰难,其中许多仍然适用。 知道什么适用于您的情况。

没有规则可以弥补常识的不足。

如果您的界面是与其他项目和团队共享的代码的一部分,请收听Cheeso。 但是,如果您的界面是私有项目的一部分,并且您可以访问所有更改点,那么您可能不需要界面开始,而是继续进行更改。

如果接口将要公开,我认为设计中需要格外小心,因为如果下一次迭代中大量代码突然中断,则对接口的更改将很困难。

接口的更改需要格外小心,因此,如果在初始发行版之后不必进行更改,那将是理想的选择。 这意味着,第一次迭代在设计方面将非常重要。

但是,如果需要更改,则实现接口更改的一种方法将是弃用旧方法,并为旧代码提供使用新设计功能的过渡路径。 这确实意味着不赞成使用的方法仍会停留在周围,以防止使用旧方法的代码被破坏-这不是理想的选择,因此这是“付出的代价”,因为它不能在第一时间正确使用。

昨天,在一个相关的问题上,我偶然发现了Joshua Bloch撰写的Google技术讲座: 如何设计良好的API及其 重要性 他负责Java Collection库等的设计和实现,并且是Effective Java的作者。

该视频大约有一个小时,他将详细介绍如何构成优质API的细节和示例,为什么我们应该制作设计良好的API等。 这是一个很好的视频,可以在考虑设计API时获得一些想法和启发,帮助您寻找某些东西。

稍后在接口中添加方法会立即中断该接口的所有实现,而这些实现并非偶然地实现了这些方法。 因此,请确保您的接口规范完整。 我建议您从该接口的(样本)客户端开始,该部分实际上使用实现该接口的类的实例。 无论客户端需要什么,都必须是接口的一部分(显然)。 然后,对接口进行一个(示例)实现,并查看通常可以使用和可用的其他方法(在可能的其他实现中),因此它们也应该是接口的一部分。 检查对称性的完整性(例如,如果有一个“ openXYZ”,也应该有一个“ closeXYZ”。如果有一个“ addFooBar”,应该有一个“ removeFooBar”等。)如果可能,请让同事检查您的规格。

并且:确保您确实想要一个接口。 也许抽象基类更适合您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM