`
找不着北
  • 浏览: 310588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

干嘛不去掉“I”和“Impl”?

阅读更多

         今天早上我仔细研究TopShelf项目的源代码,想追查里面一个API的修改,突然发现TopShelf终于向新近流行的去掉接口名称上的“I”字母做法屈服了。在.NET上这还是个新事物,使用Java的人这样做了有一段时间了,但在.NET里很多都还是新事物。这些可不是从ruby偷来的。

      如果你对此不太熟悉,我先解释一下,传统的习惯是在接口的名称前加入一个毫无必要的“I”字母,事实上这个接口的使用者并不在意这个接口前是否有个“I”字母,这种加入“I”字母的形式是一种匈牙利标记法,文明世界里几乎一致认为这是一种糟糕的做法。

所以你的代码…

1 public interface ISomeBehavior { }

..应该写成..

1 public interface SomeBehavior { }

这样合情合理。而有问题的是当你把一个实现这个接口的类像下面这样命名时:

1 public interface SomeBehavior { }
2 public class SomeBehaviorImpl { }

我不知道把接口上的“I”移到实现类上然后再加三个字母究竟有什么好处。除了让我的指头关节多活动几下还能做什么?难道这个程序的使用方还在意这是一个没有“I”的接口实现类吗?

从一些基础层面上讲,接口就是个契约。契约声明一个类要实现接口提供的特定用途的一些方法和属性。从另一个角度看这个问题可以观察接口的行为。

考察一下.NET里提供的IDisposable这个接口。没有一个DisposableImpl伴随着它。这个接口描述的是一个实现类型的特征,它可以代表任何的东西。

接口跟实现类并不是一对一的关系。事实上,一个类可以实现多个接口。引用Brett L. Schuchert的例子:

1 class Manager : public ISing, public IDance {}

保持简洁的接口,让manager们尽情放纵

我相信你看到这里已经露出愤怒的表情了,会想“那好,聪明人,你想让我们怎么做?”

对于我,我喜欢这个“I”字母,但喜欢的是它读起来像一种声明。

1 public interface IReadFiles { } //我读取文件
2 public interface ICalculateRates { } //我计算比例
3 public interface ISingAndDance { //我唱歌跳舞}

你会发现这和传统的“I”/“Impl”用法相反。但这很酷不是?每个“I”都代表我,但这该死的“Impl”里不是。

 

:)

59
57
分享到:
评论
22 楼 damoqiongqiu 2011-06-13  
有时候单词会很长很长,在接口前面加个I还凑合,关键问题是,如果每个实现类都加Impl,实在让人蛋疼有木有???
21 楼 whaosoft 2011-05-30  
  程序开发也要想想便利性 可读性 规范性
20 楼 lifangling_2010 2011-05-27  
当然是 接口加 IHelloService 实现类 则不加impl
19 楼 newlethe 2011-05-27  
你的不是最好的,适合团队的习惯的才是最好的
18 楼 grape927 2011-05-26  
查找接口的时候比较方便。
17 楼 shameant 2011-05-24  
如果一个公司代码规范如此写,统一了有何不可,你所说的多敲几个字母,难道你写代码都不用快截键的?那效率也太低了.
16 楼 chunquedong 2011-05-24  
Impl只在new表达式中出现,而I每次都要用。Impl比起I来不一定会让你指头关节多活动的。
I是接口,是要给用户看的契约,还是简洁些好。Impl要是不爽后期可以换掉,I则不行。
15 楼 andy_ghg 2011-05-24  
I可以有,但是impl就没必要了。

例如一个数据库操作类TopicsDAO,抽取出接口就是ITopicsDAO,如果你把前面的I去掉,那起步就有名称重复了么?
14 楼 ydwcn 2011-05-24  
我们接口从来没有加过I 
13 楼 snowolf819 2011-05-24  
我的习惯是接口不加I,但是在实现类上加Impl
12 楼 peigen 2011-05-24  
加‘I’有点怪,接口是给外人看的
'impl'还是可以接受的,实现给自己人看的,在类名上有个明确的区分

多数情况下接口和实现还是一对一的
11 楼 madbluesky 2011-05-23  
i会影响对接口意思的理解,如isomebody跟somebody理解哪个来的快一点呢,反正对于我来说对于第一个表示我需要一个翻译的过程,过一会才能知道是什么意思,而第2个表示就不需要多那么一瞬,这么一瞬看起来很小,但足够恶心。

我强烈赞同面向接口编程应该表述成面向抽象编程,用类来抽象或用接口来抽象是不重要的。
10 楼 redstarofsleep 2011-05-23  
我想知道去掉了I和impl那么怎么命名呢?类和接口不就是同一个名字了吗?
9 楼 yobuke 2011-05-23  
不是很好嘛?去掉的话不太直观了。
8 楼 KimHo 2011-05-23  
个人感觉多几个字母,语义更加清晰,没什么不好的
7 楼 飞雪无情 2011-05-23  
skzr.org 写道
文中提到也就是多写了个I和Impl罢了。

不过I代表接口,Impl代表接口的实现,这个约定还是蛮好的。不就是多写了几个字母罢了 ^ ^

sammor 写道
我个人觉得看到lmpl,让我的第一个反应是,这个类,有对应的一个接口,有何不可?但要不要加这个,我觉得要看情况来加吧。



就是这么个观点,方便自己也方便他人,不过就多了几个字母而已。
6 楼 kala888 2011-05-23  
implements ...impl
5 楼 子衿青青 2011-05-23  
sammor 写道
我个人觉得看到lmpl,让我的第一个反应是,这个类,有对应的一个接口,有何不可?但要不要加这个,我觉得要看情况来加吧。

skzr.org 写道
文中提到也就是多写了个I和Impl罢了。
不过I代表接口,Impl代表接口的实现,这个约定还是蛮好的。不就是多写了几个字母罢了 ^ ^


加个I和Impl只是为了区别一下,方便查找,完全看个人习惯,你想加就加,不想加就不加,还可以换成别的字母和word加上,都没关系的,怎么方便怎么用贝
4 楼 liupengtao 2011-05-23  
感觉楼主个人主观性太强了。
3 楼 Tyler_Long 2011-05-23  
你平时都上什么英文技术网站? 你这个文章是从哪里翻译过来的? 能否分享个地址?

相关推荐

Global site tag (gtag.js) - Google Analytics