首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >命名约定:如何命名同一类的不同版本?

命名约定:如何命名同一类的不同版本?
EN

Stack Overflow用户
提问于 2016-03-03 07:39:24
回答 5查看 4.5K关注 0票数 9

我有一个类MyClass,它在实现中有一个错误。类是库的一部分,所以我不能更改类的实现,因为它将悄悄地更改现有客户端的行为(在本例中,客户端可能依赖于bug:例如,请参阅(https://connect.microsoft.com/VisualStudio/feedback/details/790160/httpclient-throws-operationcanceledexception-insead-of-timeoutexception))

我需要创建同一个类的第二个版本,其中包括bug修复。我以前见过这样的情况,但是我看到的命名总是递增的,比如MyClass2MyClass3

这些情况可能非常罕见,但是我想知道是否有更好的方法来命名这些“版本化”类。我设想的解决方案会随着时间的推移而增长,并且有多个这类类型的类,这可能会让人感到困惑,尤其是对于库来说。我想象自己必须在MyClassMyClassV2MyClassV3等之间做出选择。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-03 07:55:18

我想知道是否有更好的方法来命名这些“版本化”类。

对于“修复其他类中的错误的类”,没有.NET命名约定。我会在你的工作场所向其他开发人员提供建议,看看他们是否有这样的公司惯例。我认为一致性比实际名称更重要。

另外,关于你的问题,我根本不会创建一个新的类。我将用DeprecatedAttribute标记该方法,并在同一个类中实现逻辑,公开一组新的API方法,这些方法被正确地记录下来,以声明它们在这里是一个修复程序。您库的客户端可能已经熟悉了MyClass,这样做将简化对它们的使用,使它们每次都需要问自己“应该使用哪个版本”。

票数 4
EN

Stack Overflow用户

发布于 2016-03-03 08:21:27

在理想的世界中,新版本将引入额外的功能,同时仍然保持100%的向后兼容性与以前版本的API。不幸的是,理想的世界仍然难以捉摸,而且并不总是能够保持完全的向后兼容性。在这种情况下,版本后缀是适当的模式。

标准的.NET命名约定是使用增量编号,如ClassClass2Class3等。这来自COM接口的命名约定,它正是为您所描述的用例设计的。例如,IHTMLDocument接口目前有8个版本,从IHTMLDocumentIHTMLDocument8

由Cwalina和Abrams撰写的最初的https://rads.stackoverflow.com/amzn/click/com/0321545613书明确推荐了这种做法,作者必须这样说:

DO使用数字后缀来指示现有API的新版本,如果该API的现有名称是唯一有意义的名称(即,它是行业标准),那么添加任何有意义的后缀(或更改名称)都不是合适的选择。 //旧API过时(“此类型已过时。请使用同一类的新版本,X509Certificate2。”公共类X509Certificate {.} //新API公共类X509Certificate2 {.}

旧的惯例是将后缀Ex添加到API的新版本和改进版本中,这个版本来自于“扩展”一词。然而,这并不能很好地扩展,导致函数的后缀ExEx令人困惑。我不认为有一个ExExEx;每个人都害怕接触那些API。“框架设计指南”明确建议反对这种做法,那些已经学到经验教训的架构师.NET:

不使用"Ex“(或类似的)后缀作为标识符,以区别于同一API的早期版本。 过时(“这种类型过时了.”公共类Car {.} //新API公共类CarEx {.} //公共类CarNew {.} //公共类Car2 {.} //正确方式公共类汽车{.} //正确方式

显然,正如他们最后的代码示例所暗示的那样,如果要在API的新版本中添加对特定特性的支持,最好用引用该特定特性来命名新的类/接口。

虽然上面的内容几乎完全集中在类和接口上,但同样的逻辑也适用于可能在以后的修订版中添加的该类的任何成员函数。原始函数可以保留其原始名称,新添加的函数具有反映其迭代或添加功能的不同名称。

票数 17
EN

Stack Overflow用户

发布于 2016-03-03 07:48:36

我会将现有类的所有行为复制到新类,重命名原始类以表示类已过时,将新类重命名为以前的实际名称,并将原始类(现在使用新名称)标记为[Obsolete],指示不再使用它。因此,所有消耗代码都会自动调用新的行为。因此,具有正确行为的新类将获得原始类的名称,例如,buggy类获得版本号。

对于遗留代码,您可以执行相反的操作,使用新名称创建一个新类,并将旧类标记为Obsolete。我知道SDK有一个版本号,最后一个数字表示类的最新版本,所有其他类都有这样一个属性,同时在文档中有一个通知,其中提到类被一个新版本所取代。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35776519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档