面向对象和面向接口不矛盾。
面向接口是指当我们使用一个功能时,我们应该尽可能放弃不必要的假设和要求,比如“用一个容器来存储一串数字”,那么我们不应该提示额外要求“我们应该用一个 List 还是 Set” 而是尽量只提出要求 “我们需要一个容器”,这样一来,我们就用下面这样的方法,注意的是,c 的创建和使用可以是在不同的地方然后当成参数或成员变量传递给使用者,对于使用者来说“这是一个你想要的容器”,至于它具体是哪种容器使用者不应该关心它,如果使用者强制需要一个 Set 那么应该修改需求说明成为“我们需要一个保证唯一性的集合”;为什么我们尽量不提出非必要的要求呢?当软件越来越复杂或者或者达到松耦合的要求时我们应该尽量避免把一个东西弄成一个固定的样子,这防碍将来对它进行修改或扩充,“尽量只提出功能性的要求而不是限制别人必要把代码写成什么样子”,“功能性的要求”其实就是就是对应到面向对象的“接口”,一般来说当我们依赖其它人写的代码时我们应该把它看成一个组件,它的内部实现方法我们并不关心,只要求实现功能的人和使用功能的人使用了相同的接口就可以了,这就可以让实现功能的人发挥它的想象力在组件的性能和稳健性和灵活性及扩展性上有机会做到更好 ,如果你已经知道了并且依赖这个实现的细节那么这个组件的每次修改都可能导致使用它的代码产生新的问题,那么这就是一个严重的问题,软件的质量就不能保证,我们应该支持积木式的组件供应方法,只需要修改一个配置就成把一个组件替换成另一个,这就是 Spring 的配置文件给我们最直观的印象,这时使用这个组件的代码不会受到影响,比如同样一个加密的组件,使用不同的算法的安全程度和性能不同,但都能达到通信双方的安全要求,这样一来使用者的代码不需要知道细节也不用修改就能通过修改 Spring XML 达到替换加密组件的要求: |