编程思想——FP、OOP、FRP、AOP、IOC、DI、MVC、DTO、DAO
个人简介
👀个人主页: 前端杂货铺
🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨100个小功能 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒Three.js🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧
文章目录
- FP、OOP、FRP
- Functional Programming:函数式编程。
- Object Oriented Programming:面向对象式编程
- Functional Reative Programming: 函数式响应编程
- 对比总结
- 混合使用
- AOP 面向切面编程
- IOC 控制反转、DI 依赖注入
- NestJS核心概念
- MVC
- DTO、DAO
- 总结
FP、OOP、FRP
Functional Programming:函数式编程。
核心思想:
- 函数是“一等公民”:函数可以作为参数传递、返回值或变量存储。
- 纯函数:相同的输入必定得到相同的输出,且无副作用(不修改外部状态)。
- 不可变性:数据不可修改,通过创建新数据实现变化。
- 声明式风格:关注“做什么”,而非“如何做”。
数组操作:
// 纯函数示例:无副作用,输出只依赖输入
const add = (a, b) => a + b;// 不可变性:生成新数组,而非修改原数组
const numbers = [1, 2, 3];
const doubled = numbers.map(n => n * 2); // [2, 4, 6]// 函数组合:将多个函数串联
const process = (arr) => arr.filter(n => n % 2 === 0) // 过滤偶数.map(n => n * 3) // 乘以3.reduce((sum, n) => sum + n, 0); // 求和console.log(process([1, 2, 3, 4])); // (2*3 + 4*3) = 18
特点
- 优点:易测试、可维护性强,适合并发场景。
- 缺点:学习曲线高,需适应不可变性和函数组合思维。
- 典型库:Lodash(FP模式)、Ramda。
Object Oriented Programming:面向对象式编程
核心思想
- 对象为中心:程序由对象组成,对象包含数据(属性)和行为(方法)。
- 封装:隐藏内部细节,暴露接口。
- 继承:子类继承父类的属性和方法。
- 多态:同一方法在不同对象中有不同实现。
动物类
// 基类(抽象类)
abstract class Animal {constructor(public name: string) {}// 抽象方法:子类必须实现abstract makeSound(): void;// 公共方法move(distance: number = 0) {console.log(`${this.name} moved ${distance} meters.`);}
}// 子类继承
class Dog extends Animal {makeSound() {console.log("Woof! Woof!");}
}class Cat extends Animal {makeSound() {console.log("Meow~");}
}// 使用多态
const animals: Animal[] = [new Dog("Buddy"), new Cat("Misty")];
animals.forEach(animal => animal.makeSound());
// 输出:
// Woof! Woof!
// Meow~
特点
- 优点:结构清晰,适合业务模型抽象。
- 缺点:过度继承可能导致“脆弱基类问题”。
- 典型应用:GUI开发、游戏实体建模。
Functional Reative Programming: 函数式响应编程
核心思想
- 响应式数据流:将事件、状态变化抽象为流(Stream)。
- 函数式操作:使用纯函数对数据流进行变换、过滤、组合。
- 声明式处理异步:简化复杂异步逻辑(如事件监听、AJAX请求)。
点击计数(使用 RxJS)
import { fromEvent } from 'rxjs';
import { map, scan } from 'rxjs/operators';// 创建点击事件流
const button = document.querySelector('button');
const click$ = fromEvent(button, 'click');// 操作流:统计点击次数
const count$ = click$.pipe(map(() => 1), // 每次点击映射为1scan((total, curr) => total + curr, 0) // 累加
);// 订阅结果
count$.subscribe(count => {console.log(`Clicked ${count} times`);
});// 点击按钮时输出:
// Clicked 1 times
// Clicked 2 times
// ...
特点
- 优点:简化异步和事件驱动逻辑,可组合性强。
- 缺点:概念抽象,调试复杂。
- 典型库:RxJS、Bacon.js。
对比总结
| 范式 | 核心概念 | 典型场景 |
|---|---|---|
| 函数式编程 (FP) | 纯函数、不可变性、函数组合 | 数据处理、并发任务 |
| 面向对象编程 (OOP) | 对象、封装、继承、多态 | 业务模型抽象、GUI开发 |
| 函数式响应编程 (FRP) | 数据流、声明式异步处理 | 实时应用、复杂事件处理 |
混合使用
// OOP + FP:类中使用纯函数
class Calculator {// 静态纯函数方法static add(a: number, b: number): number {return a + b;}
}// FRP + FP:响应式流中使用函数式操作
const stream$ = click$.pipe(filter(event => event.target.matches('.btn')),debounceTime(300),map(event => ({ x: event.clientX, y: event.clientY }))
);
AOP 面向切面编程
Aspect Oriented Programming:面向切面编程。
核心思想:将通用逻辑(如日志、权限、缓存)从业务代码中剥离,通过切面在运行时动态注入到目标位置,保持代码的纯净性。
NestJS 通过以下工具实现 AOP:
- 拦截器(Interceptors):在方法执行前后添加逻辑。
- 守卫(Guards):处理权限验证。
- 管道(Pipes):数据校验和转换。
- 异常过滤器(Exception Filters):统一异常处理。
IOC 控制反转、DI 依赖注入
Inversion Of Control:控制反转。
核心思想:将对象的创建和管理交给框架(容器),开发者只需声明依赖关系,由框架自动完成实例化和注入。
Dependency Injection:依赖注入。
核心思想:对象的依赖由外部注入,而非在内部直接创建,实现解耦。
关系:IOC是一种设计思想&设计模式,DI 是 IOC 的具体实现。
IPhone 依赖、Android 依赖与 DIStudent 解耦,示例如下:
di.ts
export interface Phone {playGame(name: string): void;
}export class DIStudent {constructor(private name: string, private phone: Phone) {this.phone = phone;this.name = name;}getName() {return this.name;}setName(name: string) {this.name = name;}play() {this.phone.playGame(this.name);}
}
index.ts
import { DIStudent, Phone } from "./di";class IPhone implements Phone {playGame(name: string) {console.log(`${name} use iphone play name`);}
}class Android implements Phone {playGame(name: string): void {console.log(`${name} use android play name`);}
}const student1 = new DIStudent("zahuopu1", new Android());
student1.play(); // output: zahuopu1 use android play nameconst stdent2 = new DIStudent("zahuopu2", new IPhone());
stdent2.play(); // output: ahuopu2 use iphone play name
NestJS核心概念
Controller 层负责处理请求、返回响应。
Service 层负责提供方法和操作,只包含业务逻辑。
Data Access 层负责访问数据库中的数据。

