`
找不着北
  • 浏览: 318145 次
  • 性别: 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
分享到:
评论
2 楼 sammor 2011-05-23  
我个人觉得看到lmpl,让我的第一个反应是,这个类,有对应的一个接口,有何不可?但要不要加这个,我觉得要看情况来加吧。
1 楼 skzr.org 2011-05-23  
文中提到也就是多写了个I和Impl罢了。

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

相关推荐

    JAVA的impl实现层

    "JAVA实现DAO层和业务逻辑的impl实现层" 在JAVA中,实现DAO层和业务逻辑是非常重要的部分。impl实现层是指在业务逻辑层和持久层之间的桥梁,负责将业务逻辑转换为数据库操作。下面我们将详细介绍impl实现层的实现...

    开发工具 taglibs-standard-impl-1.2.5

    开发工具 taglibs-standard-impl-1.2.5开发工具 taglibs-standard-impl-1.2.5开发工具 taglibs-standard-impl-1.2.5开发工具 taglibs-standard-impl-1.2.5开发工具 taglibs-standard-impl-1.2.5开发工具 taglibs-...

    jsf-api.jar和jsf-impl.jar

    JSF API 和 JSF Impl 是JSF框架的核心组成部分。 **jsf-api.jar** 文件包含JSF框架的接口和抽象类,这些定义了JSF应用开发所需的主要API。开发者通常需要这个库来编译他们的JSF项目,因为编译时需要知道JSF提供的...

    jstl-api-1.2和jstl-impl-1.2

    jstl-api-1.2和jstl-impl-1.2,jstl-api-1.2和jstl-impl-1.2,jstl-api-1.2和jstl-impl-1.2,jstl-api-1.2和jstl-impl-1.2

    jaxb-impl-2.1.13.jar

    jaxb-impl-2.1.13.jar

    jjwt-impl-0.11.2-API文档-中文版.zip

    赠送jar包:jjwt-impl-0.11.2.jar; 赠送原API文档:jjwt-impl-0.11.2-javadoc.jar; 赠送源代码:jjwt-impl-0.11.2-sources.jar; 赠送Maven依赖信息文件:jjwt-impl-0.11.2.pom; 包含翻译后的API文档:jjwt-impl-...

    jstl-impl-1.2.jar.rar_ jstl-impl-1.2.jar _jstl-impl-1.2_jstl-imp

    "jstl.jar"可能是指JSTL的核心库,不包含具体实现,而"jstl-impl-1.2.jar"则包含了具体的实现,可以直接在服务器上运行。 压缩包子文件的文件名称列表中只列出了"jstl-impl-1.2.jar",这意味着这个压缩包仅包含JSTL...

    jstl-impl-1.2.jar

    jstl-api-1.2、jstl-impl-1.2.jar标签包,两份。

    jaxb-api-2.1.jar 和 jaxb-impl-2.1.8.jar

    `jaxb-api-2.1.jar` 和 `jaxb-impl-2.1.8.jar` 是Java应用程序中用于XML绑定(Java Architecture for XML Binding,简称JAXB)的重要库文件。JAXB是Java SE和Java EE平台的标准部分,它提供了一种将XML文档与Java...

    jstl-impl-1.2.jar和jstl-api-1.2.jar

    `jstl-impl.jar`通常包含Core、Format、Function、SQL和XML五个主要的标签库,每个库都有对应的标签和功能。 在实际项目中,为了使JSTL能够正常工作,这两个jar文件通常需要一起添加到项目的类路径(Classpath)中...

    jaxb-impl-2.1.jar

    jaxb-impl-2.1.jar

    jstl标签jar包(jstl-api-1.2和jstl-impl-1.2)

    这个包不包含实际的实现,而是为编译时类型检查和依赖管理提供接口定义。 2. **jstl-impl-1.2.jar**:这是JSTL的实现库,包含了实现JSTL API的具体类和方法。在运行时,Web应用程序需要这个库来执行JSTL标签的功能...

    avalon-framework-impl-4.3.1-API文档-中文版.zip

    赠送jar包:avalon-framework-impl-4.3.1.jar; 赠送原API文档:avalon-framework-impl-4.3.1-javadoc.jar; 赠送源代码:avalon-framework-impl-4.3.1-sources.jar; 赠送Maven依赖信息文件:avalon-framework-impl...

    cap_ffmpeg_impl.hpp

    参考 https://code.ros.org/trac/opencv/ticket/1020 中 ffmpeg_build.patch 和 ffmpeg_build_2.patch 对 cap_ffmpeg_impl.hpp文件中的出错变量进行替换, 附件是改好的cap_ffmpeg_impl.hpp,可直接替换同名原文件...

    jaxb-impl-2.0.3

    jaxb-impl-2.0.3.jar 可用包

    jjwt-impl-0.11.2-API文档-中英对照版.zip

    赠送jar包:jjwt-impl-0.11.2.jar; 赠送原API文档:jjwt-impl-0.11.2-javadoc.jar; 赠送源代码:jjwt-impl-0.11.2-sources.jar; 赠送Maven依赖信息文件:jjwt-impl-0.11.2.pom; 包含翻译后的API文档:jjwt-impl-...

    jstl-impl-1.2.2.jar

    jstl-impl-1.2.2.jar!

    impl, impl生成用于实现接口的方法存根.zip

    impl, impl生成用于实现接口的方法存根 impl 生成用于实现接口的方法存根。go get -u github.com/josharian/impl示例用法:$ impl 'f *File' io.ReadWriteCloserfunc (f *File

    aether-impl-1.9.zip

    总结起来,graphviz-maven-plugin和aether-impl-1.9都是Maven生态系统中的重要组件。前者通过图形化方式帮助开发者理解和管理项目的依赖关系,后者则提供了强大的仓库操作能力,使得处理依赖解析变得更加灵活高效。...

    jaxb-api jaxb-impl jar

    总之,JAXB是Java开发者处理XML数据的强大工具,而`jaxb-api.jar`和`jaxb-impl.jar`是其核心组件,提供了完整的API接口和实现。理解并熟练运用这两个库,能有效地提升处理XML数据的效率和质量。

Global site tag (gtag.js) - Google Analytics