这个命名惯例背后的理由是什么?
我没有看到任何好处.额外的前缀只会污染API.
我的想法是内嵌康拉德的响应该相关问题 ; 所选择的答案主要是我在这里要求的.
完全相反,命名约定清楚地标识了一个接口.
例如,如果你有:
public class Dog : IPet, IMammal { ....
仅仅是阅读它,我可以放心地假设IPet和IMammal可能是接口.
.NET CLR允许单类继承.所以,如果我有一个基类..我只能从它继承一个类.让我们将IPet接口更改为基类.现在我们的示例变为
public class Dog : Pet, IMammal { ....
我继承Pet类并实现IMammal接口.
如果我们按照你的建议去做并删除了字母"我",我们就有这个:
public class Dog : Pet, Mammal { ....
哪一个是我继承的班级?我正在实施哪个界面?这让人感到困惑吧?(仅供参考.你应该把基类放在第一位,所以你可以争论这一点......但是如果你想要从界面名称前面删除字母I我怀疑你也遵循这种做法)
正如您所看到的那样,命名约定很容易告诉我很多关于我的对象的事情,而不必进一步调查.我可以很容易地看到我继承的内容与我正在实施的内容.
我也喜欢它,因为我可以把它读作"我动词行为",如"ICanSave"或"IDoDoubleEntry"等......
我认为IInterface命名约定很愚蠢.这是匈牙利符号的一个例子,我赞同鄙视匈牙利符号的思想学派.如果您的接口只有一个具有相同名称的实现,请考虑这可能是代码异味.
但是,我仍然使用它,因为在这种情况下,Microsoft推荐使用IInterface,并且"标准优于更好".
为什么这不是语法高亮而不是匈牙利符号的功能?如果区分类和接口如此重要,那么为什么IDE不会仅仅使用引用接口的标识符.我讨厌在字段之前放" "或"m ",在课前放" C"等等.更糟糕的是,它鼓励程序员编写非常糟糕的API,例如:
public class List : IList
而不是更合理:
public class LinkedList : List public class ArrayList : List public class HashList : List
即使是.NET普通类作者也陷入了这个陷阱.类名永远不应该是只删除了"I"的接口的名称.类名应始终告诉用户类与接口的其他可能实现的不同之处.因为这个原因我投票放弃了愚蠢的"我".
此外,当我使用intellisense时,我想按功能区域分组,而不是它是一个类还是接口.我从不认为,"我需要一个界面,而不是一个类." 我一直认为,"我需要做X的东西".
实际上我发现避免命名冲突很有用,例如我可能会创建一个名为Fred的具体类来实现IFred
我一直认为将动词用于行为界面很有趣。这与使用名词的类命名约定有所不同,但是它允许类“讲”其行为。
class Dog: IBark
对于WCF接口之类的结构化接口,这不太好用,但是我们并不需要一直保持乐趣。
回答您的问题,将其I
视为“实现”,那么...
class DogDataService : Dog, IDataService
该服务类继承Dog
并实现IDataService
我仍然没有真正回答您的问题,但是这I
很有用,因为您会在名称空间,类和接口之间发生命名冲突。
namespace DataService interface DataService class DataService: DataService
所以最终
namespace DataServices interface IDataService class DataService : IDataService
我认为实际上这是一个理智的惯例。