多人都想知道架构师是做什么?我们看看下面的一段对话 。
菜鸟 —— 刚入门的程序员
老鸟 —— 资深架构师
老鸟:菜鸟,你的目标是什么?
菜鸟:我要成为一个软件架构师 。
老鸟:对一个年轻的工程师来说,这是一个很好的目标 。那你为什么要成为架构师呢?
菜鸟:我要领导一个团队,还要做所有关于数据库、框架和Web服务器的重要决定 。
老鸟:好吧,如果是这样,你就没必要成为一个软件架构师了 。
菜鸟:当然有必要了!我要成为一个能够做所有重要决定的人 。
老鸟:这样很好,只是你没有列出哪些才是重要的决定 。你刚才说的那些跟重要的决定没有什么关系 。
菜鸟:你说什么?难道数据库不重要?你知道我们在数据库上面花了多少钱吗?
老鸟:可能很多 。不过数据库仍然不是最重要的 。
菜鸟:你怎么能这么说呢?数据库可是整个系统的心脏啊!所有的数据都保存在这里,它们在这里被排序,被索引,被访问 。如果没有数据库,整个系统就无法运作!
老鸟:数据库只不过是一个IO设备,它提供了一些有用的工具对数据进行排序、查询,并生成报表,但这些工具都只是整个系统的附属品 。
菜鸟:附属品?真是不可思议 。
老鸟:是的,附属品 。你的系统业务逻辑或许会用到这些工具,但这些工具并非业务逻辑固有的组成部分 。如果有必要,你可以随时替换掉这些工具,但业务逻辑还是那些业务逻辑 。
菜鸟:好吧,不过如果把这些工具替换掉,我们就要重新实现业务逻辑了 。
老鸟:那是你的问题 。
菜鸟:为什么这么说?
老鸟:你认为业务逻辑依赖数据库,但实际上不是这样的 。如果你的架构足够好,最起码业务逻辑不应该依赖数据库 。
菜鸟:这太疯狂了 。我怎么可能创建出不使用这些工具的业务逻辑?
老鸟:我并没有说业务逻辑不要使用数据库工具,我的意思是它们不应该依赖这些工具 。业务逻辑不应该知道使用的是哪一种数据库 。
菜鸟:如果业务逻辑对数据库一无所知,它怎么使用这些工具呢?
老鸟:依赖反转 。你要让数据库依赖业务逻辑,而不是让业务逻辑依赖数据库 。
菜鸟:你的话让人费解 。
【java架构到底是做什么的,一段对话让你懂】老鸟:费解吗?我讲的可是软件架构 。这个就是依赖反转原则,让下层策略来依赖上层策略 。
菜鸟:那就更加费解了!既然上层策略(假设你指的是业务逻辑)要调用下层策略(假设你指的是数据库),那么就应该是上层策略依赖依赖下层策略,就像调用者依赖被调用者一样 。这是众所周知的!
老鸟:在运行时确实是这样的,但在编译时我们要把依赖反转过来 。上层策略的代码里不要引用任何下层策略的代码 。
菜鸟:拜托!不引用代码就无法调用它们 。
老鸟:当然可以调用了 。面向对象就可以做到 。
菜鸟:面向对象对真实世界进行建模,把数据和函数组合到对象里,把代码组织成直观的结构 。
老鸟:这是他们告诉你的吗?
菜鸟:所有人都知道的,这不是很明显的事情吗?
老鸟:确实如此 。不过,面向对象是可以做到不引用也能调用的 。
菜鸟:好吧,那它是怎么做到的?
老鸟:你应该知道,在面向对象系统里对象会给其它对象发送消息的,对吧?
菜鸟:是的,当然 。
老鸟:那么你就该知道,消息发送者是不知道消息接收者是什么类型的 。
菜鸟:这要看使用的是哪一种语言了 。在JAVA里,发送者最起码要知道接收者的基本类型 。在Ruby里,发送者知道接收者一定会处理它所发送的消息 。
老鸟:是的 。不过不管是哪一种情况,发送者都不知道接收者具体的类型 。
菜鸟:嗯,是的 。
老鸟:所以发送者可以给接收者传递一个函数,让接收者执行这个函数,这样发送者就不需要知道接收者是什么类型了 。
菜鸟:没错 。我了解你的意思 。不过发送者仍然依赖接收者 。
老鸟:在运行时确实是的,但在编译时不是这样的 。发送者的代码里并没有引用接收者的代码 。实际上,是接收者的代码依赖了发送者的代码 。
菜鸟:啊!但发送者仍然会依赖接收者的类 。
老鸟:看来需要用代码来说明了,我用Java来写些代码 。首先是发送者代码:
推荐阅读
- Java 程序员必须掌握的 8 道数据结构面试题,你会几道?
- 想从程序员变成架构师?看100篇架构设计的文章,不如干1次这个
- 简单理解JavaScript,TypeScript和JSX
- Linux到底怎样实现「写时拷贝」?其实很简单
- HTML、CSS、JavaScript、PHP、 MySQL 的学习顺序是什么?
- WiFi连接成功后,到底要不要关闭移动数据?
- 怎么检测手机是否被监控了?普通人的手机到底会不会被监控?
- 当下中国人的价值观到底是什么 价值观是什么
- Java解决高并发秒杀
- Java正确获取客户端真实IP方法整理——附教程