如何提出更清晰的界面名称?

Joa*_*nge 17 .net c# naming interface

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

IHasContent
IHasValue
IHasMesh
IHasGeometry
IHasTransformation
Run Code Online (Sandbox Code Playgroud)

他们不应该吗?:

IHaveContent
IHaveValue
...
Run Code Online (Sandbox Code Playgroud)

要么?:

IIncludeContent
IIncludeValue
...
Run Code Online (Sandbox Code Playgroud)

我个人倾向于制作它们:

IContent
IValue
IMesh
IGeometry
ITransform
Run Code Online (Sandbox Code Playgroud)

因为还没有ISomething暗示它有那个something吗?

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

我认为使用I + (Has/Have/Include/Exist, etc) + Name会使界面名称更加混乱.

关于如何提出更好的界面名称的任何想法都不是很尴尬,是关键,并获得意义?

Jas*_*ams 30

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

如果您的界面(例如IMesh)意味着"提供网格的属性",则IMesh是一个非常好的名称 - 它描述了您可以将对象视为网格的事实.

如果您的界面用于应用动作(例如,将对象渲染为网格,或将变换应用于对象),则考虑使用动词/形容词而不是名词命名(例如IRenderable,ITransformable) - 这是.net中的常见模式(IEnumerable(动词/形容词)而不是ICollection(名词),例如)

对我来说,"IHasMesh"听起来更像是IMeshContainer - 即它是一个包含网格的对象,界面允许我"获取网格".所以它不允许我在网格中操作或查询数据,而只是通过接口获取整个Mesh对象.

所以我会用:

  • ITransformable如果对象可以转化经由接口
  • ITransform如果对象可以被直接使用,就象它是一个变换的
  • 如果对象是可以查询以提取Transform对象的容器,则为IHasTransform/ITransformContainer/ITransformProvider


tug*_*dum 15

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

public class Lolcat : IHasCheezburger
Run Code Online (Sandbox Code Playgroud)

当我读到的时候,我很容易理解lolcats里面有芝士汉堡.

另一方面,

public class Lolcat : ICheezburger
Run Code Online (Sandbox Code Playgroud)

让我想知道lolcats是否芝士汉堡或ARE芝士汉堡(这是解释继承时使用的传统动词).

  • 我不知道是笑还是同意...... :) (6认同)
  • @Joan是的.我不认为你可以在System命名空间中找到很多接口,你可以将`I`解释为代词.`I`是"Interface"的缩写,它用于区分接口和常规类(参见http://msdn.microsoft.com/en-us/library/8bc1fexb(v=vs.71).aspx) (4认同)
  • @Joan Venge,我并不是说这是普遍接受的,我说这是一个普遍*已知的*命名标准(与众所周知但永远讨厌的匈牙利符号相同). (2认同)

riw*_*alk 9

你必须要理解的第一件事是名字中的"I"并不是指代词"I",而是遵循接口以大写字母"I"开头的命名标准.

从这个意义上说,接口实际上被命名为"HasContent","HasValue"等,因此不要将其更改为"HaveContent"和"HaveValue",因为这样会很尴尬.

话虽如此,我无法确切地看到这些接口的用途.接口(根据定义)旨在强制实现它的所有类的条件,我不确定这些接口是强制执行的 - 所有类都有一个函数调用HasContent()

我认为你应该专注于有is a关系的接口.当您声明一个实现该接口的类时IList,您并不是暗示您的类一个列表,而是您的类是一个列表.

因此,例如,其中之一是IHasGeometry...好,这给了我以检查它是否具有几何形状的能力,但我会实事求是地只想处理与数字几何图形,所以我会创建一个名为接口IGeometricFigure代替,从而将其用途限制在任何以几何图形为基础的东西上.

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


Rex*_*x M 5

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

public interface IDeterminesEmptyValue
{
    bool IsEmpty { get; }
}
Run Code Online (Sandbox Code Playgroud)

完美的!这个名字说明了一切。“I”指的是它是一个接口,其余部分描述了合约将完成的内容。

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

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

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