NestJS 生命周期:

MVC
Model View Controller:模型、视图、控制器;MVC 是一种分层的架构模式。
- Model(模型):管理数据逻辑(如数据库操作、业务规则)。
- View(视图):负责数据展示(如 UI 界面、网页模板)。
- Controller(控制器):处理用户输入,协调 Model 和 View 的交互。
通过职责分离,提升代码的可维护性和扩展性。
DTO、DAO
Data Transfer Object:数据传输对象。在不同层(如 Controller → Service → DAO)间封装并传递数据。
Data Access Object:数据访问对象。它是一层逻辑,包含实体类、数据库操作(CRUD)、数据校验、错误处理等。

总结
本篇文章,我们学习了一些良好的编程思想,后续将在我们的项目中运用这些思想,编写更加易读且健壮的代码。
好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!
参考资料:
- DeepSeek
- NestJS 从入门到实战

相关文章:
编程思想——FP、OOP、FRP、AOP、IOC、DI、MVC、DTO、DAO
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
实现一个动态验证码生成器:Canvas与JavaScript的完美结合
验证码(CAPTCHA)是现代网站中常见的安全机制,用于区分人类用户和自动化程序。本文将详细介绍如何使用HTML5 Canvas和JavaScript创建一个美观且功能完整的验证码生成器。 一、核心功能概述 这个验证码生成器具有以下特点: 随机生…...
python中 “with” 关键字的取舍问题
自动管理资源(自动关闭文件) 当你使用 with 打开文件时,文件会在 with 代码块结束后自动关闭,无论是否发生异常。这意味着你不需要显式地调用 f.close() 来关闭文件 示例: with open("words.txt", "r…...
【区块链安全 | 第三十九篇】合约审计之delegatecall(一)
文章目录 外部调用函数calldelegatecallcall 与 delegatecall 的区别示例部署后初始状态调用B.testCall()函数调用B.testDelegatecall()函数区别总结漏洞代码代码审计攻击代码攻击原理解析攻击流程修复建议审计思路外部调用函数 在 Solidity 中,常见的两种底层外部函数调用方…...
Nginx部署spa单页面的小bug
没部署过,都是给后端干的,自己尝试部署了一个下午终于成功了 我遇到的最大的bug是进入后只有首页正常显示 其他页面全是404,于是问问问才知道,需要这个 location / { try_files $uri $uri/ /index.html; } 让…...
linux多线(进)程编程——(6)共享内存
前言 话说进程君的儿子经过父亲点播后就开始闭关,它想要开发出一种全新的传音神通。他想,如果两个人的大脑生长到了一起,那不是就可以直接知道对方在想什么了吗,这样不是可以避免通过语言传递照成的浪费吗? 下面就是它…...
【愚公系列】《Python网络爬虫从入门到精通》050-搭建 Scrapy 爬虫框架
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷
2021年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项 任务书1 赛项时间 共计X小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 任务2 网络安全设备配置与防护 第二…...
讲解贪心算法
贪心算法是一种常用的算法思想,其在解决问题时每一步都做出在当前状态下看起来最优的选择,从而希望最终能够获得全局最优解。C作为一种流行的编程语言,可以很好地应用于贪心算法的实现。下面我们来讲一篇关于C贪心算法的文章。 目录 贪心算法…...
高并发秒杀系统设计:关键技术解析与典型陷阱规避
电商、在线票务等众多互联网业务场景中,高并发秒杀活动屡见不鲜。这类活动往往在短时间内会涌入海量的用户请求,对系统架构的性能、稳定性和可用性提出了极高的挑战。曾经,高并发秒杀架构设计让许多开发者望而生畏,然而࿰…...
微信小程序实战案例 - 餐馆点餐系统 阶段 2 – 购物车
阶段 2 – 购物车(超详细版) 目标 把“加入购物车”做成 全局状态,任何页面都能读写在本地 持久化(关闭小程序后购物车仍在)新建 购物车页:数量增减、总价实时计算、去结算入口打 Git Tag v2.0‑cart 1. …...
Qt 元对象系统探秘:从 Q_OBJECT 到反射编程的魔法之旅
背景说明:Qt 背后的「魔法引擎」 如果你曾用 Qt 写过信号槽,或是在设计器里拖过控件改属性,一定对这个框架的“动态性”印象深刻: 无需手动调用,信号能自动连接到槽函数;无需编译重启,界面上修…...
sql 向Java的映射
优化建议,可以在SQL中控制它的类型 在 MyBatis 中,如果返回值类型设置为 java.util.Map,默认情况下可以返回 多行多列的数据...
Visual Studio未能加载相应的Package包弹窗报错
环境介绍: visulal studio 2019 问题描述: 起因:安装vs扩展插件后,重新打开Visual Studio,报了一些列如下的弹窗错误,即使选择不继续显示该错误,再次打开后任然报错; 解决思路&am…...
【HD-RK3576-PI】Docker搭建与使用
硬件:HD-RK3576-PI 软件:Linux6.1Ubuntu22.04 1.Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵循 Apache 2.0 协议。它可以让开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,并在任…...
C语言实现用户管理系统
以下是一个简单的C语言用户管理系统示例,它实现了用户信息的添加、删除、修改和查询功能。代码中包含了详细的注释和解释,帮助你理解每个部分的作用。 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_USERS…...
【websocket】使用案例( JSR 356 标准)
目录 一、JSR 356方式:简单示例 1、引入依赖 2、注册端点扫描器 3、编写通过注解处理生命周期和消息 4、细节解读 5、总结 二、聊天室案例 方案流程 1、引入依赖 2、注册端点扫描器 3、编写一个配置类,读取httpsession 4、编写通过注解处理生…...
tcpdump`是一个非常强大的命令行工具,用于在网络上捕获并分析数据包
通过 tcpdump,你可以抓取网络流量,诊断网络问题,或分析通信协议的细节。下面是如何在 Linux 上使用 tcpdump 进行抓包的详细步骤。 1. 安装 tcpdump 在大多数 Linux 发行版中,tcpdump 是默认安装的。如果没有安装,可…...
IS-IS中特殊字段——OL过载
文章目录 OL 过载位 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年04月13日20点12分 OL 过载位 路由过载 使用 IS-IS 的过载标记来标识过载状态 对设备设置过载标记后ÿ…...
【时频谱分析】快速谱峭度
算法配置页面,也可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc...
Spring Boot 支持的内嵌服务器(Tomcat、Jetty、Undertow、Netty(用于 WebFlux 响应式应用))详解
Spring Boot 支持的内嵌服务器详解 1. 支持的内嵌服务器 Spring Boot 默认支持以下内嵌服务器: Tomcat(默认)JettyUndertowNetty(用于 WebFlux 响应式应用) 2. 各服务器使用示例 (1) Tomcat(默认…...
微软Exchange管理中心全球范围宕机
微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖Exchange Online的企业造成广…...
基于AI的Web应用防火墙(AppWall)实战:漏洞拦截与威胁情报集成
摘要:针对Web应用面临的OWASP、CVE等漏洞攻击,本文结合群联AI云防护系统的AppWall模块,详解AI规则双引擎的防御原理,并提供漏洞拦截配置与威胁情报集成代码示例。 一、Web应用安全挑战与AppWall优势 传统WAF依赖规则库更新滞后&a…...
基于Qt的串口通信工具
程序介绍 该程序是一个基于Qt的串口通信工具,专用于ESP8266 WiFi模块的AT指令配置与调试。主要功能包括: 1. 核心功能 串口通信:支持串口开关、参数配置(波特率、数据位、停止位、校验位)及数据收发。 AT指令操作&a…...
CSS 字体学习笔记
在网页设计中,字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性,用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列(font-family) 1. 字体系列的分类 在 CSS 中…...
《MySQL是怎样运行的》总结笔记
内容太多,主要总结一些自己认为重要的,另外太基础常见可能不会总结上。 字符集和比较规则 MySQL会通过把字符串编码后再进行比较大小并排序,有一些很早的字符集可能会不支持中文,比如ASCII、ISO 8859-1,现在最常用的…...
力扣每日打卡 1922. 统计好数字的数目 (中等)
力扣 1922. 统计好数字的数目 中等 前言一、题目内容二、解题方法1. 暴力解法(会超时,此法不通)2. 快速幂运算3. 组合计数的思维逻辑分析组合计数的推导例子分析思维小结论 4.官方题解4.1 方法一:快速幂 三、快速幂运算快速幂运算…...
上层 Makefile 控制下层 Makefile 的方法
在复杂的项目中,通常会将项目划分为多个模块或子项目,每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例,实现上层 Makefile 对下层 Makefile 的控制。 直接调用࿱…...
html简易实现推箱子小游戏原理(易上手)
实现效果 使用方向键移动,将橙色箱子推到绿色目标区域(黑色块为墙,白色块为可通过区域,蓝球为小人) 实现过程 <!DOCTYPE html> <html> <head><title>推箱子小游戏</title><style&g…...
搭建一个Spring Boot聚合项目
1. 创建父项目 打开IntelliJ IDEA,选择 New Project。 在创建向导中选择 Maven,确保选中 Create from archetype,选择 org.apache.maven.archetypes:maven-archetype-quickstart。 填写项目信息: GroupId:com.exampl…...
