Programming Technology

概述

参考:

Programming Technology(编程技术) 包含 XX、YY、etc.

CRUD(增删改查)

参考:

在计算机编程中,Create、Read、Update、Delete(创建、读取、更新、删除,简称 增删改查(CRUD)) 是持久性存储的四个基本操作。CRUD 有时也用于描述用户界面约定,这些约定便于使用基于计算机的表单和报告查看、搜索和更改信息。这个词很可能是詹姆斯·马丁 (James Martin) 在他的 1983 著作《管理数据库环境》中首次推广的。

Projects(项目)

项目一般就是指开发一个程序。

从写代码的角度看,一个项目就是一个文件夹,该文件夹中包含该项目所需要依赖的第三方库,项目主体的代码,可执行文件等。

前端与后端

后端:一般是用来处理客户端发送的请求,并将前端写的 页面代码 文件,发送给客户端;或者从数据库获取数据,并填充到前端页面中;等等

前端:一般用来展示的,客户端收到的页面文件(比如输入用户名和密码的框,下拉框等等),都是由前端工程师来写的,一般是 html 等。

前后端交互

前端与后端之间的交互取决于是前后端分离还不分离

  • 前后端不分离时,通常由后端代码渲染 html 等静态资源文件,此时客户端访问的是由后端代码监听的端口
  • 前后端分离时,又分多种情况
    • 将 html 等静态资源放在 Nginx 等可以提供 HTTP 服务的程序中,然后通过后端提供的 API 进行交互,此时客户端访问的是由提供 HTTP 服务程序监听的端口
    • 将 html 等静态资源与后端代码放在一起,这种行为通常称为“XX 语言嵌入静态资源”,此时客户端访问的是由后端程序监听的端口
      • 比如 Go 语言在 1.16 版本中推出的 embed 库即可实现该效果

前后端数据交互

通常来说,HTML 展示出的页面内容中的数据通常分为两大类

  • 静态
  • 动态

在早期互联网不发达的时候,页面内容是不变的,数据也是静态的,但是随着互联网的发展,信息增多,一个页面的数据需要在用户操作时可以变化,此时就需要用到 AJAX 以动态的方式进行数据展示。

现在静态数据的网站已经很少见了,比如 DTCG 卡牌列表(截至 2023.12.19),这种就属于静态数据。静态数据有个弊端,就是哪怕不展示,也是全量加载,比如这个 卡牌列表 网站,虽然也分成了 4 页,但是在访问的时候,实际上是加载了所有页中的所有数据到前端,然后前端通过分页隐藏了其他页的数据。这种做法无形中增加了每次访问的流量,一共 4 页数据全加载了,但是真实情况却并不需要看到。

而动态数据,则并不需要在访问网站时加载所有页的数据,只需要在访问其他页的数据的时候,通过 XHR/Fetch 等 AJAX 手段,向后端再发起请求即可。

前后端分离编程

前后端分离的编程通常分为两大类,主要围绕静态资源文件的响应方式分类:

  • 由后端代码监听端口并返回静态资源文件
  • 由 Nginx、NodeJS 等工具监听端口并返回资源文件

以 go 和 js 为例

对于页面简单的程序

Go 程序启动监听程序,并向浏览器响应静态资源文件

Go 程序注册路由时分为两部分

  • 由浏览器通过 URL 直接发起的请求 #
  • 由浏览器通过 JS 文件发起的请求 # 这些请求的路由通常单独放在一个目录中,并且规划路径为 /api/XXX,在浏览器拿到 html 与 js 后,由浏览器通过 js 代码发起请求

对于页面复杂的程序

Go 程序单独启动监听一个端口,不响应任何静态资源文件

由 Nginx 或 NodeJS 环境启动监听程序,并向浏览器响应静态资源文件。通常都会有一个 Nginx,用来响应、负载某些需要从后端直接返回文件的请求。

比如这样的 Nginx 的配置

server {
    listen 80;
    server_name demo.mogutou.xyz;

    root /opt/mogutouERP-demo/dist;
    index index.html;

    location / {
       try_files $uri $uri/ /index.html;
    }

    location /api {
       proxy_pass http://0.0.0.0:8088;
    }
}

location / 是用来返回所有前端静态文件的

location /api 则是用来当前端静态 JS 文件中有需要访问后端 API 接口的,则代理到后端

打包与编译

Bundle(打包)Compile(编译) 是两种常见的构建代码的手段。

