Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何给出更清晰的接口名称?_C#_.net_Interface_Naming - Fatal编程技术网

C# 如何给出更清晰的接口名称?

C# 如何给出更清晰的接口名称?,c#,.net,interface,naming,C#,.net,Interface,Naming,我在一个应用程序中看到它有如下接口: IHasContent IHasValue IHasMesh IHasGeometry IHasTransformation 不应该吗 IHaveContent IHaveValue ... 还是 就我个人而言,我倾向于让他们: IContent IValue IMesh IGeometry ITransform 因为ISomething不是已经暗示它有某物了吗 至于最后一个,我应该改为ITransformable 我认为使用I+(Has/Have/I

我在一个应用程序中看到它有如下接口:

IHasContent
IHasValue
IHasMesh
IHasGeometry
IHasTransformation
不应该吗

IHaveContent
IHaveValue
...
还是

就我个人而言,我倾向于让他们:

IContent
IValue
IMesh
IGeometry
ITransform
因为
ISomething
不是已经暗示它有
某物了吗

至于最后一个,我应该改为
ITransformable

我认为使用
I+(Has/Have/Include/Exist等)+Name
会使接口名称更加混乱


关于如何想出更好的界面名称,既不觉得尴尬,又切中要害,并且能让人理解其含义的任何想法?

您首先要了解的是,名字中的“I”不是指代名词“I”,而是遵循以大写字母“I”开头的命名标准

从这个意义上讲,接口实际上被命名为“HasContent”、“HasValue”等等,所以不要将其更改为“HaveContent”和“HaveValue”,因为那样会很尴尬

话虽如此,我无法确切地看到这些接口的用途。接口(根据定义)旨在对实现它的所有类强制一个条件,我不确定这些接口强制的是什么——所有类都有一个名为
HasContent()
的函数

我认为您应该将重点放在具有
关系的接口上。当您声明一个实现接口IList的类时,并不意味着您的类有一个列表,而是意味着您的类是一个列表

例如,其中一个是
IHasGeometry
…这使我能够检查它是否有几何图形,但实际上我只想处理几何图形,所以我会创建一个名为
IGeometricFigure
的接口,因此,它的用途仅限于对几何图形进行操作的任何东西


我同意这些名称听起来很尴尬,但我认为这更多是因为这些接口被用于一个尴尬的目的,而不是因为它们的名称不正确。

我个人喜欢IHas+Word,因为接口名称描述了实现它们的类的属性。 例如:

public class Lolcat : IHasCheezburger
当我读到这篇文章时,我很容易理解棒棒糖猫里面有奶酪汉堡

另一方面,

public class Lolcat : ICheezburger

让我想知道lolcats是否有奶酪汉堡或是奶酪汉堡(这是解释继承时使用的传统动词)。

您最初列出的接口名称听起来完全正确。接口名称应描述合同。例如,这是我最近遇到的一个我非常喜欢的界面:

public interface IDeterminesEmptyValue
{
    bool IsEmpty { get; }
}
太好了!名字说明了一切。“I”是指它是一个接口,其余部分描述了合同将实现的内容

如果接口被调用为
IEmptyValue
,则意味着接口保证实现者是空值。它不是-它能够确定值是否为空

(可能)不会调用任何类
DeterminesEmptyValue
。但是可能有一千个类都有能力确定不同类型的值是否为空,这个接口允许以一种通用的方式调用它们

接口应该清楚地描述实现它的类的特定特性。在
IContent
的情况下-实现者有内容,还是实现者有内容?

I不代表“我”。它只是代表接口

但是微软有自己的命名接口

名称之间的差异仅限于 接口名称上的字母I前缀

其中一些名称(内容、值等)含糊不清,几乎无法描述项目的内容/行为。一般来说,名称应尽可能具体和独特-IScriptParameter可能比IValue更具描述性。随着项目的发展,具有更多描述性名称将使您的类型更容易区分(如果您不小心,最终可能会使用IValue、INumber和IAmount来处理“值”的变化!)

如果界面(例如IMesh)的意思是“提供网格的属性”,那么IMesh是一个非常好的名称-它描述了一个事实,即您可以将对象视为网格

如果你的接口被用来应用一个动作(例如将对象渲染为网格,或者对对象应用变换),那么考虑使用动词/形容词而不是名词命名(例如,不可渲染的,可变形的)-这是.NET中的一个常见的模式(I枚举(动词/形容词),而不是ICLIONECT(名词))< /P> 对我来说,“IHasMesh”听起来更像IMeshContainer——也就是说,它是一个包含网格的对象,接口允许我“获取网格”。因此,它不允许我对网格内的数据进行操作或查询,而只是通过接口获取整个网格对象

因此,我将使用:

  • ITransformable如果对象可以通过接口进行转换
  • ITransform如果对象可以像变换一样直接使用
  • iAstransForm/ITransformContainer/ITransformProvider如果对象是可以查询以提取变换对象的容器

我喜欢认为,
ISomething
意味着它是某物,比如在扮演某物的角色时,而不是它“拥有”或“包含”某物。所以,
IFather
的意思是“我扮演父亲的角色”,或者我就是父亲”<代码>IDispatcher
表示“我扮演调度员的角色”或“我是调度员”,等等


有些人喜欢命名接口来回答“我该做什么?”的问题:
IListenForEvents
ILogeExceptions

接口有很多用途,但有不同的用途
public interface IDeterminesEmptyValue
{
    bool IsEmpty { get; }
}