零,前言Spring+Angular前后端分离开发学了三个月,感觉比较难。。。尤其是当我初学,不知道为什么要前后端分离。这篇文章是我第一次接触软件时对面向对象、MVC和前后台分离的理解。人们在发现新事物时,往往不愿意接受新事物,但在逐渐适应和发现它的优点后,又离不开……1、“乱与乱”——早期MVC不分离,大部分软件都是编写过程面向,换句话说,这样的软件就像一个加工厂,一个流程图,它只是把现实生活中的某个过程改编成代码,让计算机来处理。(为了集中思考问题本身,本文没有代码)上图只是抽象成了一个通用的流程,但实际上呢?如果没有MVC分离,用PHP和Html写一个简单的学生管理页面会怎么样?就像这样,在这样的程序中,代码的执行逻辑和思考的逻辑是完全一致的,也就是说,逻辑想到哪里,代码就可以写到哪里。这时候如果要查数据库,可以直接把SQL语句写进去,如果要加样式,就在Html标签里加class。但是这种代码耦合度非常高,因为逻辑层、数据层、界面层都混在一起,甚至Html、JS、PHP也经常混在一起,这就需要开发者同时掌握前端-端和后端语言。;同时,由于各个层的代码混合在一起,每个功能的代码会很长,维护起来非常困难。每次维护前,都要在脑中重现写的过程,才能修改代码。不知道当时代码写的是什么,很难下手。2.《黎明时分》——MVC分离由于上面提到的在不分离的情况下开发MVC存在的诸多不足,于是产生了MVC分离的思想,也出现了很多框架,比如ThinkPHP就是MVC的PHP框架分离。在ThinkPHP中,M指的是Model,型号。M层定义对象的属性和方法供C层调用,M层承担与数据库交换数据的任务;C层是Controller,控制器。C层负责数据转发,关注软件的业务逻辑,并不关心某个业务逻辑是如何实现的。(比如C层就像一个组长,让M层的小明完成一个任务,但是他不关心这个任务是怎么实现的,因为实现方法是M层应该负责的for.)V层就是View,视图,也就是界面。V层负责把数据和界面打包在一起,渲染成最终的页面,然后交给C层,C层返回给用户。那么,如果把刚才的学生管理界面改写成MVC分离的思路会怎么样呢?MVC分离的思想更面向对象——它更注重不同层之间的关系,而不是与大脑中的思维顺序保持一致。也就是说,如果每一层的代码都是首尾相接的话,是不能直接按照前后顺序运行的,因为层与层之间的代码是调用关系,而不是前后顺序后退。面向对象打破了面向过程的“加工厂”式的顺序思维。MVC分离的意义在于将数据层和接口层从业务逻辑中分离出来,这样在写每一层的时候,只需要考虑负责这一层的内容,而不是综合考虑,大大减少了思考量.修改的时候只需要考虑修改的部分,不需要全局考虑。但是,还有一些问题没有得到解决。简单来说,就是“隔”的程度不够。我们知道后端工程师往往不擅长UI设计,前端工程师往往不擅长数据结构和算法。虽然前端的HTML、JS和后端的PHP不需要像以前一样写在同一个文件中,但它们仍然是不同的语言。如果要单独开发一个部分,就比较困难了。开发前端页面时,必须使用后台数据进行开发,后台必须使用前端发起请求。3.“一目了然”——前后端分离最后,聪明的老祖宗终于发明了前后端分离的思路。将客户端和服务器分开。在前后端不分离的情况下,页面和数据还是耦合的。比如ThinkPHP的V层只是一个事先写好的静态模板(像没写的试卷),然后在指定位置填入数据,然后渲染渲染出来的网页(像写好的试卷)。试卷,写成动态数据)返回给C层,再返回给用户的浏览器。静态网页填满了数据,那么前后端分离会怎样呢?前端是指运行在用户浏览器上的程序;后端是指在服务器上运行的程序。当用户发起请求时,首先向前端服务器请求前端程序,复制所有的前端内容,但此时的前端不再只是像HTML那样的静态页面,而是一个完整的一个也有controller和model系统的,它就知道应该请求哪个后台地址,前端界面怎么渲染。然后,运行在浏览器中的前端程序会向后端服务器发起数次请求。服务器返回数据后,前端填写数据,然后得到一个完整的页面呈现给用户。这样做的好处是,如果要开发前后端分离,只需要在前端开发人员和后端开发人员之间制定一个协议(哪个地址,用什么方式,用什么资源)都是前端请求的,后端返回相应的资源就可以了),前端开发不需要完整的后端,后端开发也不需要完整的前端。这样“各有各的写”,即使是前端也不需要知道后端用什么语言开发——他只需要知道如何请求后端即可;后端不必考虑数据如何显示——只要前端需要任何数据即可。另一方面这样做也有好处,也可以减轻服务端的压力:在前后端不分离的时代,V层的模板渲染由服务端完成(server只能在填写完数据后返回HTML模板。),这样用户每次请求时,都要返回数据和HTML页面以及笨重的JS样式。前后端分离后,用户第一次请求直接将前端程序下载到本地,在本地运行。而且这个前端的UI比较固定,不会经常变化。这样后续的每一层请求只需要向服务器请求动态变化的数据,不需要重复加载同一个页面,减少了网络带宽的浪费。甚至可以直接缓存前端页面,这样就不用长时间向前端发起页面请求。4.总结从最初的面向过程,到后来的面向对象,再到MVC的分离,前后端分离,这应该是软件工程史上的一个进步,推动了软件的发展软件世界一次又一次。作为普通人,我们没有制定规则的能力,但是我们可以学习更多先进的思想,提升自己,用这些先进的思想来辅助自己开发更规范的产品。
