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