No-intrusive, 非侵入式接口设计

Go语言的Interface很大不同于C#,Java这种OOP语言的,其强大之处之一在于非侵入式设计。


先引用一段基于C++的关于非侵入性的阐述 http://blog.csdn.net/chelsea/article/details/446298

基础复杂性是守恒的,需要解决的基本问题始终是需要解决的;最终的复杂性,却取决于基础复杂性彼此间的依赖,如果互相依赖,最终将得到指数级的复杂性,而 如果彼此独立,最终只是若干基础复杂性简单的累加,因此,程序需要更好的的Design和Organize,主要任务就是“降低模块间的依赖至最小”,而 对开发效率有重大影响的,主要是编译期依赖,为此,人们发明了若干技术来降低编译期依赖。

......

2,非侵入性

编译时对“引用”的类和接口定义的依赖,我们称之为“侵入性”的;任何显式的“接口”、“基类”都是侵入性的,不可避免的带来编译期依赖;即使这些依赖很小,但依然有办法而且应该尽可能消除

Java的法宝是反射,但效率低,并不具有类型安全性,因此,除非独立性和灵活性需求大于效率和类型安全需求的场合,一般不要使用反射;

而 在非侵入性问题上,C++有强大的语言机制--模板:类型安全并且效率无损;它不需要你做任何继承操作,只需要满足模板参数的概念约束,提供“语法兼容” 的调用即可;注意是“语法兼容”即可,这意味着你的函数可以是“static”的,也可以是“virtual”的,也可以什么都不是,只要签名一致就可 以; 比如在扩充STL时,你不需要include任何STL头文件

当然模块系统和非侵入性在解决依赖问题上是正交的;作为降低编译期依赖的有效机制,以模板参数的概念约束形成的模块接口,应得到更多应用


非侵入式设计是一个更广的概念,不同于IoC, DI, AOP等。

对于框架来讲:

一个客户端的代码可能包含框架功能和客户端自己的功能。
侵入式设计,就是设计者将框架功能“推”给客户端,而非侵入式设计,则是设计者将客户端的功能“拿”到框架中用。
侵入式设计有时候表现为客户端需要继承框架中的类,而非侵入式设计则表现为客户端实现框架提供的接口。
侵入式设计带来的最大缺陷是,当你决定重构你的代码时,发现之前写过的代码只能扔掉。而非侵入式设计则不然,之前写过的代码仍有价值。

Go语言的接口设计就是一种非侵入性的设计,作为服务提供者不用预先知道所需要实现的接口,也不用为了实现某一个接口而import一个专门的包。而接口可以被定义在客户端,按需求定义,同时接口与接口之间也可以相互赋值,这样就不用过多忧心接口的粒度,给接口设计带来了很大的灵活性。

这种非侵入性设计更符合自然模型,其依赖是单向的。作为服务的提供者,客观来讲很难预料到今后所需要的所有接口,同时也不应该被浸入客户端的逻辑,即不应该被植入许多客户端被定义的接口,甚至于客户端还未成型。同理,对客户端也是如此。


我们可以看到,Go的非侵入式接口这方面是解耦合的,完全可以按需求定义接口,使用时再注入实现。同时接口的实现方是完全独立的,这可以更简单的进行单元测试和复用。


IoC, DI, AOP 区别:http://stackoverflow.com/questions/2572158/what-is-aop-dependency-injection-and-inversion-of-control-in-simple-english

详细描述IoC和DI:http://martinfowler.com/articles/injection.html#FormsOfDependencyInjection

posted @ 2012-11-21 00:59  Gizak  阅读(1465)  评论(0)    收藏  举报