就是那个问题?那么在开发ac#项目时不使用这个约定有多大的罪过?此约定广泛用于.NET类库中.但是,至少我不是一个粉丝,不仅仅是出于理由,而且我认为它没有任何贡献.例如IPSec是PSec的接口吗?是IIOPConnection IOPConnection的接口,我通常去定义找出来.
所以不会使用这种惯例导致混淆?
有没有删除此约定的c#项目或库?
做任何混合约定的c#项目,不幸的是Apache Wicket呢?
Java类库已经存在多年没有这个了,我觉得如果没有它我就一直在努力阅读代码.此外,界面应该不是最原始的描述?我的意思是IList 作为c#中List 的接口,是不是更好的有List 和LinkedList 或ArrayList 甚至CopyOnWriteArrayList ?这些类描述了实现?我想我在这里得到的信息比我在c#中的List 中得到的更多.
1> Ham Vocke..:
Java和C#之间的区别在于Java允许您轻松区分是实现接口还是扩展类,因为它具有相应的关键字implements
和extends
.
由于C#只能:
表达实现或扩展,我建议遵循标准并在接口名称之前加上I.
在Java中,'implements'关键字只在类中可见,它实现它,而不是在期望ISomething的方法中.你很少看一下实施课的第一行,对吗?
这是一个相当合理的论点,从未真正考虑过那里的冲突.
2> user unknown..:
我的opionion也是不好的做法.除了你的原因之外的原因是:
接口的整个目的是抽象出实现细节.因此,如果使用IParam或Param调用方法,则无关紧要.
精心设计的工具有自己的可能性来标记带有图标的界面.
如果您的目光是在IDE中搜索名称,则最重要的部分是字符串的开头.也许你的课程按字母顺序排序,现在你有一个相似名字的块,所有这些都是从...开始.它们看起来很相似,但很容易区分它们.使用I前缀是符合人体工程学的错误.
更烦人的是:ImplList,ImplThat,AFoo用于抽象Foo,AImplFooBar用于抽象Foo,它实现了Bar?SSomething为Singleton,还是SMath为静态类?停下来!:)
@dbemerlin这就是为什么"I"约定是坏的,你不知道它的接口,你只知道字符串"IDriver"标识类型,编译器不强制执行约定.除此之外,重点是你不应该关心它是一个接口还是一个抽象类.它应该是透明的.
我不得不说我同意在这个答案中提出的论点,如果该惯例在.NET中没有广泛使用我甚至不会问这个问题,它似乎有点多余.类型层次结构的全部意义在于它无论如何都应该是透明的.为什么我会以不同于抽象类或具体类的方式与引用进行交互.另外,我确定一个不以"I"开头的类型不是接口吗?并不是的.
与抽象基类相比,IMHO接口具有无法抽象的一个方面,即使在Java中也是如此。require实现而不是扩展(Java =>实现<=>扩展)。示例:如果要创建FileSystemDriver,并且仅知道其他方法需要“ Driver”。如果不检查文档,则无法知道您是需要实施文档还是直接继承文档。如果他们需要“ IDriver”,那么您就知道它是一个接口,可以立即开始实施。关于按字母排序:我更喜欢按名称空间排序,可以解决此问题。
我不同意这个答案中的所有内容.知道界面是否是某种东西很重要,并且有一个前缀可以让您轻松一目了然地确切知道它是什么.
3> Polyfun..:
尊敬的是,在您的帖子中,您只考虑您的需求(我,我,我),而不是您的代码读者的需求.如果你是一个单独的商店,那么公平,但如果你的代码曾经被其他人读过,那么考虑他们将期望接口有一个I前缀 - 这就是它在.Net中的方式,以及现在有太多人习惯改变它.
此外,如果您为类使用更易读的名称,这将有所帮助.什么是PSec?当我甚至不知道PSec是什么时,我如何判断IPSec是否是一个接口?如果将PSec重命名为例如PersonalSecurity,那么IPersonalSecurity更可能是一个界面.
Microsoft样式指南说包含Term IPSec的类或方法应该是Cased IpSec,所以IPSec必须是一个接口,因为P是大写的,这意味着它是单词/缩写的开头.请参阅HTTP(=> Http),HTML(=> Html),XML(=> Xml)等.IOPConnection(=> IopConnection)也是如此.
为"代码读者的需求"+1
@dbemerlin实际上,他们说只有当首字母缩写词是3个或更多字母时,你应该小写后面的字母,2个字母的首字母缩略词要保持大写,因此.net类库有`System.Net.IPAddress`类:http:/ /msdn.microsoft.com/en-us/library/system.net.ipaddress%28v=vs.110%29.aspx(另外,我很惊讶没有人发现这个,自.Net framework 1.1以来该类已经存在)
4> Mat Mannion..:
使用I进行接口违背了接口imo的全部要点,它是一个连接器,您可以将不同的具体实现插入到依赖项中.
使用数据库的对象需要DataStore,而不是IDataStore,无论是获取DatabaseDataStore还是FileSystemDataStore或者插入其中的任何内容(或者用于测试的MockDataStore),都应该进行配置.
我没有看到那里的差异.Foo(IDataStore商店)和Foo(DataStore商店)可以做同样的事情,只有一种情况是接口名称以I为前缀.你仍然可以传递一个DatabaseDataStore或FileSystemDataStore,它们只是用I前缀实现IDataStore.
根据该逻辑,您应该在所有变量前面加上其类型的第一个字母.boolean enabled应该是boolean bEnabled,int iCount等等.在我看来,它就像一个非常过时的编码实践.
5> alimbada..:
阅读本文并继续.如果您使用的是Java,请遵循Java命名约定.