阿金
curatorjin
早起赶画稿,熬夜写项目
disciple_sneaker@163.com
相关标签: Spring 框架 编程思维

漫谈控制反转(IOC)

IOC是什么

你已经是一个成熟的程序了,该学会自己写代码了

在一开始学习Java的时候,就了解到Java是一个“面向对象”的语言,面向对象(OOP)也是Java的一个核心思想。编程中我们也是不断地要去关注一个对象的创建、使用以及销毁。有一天,你突然想到,不如把这些麻烦事都交给程序去做好了,反正也都有规律可循。于是你写出了一个能自己管理对象的程序,IOC的思想也就从一个犯懒的动机中体现了。

控制反转(IOC)把传统上由程序代码直接控制的调用权反过来交给程序,通过程序来实现对象的装配和管理。这里的程序也有称其为容器的,实际上是一个意思,简单的说就是“你已经是个成熟的程序了,该学会自己创建对象了”

框架的基础

“从编程过程中来看,如果说编码是一个程序员向机器输入的过程,那么运用反射机制就相当于是向机器获取的过程。反射的实质是在获取字节码文件中的相关信息。因此,从一定程度上来说,反射机制补全了对于程序流程的控制。”

相信看到IOC,很多人的第一反应是我要聊Spring了。当然,Spring是一个非常优秀的IOC容器,他的很多处理都有IOC思想的体现。然而实际上在我们接触Spring之前,其实就已经具备了实现IOC的知识和能力了。

在之前的有关反射的文章中提到过:目前几乎所有框架的底层实现都利用了反射机制。可以说反射是一切框架的基础。框架是为编程服务的,想要方便以后的编程自然要对编程的内容进行操作。

再粗浅地看一下Spring的IOC,我们能看到很多运用反射的地方:注解开发、包扫描配置、属性注入(也算是注解的一种)。我之前在写一个Minecraft的mod的时候也运用到了反射,利用包扫描去注册一些单例的实体类。如果把这些逻辑抽象出来提供成扩展,相信也是一个不错的mod开发助手。

但是Java的反射能做到的还是有限的,比如说他不能真的帮你写完你的代码。所有的涉及到具体的功能实现的还是要开发者自己操作来完成,也正是如此,框架以及IOC容器能做到的事也是有限的。

从一个函数到AI

“打开excel,我教你们怎么用它求解一元高次方程”

在我大学的时候,有一件印象很深的事:我的一个化学老师在课堂上看着我们算一个高次方程算了半天,给我们介绍了一个用excel解决的方法:

  1. 在第一行的第一列填入对解的估算值(凭感觉随便估算即可)
  2. 在第一行的第二列填入方程的导函数,并将其中的x换为第一列的值
  3. 在第一行的第三列设置为第一列的值减去一个任意小数乘以第二列的值
  4. 将第二行的第一列用等于号设置为第一行的第三列的值
  5. 将第一行的二三列用黑色十字下拉到第二行
  6. 将第二行的三列用黑色十字下拉,直到第一列的值趋于稳定,即为方程的一个近似解

这篇文章从这里开始就是一些发散性的内容了。(画一条分割线表示一下) 我想谈一谈,如果程序能控制程序,那会是怎样的场面。


上述的excel的例子,如果接触过ai编程的话应该能想起来讲机器学习的第一个函数,也是用到类似的逻辑来求解方程,毕竟迭代这种事情可以说是计算机最擅长的。当函数从一元高次方程走向多元、甚至更复杂的方程时,这个逻辑依旧有效,我们通过建立问题的数学模型,将问题的相关参数代入、再进行一遍遍的训练、模拟计算,最终得出近似解。程序通过不断地学习、优化,最终对一类问题有了自己的求解方式

我们再发散一点,如果一个程序可以优化自身自我升级,那会怎样?

这里提到的只是监督学习的基本思路,对机器学习或者人工智能感兴趣的可以参考相关资料

自适应与数据推送

从未关注,从未错过

经常用B站或者抖音的朋友可能对这句话有很深的体会:我明明没有关注,却在首页推荐上看完了全部。大家应该也都知道,这类平台会根据用户的观看习惯、时长,以及观看视频的种类进行相关的内容推送。也就是说,你的每一次划动屏幕,都给了平台一次学习的数据。最后平台会给你推送你喜欢的视频。

但是我喜欢,便是好的吗?

反思一下为什么会给你推这种视频。

说这种话确实有点贱兮兮的感觉。如果有了解过舒适圈或者信息茧房之类的概念,我想你也会重新思考一下数据推送的利弊。

就我个人认为,信息获取的主动权还是应当完全归还给用户。


一些后话

最后我们再把目光放回到IOC上,控制反转给我们带来的是编程上的便利。他本身是面向对象的一种设计原则,主要还是为了解耦。

这么看的话,现实中的外包公司也是IOC思想的一种体现

相关链接