【问题标题】:Recommendations for naming C# classes/methods intended to replace existing APIs命名旨在替换现有 API 的 C# 类/方法的建议
【发布时间】:2009-11-27 23:29:26
【问题描述】:

除了冗长的解释之外,我有一种情况,我需要基本上重新实现一个 .NET 框架类,以便以与继承或组合/委托策略不兼容的方式扩展行为。问题不在于我要采取的行动是否是您会做或推荐的事情,而是命名/编码风格的问题。

是否有一种范式来命名与现有类或方法具有相同功能的类和方法(按照 C++ 中存在的 ClassEx/MethodEx 约定)?

[编辑] 我知道为此选择好名字很重要......我还没有编写任何代码,而是花时间思考我将要承担的后果,其中包括寻找一个明确的,描述性的,名称,同时尽量简洁。问题是我想到的名字并不是非常简洁。 [/编辑]

【问题讨论】:

  • 约定是“不要在名称后附加“Ex”。编写适当的 API。在 C++ 中也是如此,但微软从未遵循通用的 C++ 准则(当然,他们有与 C 兼容,没有重载或其他可以解决问题的功能)
  • 我知道整个 Ex 概念是一个负值命题,在我要做 C++ 编程的日子里,我从来没有关心过它……主要是我在寻找一种方法避免命名歧义/冲突,因为两个命名空间(原始 .NET 类以及我的扩展)都将被使用。我也不是别名 usings 的忠实粉丝。我有一个名字,不会冲突,但它有点满嘴巴。

标签: c# c++ coding-style naming-conventions


【解决方案1】:

以下是我在 .NET Framework 本身中看到的方式:

  1. 称它为稍有不同的名称,但不要使用任何特定的后缀。例如,System.TimeZoneInfo 被引入以取代 System.TimeZone

  2. 将其放在另一个命名空间中。例如,WPF Button 位于 System.Windows 而不是 System.Windows.Forms

  3. 后缀为数字。例如 X509Certificate2X509Certificate。 (这种做法在 COM 接口中很常见,但在 .NET 中已失宠。)

请注意,TimeZoneInfo 的命名是微软正面解决这一争议性命名问题的公开案例。请参阅和http://blogs.msdn.com/kathykam/archive/2007/03/28/bye-bye-system-timezone2-hello-system-timezoneinfo.aspxhttp://blogs.msdn.com/kcwalina/archive/2006/10/06/TimeZone2Naming.aspx 了解详细信息。

【讨论】:

  • 良好的链接...我特别感谢 Krzysztof Cwalina 的博客文章。他的框架设计指南一书非常值得一读。
【解决方案2】:

尝试用真正的含义命名你的类/方法。

例如,如果您扩展 Random 功能以创建随机字符串,请将类命名为 StringRandom 或 StringRandomizer 等。

如果您使用适用于特定类/接口的通用扩展方法编写类,例如 IList,请将其命名为 ListExtensions。

如果您编写 random.Next 方法返回 minValue 和 maxValue 之间的随机数,包括 maxValue,请将方法命名为 NextIncludingMaxValue。

如果你写的是线程安全的 queue.Dequeue 方法,命名为 if DequeueThreadSafe。

如果您编写 queue.Dequeue 方法,该方法会阻塞直到其他线程将项目入队,请将其命名为 DequeueBlocking。

还有这样的……

【讨论】:

    【解决方案3】:

    在大多数情况下,C# 完全避免了这些情况,因为您可以轻松地使用新方法扩展类而不会破坏二进制兼容性(您可以随意将方法添加到类,而不是接口) ,并通过使用扩展方法。

    与 C++ 不同,在 C# 中执行此操作的理由很少。在 C++ 中,添加方法会破坏兼容性,因此“Ex”成为更常见的场景。

    【讨论】:

      【解决方案4】:

      我给我所有的方法(和属性)camelCase 名称:例如,Invalidate 是一个框架方法名称,invalidate 是我的一个方法的名称。

      这(使用驼峰命名法)非常规,所以有人反对,但我觉得它很方便。

      类名没有这样的问题(我使用传统的大写),因为类名有它们的命名空间来区分它们与框架类。

      【讨论】:

      • 最后一点,命名空间不是灵丹妙药。请考虑以下事项:无论出于何种原因,您决定用您的类 YourCompany.Web.UI.WebControls.Foo 替换名为 System.Web.UI.WebControls.Foo 的 Web 控件。在 ASP.NET 中,不“使用”System.Web.UI.WeCcontrols 是愚蠢的,如果您想通过代码隐藏使用您的控件,您将“使用”YourCompany.Web.UI.WebControls。您现在在当前范围中有两个同名的符号......每个符号都有一个 Foo 。我不关心“使用”别名和绝对引用......所以类名很重要。
      • 如果我替换一个类,它往往具有额外的类似装饰器的功能(可以消除其名称的歧义:例如,它不是 Foo,它是 FooWithTooltips),或者它被用来代替(不是as) 另一个类(例如,它是 ClientSideProxy.Foo,而不是 ServerSideImplementation.Foo)。我不是说你错了,只是我从来没有遇到过和你一样的问题。
      • 您可以做的另外两件事:a) 根本不使用using 语句,而是在代码中使用命名空间限定的类名(例如MyNamespace.Foo);或者,b) 使用 using` 语句用类名省略命名空间名称(例如 using MyNamespaceFoo = MyNamespace.Foo;)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多