我通常将我的C#接口命名为IThing
。我正在为IThing
创建一个扩展方法类,但我不知道该命名它。一方面,调用它ThingExtensions
似乎意味着它是某个Thing
类的扩展类,而不是IThing
接口。当按字母顺序查看文件时,它还使扩展类与其扩展的接口分开。另一方面,命名它IThingExtensions
使它看起来像是一个接口本身,而不是接口的扩展类。你会建议什么?
修改:没有Thing
类实现IThing
,以回应一些评论。
答案 0 :(得分:29)
我绝对更喜欢名称ThingExtensions
而不是IThingExtensions
。原因是大多数程序员在类型上使用I
前缀意味着它是一个接口。这是一种非常常见的模式,也是.Net设计指南的一部分。
为扩展方法案例添加I
前缀会破坏假设和既定准则。
the Base Class Library中也有优先权。 IEnumerable
可用的大部分扩展方法都包含在Enumerable
类型中。
答案 1 :(得分:15)
我个人会使用IThingExtensions
。
从可用性的角度来看,最终用户永远不会看到这个类 - 他们只包含它的命名空间。如果命名空间与IThing
相同,则无关紧要 - 他们已经拥有它。
话虽如此,我认为这些是任何IThing
的扩展,这使得IThingExtensions
最清晰。如果您有一个Thing
类,调用此ThingExtensions
可能看起来不明确(您是在扩展接口还是实现本身?)。
话虽如此,该框架使用了一种非常不同的方法。框架的方法是使用名为Thing
的类来扩展IThing
。有关示例,请参阅Enumerable(扩展IEnumerable
)和Queryable(扩展IQueryable
)。这也是一个非常好的选择。
答案 2 :(得分:3)
我认识的大多数程序员都将应用程序的所有扩展方法放在一个名为ExtensionMethods
的静态类(或类似的东西)中,,无论扩展名修改了哪个类,然后他们将这个类放入主程序命名空间。
他们的基本原理是,如果你将扩展方法放在与它修改的类相同的命名空间中,你可以将该方法与作为实际类的一部分的方法混淆,这表明扩展方法是原始功能,当它不是。
当然,他们对此并不是普遍的协议。见这里:How do you manage the namespaces of your extension methods?答案 3 :(得分:3)
我采用了稍微不同的方法,而不是后缀Extension
将命名策略转换为前缀包含Extend
扩展方法的类;我的理由如下:
static
,因此您永远不会实例化它们。因此,就命名而言,你永远不会得到new ExtendThing()
的语义怪异。Extend*
类都通过alpha文件排序进行可视化分组。 ExtendThing
和 ExtendIThing
和(IMO)明确他们的意图和目标。namespace MyCompany.Extensions
{
public static class ExtendObject { }
public static class ExtendDateTime { }
public static class ExtendIEnumerable { }
}
答案 4 :(得分:0)
我更希望将其放在名为Extensions
的文件夹(和命名空间)中,并将其命名为IThingExtensions
。
答案 5 :(得分:0)
我不知道有任何标准惯例。我会使用ThingExtensions或ThingInterfaceExtensions。我建议您远离IThingExtensions。