干嘛不去掉“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”里不是。

[英文原文:Why drop the I if you’re going to just add an Impl? ]

11 Responses to 干嘛不去掉“I”和“Impl”?

  1. zoujia says:

    其实这个完全是看个人习惯,还有团队约定,当你习惯了使用I放在接口前面时,这就是一种对于你而已最好的方式!!\(^o^)/~

  2. Sweet says:

    我也习惯了接口前面加个I,但是也很讨厌实现后面加Impl

  3. J says:

    看到I 就知道是接口,看到Impl就知道是接口实现~~不需要想更多的东西,就知道是……

  4. Roger Xu says:

    规范中带点个性,正是我所追求的,程序员应该使生活更美好,包括是我们自己的编程生活更多彩,乐趣横生!

  5. Alex Zhou says:

    习惯加Impl了,以前尝试过写I开头的,后来慢慢又加Impl了。

  6. 胡阳 says:

    习惯使用impl的飘过

  7. momo5269 says:

    一般的 匈牙利命名法….. 据joel说这完全是由于理解和沟通造成的误解用法

  8. a says:

    你是程序员,是设计师,没人给你带镣铐一定要或者不要写 “I”/“Impl”。

    如果你搞不懂 “I”/“Impl” 是用来做什么的,就不要在那里瞎说。

  9. Yonghang Jiang says:

    很多时候用I或者Impl只是为了让一个类有一个抽象基类,从而实现解耦和单元测试。如果眼下基类只有一个派生类,那基类多个I或者派生类多个Impl是很简单的实现方式。
    以后如果需要变化,只要用重构工具把基类或派生类重命名即可,一眨眼工夫。

  10. kai-zhou says:

    不是习惯用I
    去掉了不容易看出来是接口啊

回复 胡阳 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注