NestJS项目开发编程思想

前言

如果你是一名前端学习者,在学习NestJS时你需要补充了解一些关于后端开发的知识以及编程思想,以此更好的搭建基于node的后端服务器

编程范式

以下提到的OOP、FP、FRP,这三种概念是不同的编程范式。范式,即写代码的方式 & 风格

FP

F P \color{#b52040}{FP} FP : Functional Programming 函数式编程

例如,求数组 arr 的和,过程式编程风格是这样:

js 复制代码
    let sum = 0 
    for (let i = 0; i < arr.length; i++) { 
        sum += arr[i]
    }
  • 确定的数据输入、输出;没有"副"作用,相对独立;
  • 引用透明,对IDE优友好,易于理解;
  • 如今主流的vue/react中的书写方式

OOP

O O P \color{#b52040}{OOP} OOP : Object Oriented Programming 面向对象式编程

  • 抽象现象生活中的事物特征,对理解友好
  • 封装性(高内聚低耦合)、继承性、多态性
  • Java、C++典型的面向对象的编程语言

例如,面向对象式编程是这样:

js 复制代码
//定义类
class Person {
  constructor(name, sex) {
    this.name = name;
    this.sex = sex;
  }
}
//使用类
let str = new Person("彼日花",  "男");
console.log(str)

AOP

A O P \color{#b52040}{AOP} AOP :Aspect Oriented Programming 面向切面编程

  • 扩展功能方便,不影响业务之间的逻辑
  • 逻辑集中管理
  • 更有利于代码复用

AOP能在不破坏功能的前提下,额外增加功能

OOP Vs AOP

  • 面向目标不同:简单来说 OOP 是面向名词领域,AOP 面向动词领域。
  • 思想结构不同:OOP 是纵向结构,AOP 是横向结构。
  • 注重方面不同:OOP 注重业务逻辑单元的划分,AOP 偏重业务处理过程中的某个步骤或阶段。
  • 两者之间是一个相互补充和完善的关系。

FRP

F R P \color{#b52040}{FRP} FRP :Functional Reactive Programming 函数响应式编程

  • 适合需要对事件流进行复杂组合应用的场景
  • 响应式多用在异步的场景
  • 典型案例:rxjs,广告推荐、

IoC与DI的那点事

I o C \color{#b52040}{IoC} IoC :Inversion Of Control 控制反转
IoC 很好的体现了面向对象设计法则之一------ 好莱坞法则:"别找我们,我们找你";即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

D I \color{#b52040}{DI} DI :Dependency Injection 依赖注入

二者关系:

Ioc是一种思想&是设计模式DI是IoC的具体实现

IoC与DI

  • 控制反转 (I nversion o f C ontrol)是一种是面向对象编程中的一种设计原则 ,用来减低 计算机代码之间的耦合度。其基本思想是:借助于第三方"实现具有依赖关系的对象之间的解耦
  • 依赖注入 ( D ependency I njection)是一种用于实现IoC的设计模式它允许在类外创建依赖对象 ,并通过不同的方式将这些对象提供给类

Nest核心概念

graph LR A(客户端) -- 请求 --> B(控制器) B(控制器) -- 响应 --> A(客户端) B(控制器) -- 使用服务 --> C(服务) C(服务) -- 依赖注入 -->B(控制器) C(服务) -- 数据库 --> D(数据接入) D(数据接入) --持久化 --> C(服务)
  • Controller层负责处理请求、返回响应
  • Service层负责提供方法和操作,只包含业务逻辑
  • Data Access层负责访问数据库中的数据

NestJS的生命周期

NestJS用模块来组织代码

  • 使用Module来组织应用程序
  • @Module装饰器来描述模块
  • 模块中有4大属性:importsproviderscontrollersexports

模块

graph TB A(功能模块) B(共享模块) C(全局模块) D(动态模块)
  • 功能模块共享模块是一回事,只是叫法不一样
  • 全局模块通常应用在配置、数据库连接、日志上
  • 动态模块 是在使用到模块的时候才初始化(懒加载)

模块化举例

加餐:MVC是什么?

MVC是一种软件架构模式
M V C \color{#b52040}{MVC} MVC :Model(模型) View(视图) Controller(控制器)

MVC模式

NestJS中的MVC

  • Nestjs可以通过模板库实现View层,常见:pughusejs
  • Nestjs默认集成express作为web服务器,可以换成koa/fastify
  • Controller响应前端的请求,Model是对应的具体的数据库逻辑

加餐:DTO与DAO

D T O \color{#b52040}{DTO} DTO : Data Transfer Object 数据传输对象

D A O \color{#b52040}{DAO} DAO : Data Access Object 数据访问对象

DTO Vs DAO

graph LR A[请求] --> B(DTO) -- 逻辑 --> C(DAO) --> D[数据库] C(DAO) --> B(DTO)

DTO:接受部分数据,对数据进行筛选,不对应实体,属性是小于等于实体

DAO:对接数据库接口,不暴露数据库的内部信息,对应实体

NestJS中的实体类

  • DAO是一层逻辑:包含实体类、数据库操作(CURD)、数据校验错误处理等
  • Nestjs做了一层更高级的封装,通过ORM库(如:PrismaTypeORMSequelize)与种类数据库对接,而这些ORM库就是DAO层
相关推荐
禅思院2 小时前
前端请求取消与调度完全指南:从 AbortController 到企业级优先级架构
前端·设计模式·前端框架
小bo波2 小时前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
写代码的小阿帆3 小时前
行为型设计模式之观察者(发布-订阅)模式
设计模式
王_teacher4 小时前
23种设计模式全解析(GoF 设计模式)
设计模式·软考·软件设计师·软考中级
阿坤带你走近大数据5 小时前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
geovindu5 小时前
go: Coroutines Pattern
开发语言·后端·设计模式·golang·协程模式
Anastasiozzzz6 小时前
构建健壮软件系统的基石:深入解析面向对象设计七大原则
开发语言·javascript·设计模式·ecmascript
qq_297574671 天前
设计模式系列文章(基础篇第19篇):中介者模式——封装交互关系,解耦网状依赖
设计模式·交互·中介者模式
AI大法师1 天前
老牌媒体怎么从“出版物更新”走到“品牌系统升级”
大数据·人工智能·设计模式·新媒体运营
野生技术架构师1 天前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·设计模式