再论机械式针对接口编程

两月前论及到 针对接口编程及敏捷编程,如今再一次老调重提。面向对象有一个很重要设计原则:

针对接口编程,而不是针对实现编程

这一原则关键在于理解什么是接口,请参照前文提到的上一篇。因为 Java 语言中有 interface 这个概念,于是 Java 的 interface 便躺枪了,好好的针对接口编程在 Java 中就机械式的变成了针对 interface 的编程。

以致于只要有实现的地方都可能变成像 UserDao.java(接口) 与 UserDaoImpl.java 成对出现,在以后的重构中基本上是为了实现而修改接口,这也进一步违背了针对接口编程的初衷,接口怎么一点也不稳固。

或许有人认为先声明一个 interface,然后我们可能会有多种实现(为将来考虑,不过多数时候只会是单一实现),这很像是 interface 存在的一个理由。可是当我们写下类似 UserDaoImpl 这个样的实现类名时直接宣告了该接口其实就只有一种实现,不然的话再加一个实现的话类名为哪般?UserDaoImpl2? 显然多种实现时 UserDaoImpl 需要重命名了。 阅读全文 >>

针对接口编程及敏捷编程

本文发自于对平时编程习惯上的一些个人见解,还不至于牵扯到方法学的层面,尽管如此,也可能会招来许多不同的看法,只要是觉得经世致用就行。首先从耳熟能详的针对接口编程说起

是否总是针对接口编程

在初通软件设计时,针对接口编程这一理念似乎是宇宙真理(软件世界里并没有真理部),而且对它的解释是

具体类包含实现细节,而抽象类则只呈现概念

当然很在理,也很权威。

但针对接口的前提是什么呢?是在设计一个与外部系统交互的 API 情况下。比如要提供一个用户注册接口给外部,可以共同约定好接口为

void register(String username, String password) throws RegistrationException;

  并且这个接口应该是稳固的,然后各自去实现或完成调用细节,即使实现未完成调用端也可以通过 Mock 来进行单元测试。

然而实际中对针对接口编程的理解很容易变为凡是非工具类,数据类都先声明一个接口挂单一实现类,类结构中就类似下面那样 阅读全文 >>