什么是控制反转(Inversion of Control)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yqj2065/article/details/51589813

【2018.7.7 最后编辑】

【2018.6.27】IoC我讲得很清楚,一个毫无意义的垃圾术语!让你们做实验,让你们体会。考试时,还有很多人写:“IoC不是什么技术,而是一种设计思想....”。是不是想死啊?

我没有兴趣批驳中文学院的文科生写的东西,我告诉你们正确的知识;哪些东西,一看就问题成堆。

我曾经为百度百科编辑了“控制反转”词条,又被反复改回去。不管那些人怎么搞,谁也不要采用它的垃圾解释

------------------------------------------------------------

正文(将纳入我的 不知道什么时候出版的书中)

对比两种情况——编写应用程序使用框架控制反转(Inversion of Control,IoC)[1]反映了某些应用程序员的失落心情:从自由自在变为受控于人。当SortTest作为上层模块(应用程序员编写SortTest),应用程序员决定测试逻辑、决定IntSort中的接口名字如sort();当SortTest和IntSort作为下层模块,应用程序员需要按照IntSort中的接口名编写@Override方法(编写的该方法,被称为回调函数),如果框架设计者为接口命名为soooooort(),应用程序员编写回调函数时,要注意数清楚o的个数

IoC仅仅说明,设计决定的控制权,由应用程序员转移到框架设计者手中。除此之外,没有任何其他含义。可以使用C语言、Scheme语言或Java语言等各种编程语言设计框架,因此,控制反转不是面向对象的专用名词。在程序设计中,程序员通常不会在意SortTest这个控制模块(或控制反转概念),而是更关注IntSort所表示的概念和技术——回调。因此IoC是一个没有太大价值的术语。

★控制反转/Ioc,反映了某些应用程序员的失落心情:从自由自在变为受控于人。它描述了一种现象:软件设计决定的控制权,由应用程序员转移到框架设计者手中。

但是,IoC这个垃圾术语,《设计模式》至少两次使用了它,[1.6.7设计应支持变化]和[5.10模板方法模式];而且,Martin Fowler在其著名文章Inversion of Control Containers and the Dependency Injection pattern中 ,也使用了该术语。这些使用案例,也使得IoC的含义变得含混;或者说,他们使得没有太大价值的术语IoC变得高大起来,同时使得IoC含义不清,不知所云。

(很多人对IoC的理解,衍生于Martin Fowler这货在其文章中对IoC的解读。他的解释是错的)。


[1]参考:Ralph E. Johnson & BrianFoote,DesigningReusable Classes,1988,链接

http://www.laputan.org/drc/drc.html

框架/framework是在底层中定义的一个骨架式方案,处理各种应用中面临的共同的底层细节;而应用程序员可以按照自己的需求使用框架,给出自己的功能实现——只需要填入自己的东西。IoC说明了框架与库的不同,控制反转是框架的特点/特征。

One important characteristic of a framework is that the methods defined by the user to tailor the framework will often be called from within the framework itself, rather than from the user's application code. 

The framework often plays the role of the main program in coordinating and sequencing application activity.

 This inversion of control gives frameworks the power to serve as extensible skeletons. The methods supplied by the user tailor the generic algorithms defined in the framework for a particular application.

上面的这段话,就是控制反转(Inversion of Control)的来由

1.什么是反转

一个男人变成女人,叫变性;一个女人明天还是女人,叫...自然。所以,讨论反转不反转,需要你有两次体验,对比两种情况。

在实验1:框架设计者中,你就会遇到两种场景:应用程序和框架

2.什么是控制

在IoC中,你“可以”将SortTest称为控制模块(一般地,控制模块就是一个简单的Client,它依赖抽象类型IServer,即C-S结构。所以,这种控制模块的称呼,不要也罢。)

IoC中,所谓控制,指设计决定的控制权,设计决定的控制权,设计决定的控制权。解读IoC,不要在“控制”上异想天开,说些不知所云的话。

所以,你一定要记住:控制反转(Inversion of Control)仅仅是描述一种现象,或介绍框架的特点,仅此而已。如果你清楚地知道库与框架的区别,你根本不需要控制反转这个术语

(本来IoC不过是一篇文章中的短语,被某些依赖注入容器自称为控制反转容器后,这个词控制反转IoC成为流行感冒一样的流行词,非常装逼)

3.IoC与Spring DI容器无关

在你使用God创建对象时,不过在调用一个创建对象的工具。更强大的Spring和God一样,一个工具箱!!!(重要的话,打3个!)所有框架都具有控制反转的这个特点,既然Spring DI容器与框架无关,因此Spring DI容器与Ioc无关

说依赖注入(Dependency Injection)就说依赖注入呗,非得自称控制反转容器,难怪Martin Fowler要开骂:几位轻量级容器的作者说..."我的轿车是与众不同的,因为它有四个轮子"。

然而,提出DI的Martin Fowler,其实五十步笑一百步。他也错了,Spring DI容器根本不是轿车,它只有两个轮子

4.不要使用你不懂的术语——说Martin Fowler呢

框架编程/设计框架时,如Java Applet框架定义各种回调接口如 init()等生命周期方法,应用程序员则给出@Override init()等回调(即回调函数)。因此,yqj2065直接使用回调等术语,不太需要这个说明框架的特点的术语IoC。

按照Martin Fowler的IoC解读,很多人编写了几年SSH( struts+spring+hibernate)应用程序,如果你觉没有什么成就感的话,你可以写一个Helloworld级别的程序,如:

package tips;
import static tips.Print.*;//替代System.out.println()等
import java.util.Scanner;
/**
 * @author yqj2065
 * @version 0.1
 */
public class InputDemo{
    public static void demo() {
        Scanner scanner = new Scanner(System.in);
        p("请输入姓名: ");
        pfln("Hello! %s!", scanner.next());
        p("请输入年龄: ");
        pfln("OK! %d!", (int)scanner.nextDouble());
        p("是男生吗?(true or false): ");
        pfln("ye! %s!", scanner.nextBoolean()?"男":"女");
    }
}

并且大声地、傲娇地宣布:我编写了一个控制正转的程序。


------------------------------吐槽--------------------------------------------

yqj2065不敢使用控制反转(Inversion of Control、IoC)这个术语了(本来穿衣服是正常的,裸体太流行了,我不敢穿衣服出门。嗯,就是这种赶脚。)

因为流行 控制反转容器=依赖注入容器,然后,太多的烂人省略后面的“容器”两字,得到控制反转=依赖注入;然后,到处是这种错误的信息。我不喜欢这种思维上的蜘蛛网?看看百度百科、360百科或网上搜索“控制反转”,你就懂了,它们说:

“控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,...Spring框架的核心“。

猜你喜欢

转载自blog.csdn.net/yqj2065/article/details/51589813