项目架构
✍️ 正文
软件的开发过程
-
IPO模式
- Input 输入:文件、网络、用户手工、随机数据、程序内部参数输入等
- Process 程序处理:处理的方法也叫算法,是程序最重要的部分
- Output 输出:屏幕显示输出、文件输出、网络、操作系统内部变量输出等
- 综上:找出问题中可以用程序辅助完成的待计算的部分是编程的核心问题。即:现实生活中的问题 -> 抽象出可计算部分 -> 计算特性 -> 输入、处理 、输出
- 程序编写的步骤:
- 分析问题:分析问题的计算部分
- 确定问题:将计算部分划分为确定的IPO三部分
- 设计算法:完成计算部分的核心处理方法
- 编写程序、调试测试:使程序在各种情况下都能够正确的运行、升级维护
- input:
- python:input()、golang:fmt.Scanf()
- output:
- python:print();golang:fmt.Printf()、fmt.Println()
-
什么(分析)
-
如何(设计)
-
编写(实施)
-
测试(测试与调试)
-
使用(实施或开发)
-
维护(优化)
应用框架
- 注册、登陆、鉴权、token
- newsfeed 新闻管理:top 20 新闻
- CMS 内容管理:content management system
- CRM 客户关系管理:customer relationship management
构建化工具、工程化工具
go
-
工程管理 #Abstract
- 开发流程
- 分析需求,列出功能清单,需求说明 30%
- 懂业务
- 懂技术
- 结果:需求分析报告
- 设计程序功能,写功能规格书和技术规格书 20%
- 项目经理或架构师
- 技术(开发语言):
- 操作系统,框架
- 数据库:数据库设计
- 选人
- 结果:设计文档
- 界面原型Axure
- 代码实现,进入开发与测试迭代
- 软件工程师【码农】
- 实现各个模块
- 调试和性能等专项测试 20%
- 软件测试工程师
- 黑盒测试
- 白盒测试(懂代码)
- 灰盒测试
- 部署上线
- 实施工程师
- 运行维护和营销
- 用户发现问题
- 分析需求,列出功能清单,需求说明 30%
- Dev 开发环境、QA 测试环境、预发布环境、发布环境、生产环境、灰度(金丝雀发布)环境
- 目标和方法论:--------
- 模块化:是从代码的角度进行分析的单独的文件,由一个,或多个函数,类组成。 把一些可复用的代码,抽离为单个模块,便于项目的维护和开发。
- 模块化工具
- webpack
- rollup
- 模块化工具
- 组件化:是从UI界面的角度进行分析的把一些可复用的UI界面,抽离为单个组件,便于项目的维护和开发。 vue.js 通过.vue文件创建组件 template 结构 script 行为 style 样式 三部分组成一个组件 react有组件化概念,一切都是由JS表现的。
- 可根据模块分文件
- 以上按需分配,组合成完成制定功能的程序。
- 以包作为管理单位
- 每组文件都会称为一个包
- 放在同一个文件夹里
- 用import "" 导入import ( "fmt" "os" )
- 导入的包,必须使用
- 给包名起别名
- 忽略包
- import _ "fmt"
- 用包的init函数
- main函数和init函数
- 打包 package
- 一个程序只能有一个main包,有且只有一个入口地址,main()函数,作为函数的入口
- 同一个目录里文件的包名必须一样
- 同一个目录,调用别的函数,直接调用即可,无需包名。
- 不同目录,包名不一样
- 调用不同包的函数:包名.函数名()
- 调用包里的函数必须是共有函数
- init函数
- 当函数调用时,首先执行init方法
- 库,具有相关功能模块的集合。
- 框架: 大而全,全家桶
- 工具:--------
- 脚手架工具:根据模板快速建立项目
- 快速建立模板项目。如:create-react-app
- 包含了所有需要的配置,包括语法检查、编译等
- 下载好所有相关依赖
- 可以直接运行一个简单的效果
- 项目的基本命令
- 项目的命令在package.json中的 scripts的下面配置
- 键:是运行的命令
- 值:是运行的对应脚本
- 初始化包的配置文件 init:npm init,yarn init
- yarn start:运行项目
- yarn build:构建项目
- yarn test:用测试库测试项目
- yarn eject:暴露所有webpack的配置文件,但无法返回到隐藏时的样子
- yarn dev:运行开发环境
- 项目的命令在package.json中的 scripts的下面配置
- 生成环境 production
- 开发环境 development
- 配置文件 package.json
- 构建 build
- 性能分析:web-vitals
- 代码压缩、图片压缩
- 语法检查 elint
- 兼容性处理
- 自动部署
- manifest.json:应用加壳,可以将web页面加壳变成andriod和apple的应用。manifest.json中配置加壳应用的属性
- robots.txt爬虫规则文件,规定内容爬虫可以爬取,什么内容不可以爬取
- 测试:jest
- 快速建立模板项目。如:create-react-app
- 包和包管理器
- js:npm
- npm开源包管理库:解决了js没有标准库的问题
- npm依赖于node.js的环境,需要先安装node.js
- npm init --yes 初始化配置文件;等同于 yarn init -y
- npm init -dev 开发模式和发布模式需要的包不一样。开发模式需要测试除错模块的包。
- 去npmjs网站查找自己需要的包,查看使用文档。
- npm install 包名 --save 安装所有需要用到的包,并保存在配置文件中。同等于 yarn add 包名。
- s:--save 默认了
- g:--global 全局安装
- d: --save-dev 开发模式下使用的包
- -only=dev/prod:指定安装环境
- npm uninstall 模块名 :卸载包
- npm list:查看已安装的包
- npm info 包名:查看包的信息
- npm install 包名@版本号 :指定安装包的版本号
- 版本号:前面加^表示第一位版本号不变,后两位取最新。~表示前两位不变,最后取最新。*表示全部取最新。
- npm update 包名
- 设置其他仓库:npm config set registry https://registry.npm.taobao.org
- npm i 安装配置文件中的包和依赖
- require 引入包
- 使用
- package.json
- name:包名
- version:版本号
- description:描述
- mian:入口文件
- scripts:自定义脚本文件
- "start":npm run app.js
- "test": npm
- "dev": "webpack-dev-server" 启动一个webpack开发服务器
- "build": "eslint ./src && webpack" 对代码格式化后打包
- repository:仓库
- keywords:关键字
- author:作者
- license:许可证,如mit、isc
- dependencies: {} 生产环境下的依赖
- devDependencies: {} 开发环境下的依赖
- anaconda、brew、apt
- linux:apt、yarn、pacman
- macos:brew
- github
- js:npm
- webpack 工程化管理和打包工具:
- 目标:因为前端的模块化,让程序越来越复杂。
- 将不同文件之间的依赖和加载,统一打包成一个文件
- 翻译一些新版本的语言,如typescript
- 支持不同情景模式下,插件的热插拔。如开发模式dev和生产模式production,下对不同插件的需求
- 模块化:类似于公司的不同部门,负责不同的任务
- 模块化优点:
- 作用域:保护变量不互相干扰
- 命名空间
- 重用性
- 解除耦合
- 配置:webpack.config.js
- webpack-dev-server:启动开发模式服务器
- build:构建
- loader:
- plugin:
- 性能提高:
- 目标:因为前端的模块化,让程序越来越复杂。
- lib 包:小而精,好掉头可以区别文件相同的名称,如同文件夹。会有初始化的模块文件。
- jQuery封装了javascript
- mootools修改了原生的javascript
- 任务注册处理
- grunt
- gulp
- 常量,放在设置文件中.config
- 常用库
- DOM库
- 工具库
- 开发流程
中间件:
注释,测试,api文档:swagger
路由
模板
数据库
测试
模板、框架:ui,模版引擎
服务的注册和发现:etcd,zookeeper
配置管理recipe:
搜索引擎:elastic search
鉴权oauth
监测 pu
类比
- app = 实际的公司
- 框架 = 一个公司的抽象
- 包:函数模块的集合,协同完成统一工作 = 部门
- 模块 = 工作小组
- 变量 = 属性,参数
- 结构体 = 一组属性
- 属性可以是:
- 结构体:又一组属性,一个结构体
- 实现了某个接口的结构体:一类(组)结构体。该类别的结构体都可以作为参数赋予作为新的属性
- 函数 = 一个功能
- 接口,方法的集合 = 一组功能,功能按钮,接头,连接口
- 空接口 = 万能连接头,任何都可以接入
- 类 = 属性+方法
- 类的继承 = 包含,父子关系
- 以上都是一类产品或人
- 实例化 = 指定某一个实例的产品或人
角度
- 构架、开发的流程 -- 工程化
- 学习的角度:以浅入深,根据文档,书籍来规划
- RESTfulRESTful是一种规范: URI为资源统一标识符,里面不能有动词 HTTP里面的get,post,delete,update去操作数据, 服务器,客户端用JSON,JPEG等传递数据 HTTP Status Code传递服务器状态信息
- 版本号
- URI使用名词,且推荐为复数形式,不能用动词
- 保证HEAD和GET方法是安全的,不会对资源状态做改变。
- 模块化、组件化 -- 程序设计
- 模块化策略的主流方法是:面向对象编程
- 编程模块
- ui渲染
- 交互逻辑
- 数据传递
- 业务逻辑
- 数据模型和数据库
- 测试
- 日志
- 项目管理、打包
- 组件化
- 头部导航
- 边栏
- 底栏
- 登陆、注册
- 鉴权
- 工程化
- 沙盒机制
- 路由
- 模板引擎
- 状态管理
- 编程语言设计技巧
- 指针
- 并发:多线程
- 同步、异步
- 单向依赖:回调函数。
- 确保所有函数调用关系都是从上到下的。从上层的应用层到底层的硬件层。解耦。
- 回调函数是一种将双向依赖改为单向依赖的好方案。
- 应用层的函数调用系统层的库函数,需要给系统层传入一个函数,该函数就叫回调函数,把回调函数传入库函数的动作,叫登记回调函数。
- 比如你去奶茶店,点完以后,会登记一个回调函数,告诉店家,你需要怎么定制化这杯奶茶,做完以后是打包还是在店里喝等。该函数登记好后,你就会处于等待过程,最终店家会按照你事先确定好的方案,把奶茶给你。
- 而这个例子中。你给店家的recipe就是回调函数,也是买奶茶这个函数的参数。你可以使用商家定义好的一些recipe,这些就是定义好的函数作为回调函数传入。另外你也可以有自己特殊定义的recipe,那就可以传入一个匿名函数,直接把要求写下来,传入进去。
- 根据以上的特性,回调函数可以分成阻塞式回调和延迟式回调。
- 于是有了这个方案,我们就可以指定一个规范,面对一切顾客。而实现了和顾客要求之间的解耦。
- 工厂模式就属于回调函数的应用。
- 回调函数:当一个函数作为参数传入另一个参数中,并且它不会立即执行,只有当满足一定条件后该函数才可以执行,这种函数就称为回调函数。
- 异步任务:与之相对应的概念是“同步任务”,同步任务在主线程上排队执行,只有前一个任务执行完毕,才能执行下一个任务。异步任务不进入主线程,而是进入异步队列,前一个任务是否执行完毕不影响下一个任务的执行。
- 回调地狱:想要顺序执行异步任务,导致回调函数套回调函数。它会造成我们的代码可读性非常差,后期不好维护。
- promise:是js中的一个原生对象,是一种异步编程的解决方案,可以替换掉传统的回调函数解决方案。用来解决回调地狱。
- Promise构造函数接收一个函数作为参数,我们需要处理的异步任务就卸载该函数体内,该函数的两个参数是resolve,reject。异步任务执行成功时调用resolve函数返回结果,反之调用reject。
- Promise对象的then方法用来接收处理成功时响应的数据,catch方法用来接收处理失败时相应的数据。
- Promise的链式编程可以保证代码的执行顺序,前提是每一次在than做完处理后,一定要return一个Promise对象,这样才能在下一次than时接收到数据。
- 但是Promise最大的问题就是代码冗余,原来的异步任务被Promise封装一下,不管什么操作都用than,就会导致一眼看过去全是than…than…than…,这样也是不利于代码维护的。
- 所以下面的async/await 可以时代码看起来更像同步代码。
- async / await
- async关键字表示该函数为一个异步任务,不会阻塞后面函数的执行。
- 可以看到async函数返回数据时自动封装为一个Promise对象。
- 和Promise对象一样,处理异步任务时也可以按照成功和失败来返回不同的数据,处理成功时用than方法来接收,失败时用catch方法来接收数据。
- await关键字只能在使用async定义的函数中使用
- await后面可以直接跟一个 Promise实例对象(可以跟任何表达式,更多的是跟一个返回Promise对象的表达式)
- await函数不能单独使用
- await可以直接拿到Promise中resolve中的数据。
- 管道的概念处理异步 golang
- 模板字符串
- 声明式和命令式:声明式是脚本,是ai
- 类、继承、构造函数、类的原型方法、子类、覆写父类的方法、实例
- 展开运算符 ...array
- 结构获取: { name1, name2, name3 } = Instance