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对象.
所以我会用:
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芝士汉堡(这是解释继承时使用的传统动词).
你必须要理解的第一件事是名字中的"I"并不是指代词"I",而是遵循接口以大写字母"I"开头的命名标准.
从这个意义上说,接口实际上被命名为"HasContent","HasValue"等,因此不要将其更改为"HaveContent"和"HaveValue",因为这样会很尴尬.
话虽如此,我无法确切地看到这些接口的用途.接口(根据定义)旨在强制实现它的所有类的条件,我不确定这些接口是强制执行的 - 所有类都有一个函数调用HasContent()?
我认为你应该专注于有is a关系的接口.当您声明一个实现该接口的类时IList,您并不是暗示您的类有一个列表,而是您的类是一个列表.
因此,例如,其中之一是IHasGeometry...好,这给了我以检查它是否具有几何形状的能力,但我会实事求是地只想处理与数字的几何图形,所以我会创建一个名为接口IGeometricFigure代替,从而将其用途限制在任何以几何图形为基础的东西上.
我同意这些名称听起来很尴尬,但我认为这更多是因为这些界面被用于尴尬的目的,而不是因为它们的名称不正确.
您最初的接口名称列表听起来完全正确。接口名称应描述合同。例如,这是我最近遇到的一个我非常喜欢的界面:
public interface IDeterminesEmptyValue
{
bool IsEmpty { get; }
}
Run Code Online (Sandbox Code Playgroud)
完美的!这个名字说明了一切。“I”指的是它是一个接口,其余部分描述了合约将完成的内容。
如果接口被调用IEmptyValue,则意味着接口保证实现者是一个空值。它不是 - 它有能力确定一个值是否为空。
(可能)不会调用任何类DeterminesEmptyValue。但是可能有一千个类都有能力确定不同种类的值是否为空,并且这个接口让它们都以一种通用的方式被调用。
接口应该清楚地描述实现它的类的特定特性。在这种情况下IContent- 实施者是否有内容,或者实施者是内容?