后端构建代码常用 Compile,前端常用 Bundle。

  • 对于后端来说,是把代码直接 Compile 成一个二进制文件在系统中运行
  • 对于前端来说,是把代码打包成一个或多个 JS、HTML 等文件,在浏览器中运行
    • ECMAScript 模块与包 中的 “浏览器中使用 ESM 的常见问题” 可以看到,浏览器自身是没法自动导入某个依赖库的,所以想要在浏览器中运行 JS 代码,就需要吧依赖库与本身的 JS 文件打包起来,形成一个或一组 JS 文件,这时,浏览器再执行 import 时,就从这些已打包的文件中查找,就可以找到相关依赖了。

库、标准库、第三方库与框架

每种编程语言都具有最基本的功能,比如输入、输出等,这些都属于基本库。比如我使用 print 想输出一些内容,则是调用输出所用的库来实现这个效果。这些基本库都是内置在各个编程语言当中的,可以直接调用。

但是有时候会有很复杂的需求, 比如对系统的某些程序进行操作、对数据库进行操作、写出来的程序如何设置子命令和参数等等等。这些复杂的需求,如果使用基本的编程语言来实现,是非常麻烦的,这时候如果有人可以提前使用编程语言的基本功能来创作一个可以实现某个具体功能的程序就好了。

这个创作出来的基本程序就可以称之为“库或者框架”

至于库和框架的区别:库的英语为 Library ( 简写 Lib ),框架的英语为 Framework。库和框架都是一种有别于软件、面向程序开发者的产品形式。正因为如此,也有很多人误以为库就是框架,或者认为指定语言的库就是框架。

  • 库:库是将代码集合成的一个产品,供程序员调用。面向对象的代码组织形式而成的库也叫类库。面向过程的代码组织形式而成的库也叫函数库。在函数库中的可直接使用的函数叫库函数。开发者在使用库的时候,只需要使用库的一部分类或函数,然后继续实现自己的功能。
    • 标准库:就是各种语言自带的库,比如 go 里的 fmt 库,用来输出。这些标准库与语言的关键字构成了编程语言的基本功能。
    • 第三方库:是对编程语言的扩展,比如一种语言需要更多丰富的功能,而不仅有标准库的功能的时候,可以导入第三方库并使用它们。
  • 框架:框架则是为解决一个(一类)问题而开发的产品,框架用户一般只需要使用框架提供的类或函数,即可实现全部功能。可以说,框架是库的升级版。开发者在使用框架的时候,必须使用这个框架的全部代码。

库更像一个一个小的功能,比如使代码可以操作数据库这个功能,使代码可以监听在设备的某个端口上等等。

而框架则更像一个还没完成的程序,只有一些大体框架,其中具体的内容,可以根据自己的喜好去填充,说白了,就是一种规范,只要根据这个规范,就可以实现自己的某个程序。比如想开发一个 web 程序,就可以使用一个 web 框架,这个框架会给开发者直接提供一个基本的后端,至于其中的内容,开发者再去详细填写就好了

框架和库的比较可以想像为:假如我们要买一台电脑:电脑内的每个部件就是编程语言的一个个关键字

  1. 框架为我们提供了已经装好的电脑,我们只要买回来就能用,但你必须把整个电脑买回来。这样用户自然轻松许多,但会导致很多人用一样的电脑,或你想自定义某个部件将需要修改这个框架。
  2. 库就如自己组装的电脑。库为我们提供了很多部件,我们需要自己组装,如果某个部件库未提供,我们也可以自己做。库的使用非常灵活,但没有框架方便。

然后通过对库和框架的使用,可以使该电脑实现我们自己想要的功能,比如玩游戏、办公、看电影等等。

程序开发中的框架(例如 1000 万+行的 Qt)往往是对常见功能的封装(类似于成语对常用含义的代指,不同点在于应用框架最终对 CPU 表达含义时候会把成语替换为原本含义-通过函数调用),抛开框架,程序会变得因缺少一些’固定成语’(函数)的’释义’(函数实现)而变得无法执行。

所以,程序框架理解为基础或者机械标准件(例如螺丝螺母这些有明确标准的机械部件)更为贴切。

这样理解,假如你要造一辆马车,在没有框架的情况下,你需要自己去伐木,去把木头做成木板,木棍,然后组成轮子,门,等部件,然后组装起来,但如果你用了框架,就相当于你有现成的轮子,门等部件,你只需要组装一下就可以了。

可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。

拓展资料:

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。

例子

拿 go 语言举例,当获取完一个第三方库之后(比如通过 go get 命令安装),有时候会有一个命令行工具,比如 cobra,所以,也可以把库当做一个应用程序。而大部分时候,是不会出现一个命令行工具的,在获取完库之后,需要在 import 代码中进行引用,即可使用库中的相关函数。