编程思想——FP、OOP、FRP、AOP、IOC、DI、MVC、DTO、DAO

news2025/7/8 18:46:46

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展
📃个人状态: 研发工程师,现效力于中国工业软件事业
🚀人生格言: 积跬步至千里,积小流成江海
🥇推荐学习:🍍前端面试宝典 🎨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), // 每次点击映射为1
  scan((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 name

const 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)、数据校验、错误处理等。

在这里插入图片描述


总结

本篇文章,我们学习了一些良好的编程思想,后续将在我们的项目中运用这些思想,编写更加易读且健壮的代码。

好啦,本篇文章到这里就要和大家说再见啦,祝你这篇文章阅读愉快,你下篇文章的阅读愉快留着我下篇文章再祝!


参考资料:

  1. DeepSeek
  2. NestJS 从入门到实战

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【区块链安全 | 第三十九篇】合约审计之delegatecall(一)

文章目录 外部调用函数calldelegatecallcall 与 delegatecall 的区别示例部署后初始状态调用B.testCall()函数调用B.testDelegatecall()函数区别总结漏洞代码代码审计攻击代码攻击原理解析攻击流程修复建议审计思路外部调用函数 在 Solidity 中,常见的两种底层外部函数调用方…

linux多线(进)程编程——(6)共享内存

前言 话说进程君的儿子经过父亲点播后就开始闭关,它想要开发出一种全新的传音神通。他想,如果两个人的大脑生长到了一起,那不是就可以直接知道对方在想什么了吗,这样不是可以避免通过语言传递照成的浪费吗? 下面就是它…

信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷

2021年全国职业院校技能大赛高职组 “信息安全管理与评估”赛项 任务书1 赛项时间 共计X小时。 赛项信息 赛项内容 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 任务1 网络平台搭建 任务2 网络安全设备配置与防护 第二…

高并发秒杀系统设计:关键技术解析与典型陷阱规避

电商、在线票务等众多互联网业务场景中,高并发秒杀活动屡见不鲜。这类活动往往在短时间内会涌入海量的用户请求,对系统架构的性能、稳定性和可用性提出了极高的挑战。曾经,高并发秒杀架构设计让许多开发者望而生畏,然而&#xff0…

微信小程序实战案例 - 餐馆点餐系统 阶段 2 – 购物车

阶段 2 – 购物车(超详细版) 目标 把“加入购物车”做成 全局状态,任何页面都能读写在本地 持久化(关闭小程序后购物车仍在)新建 购物车页:数量增减、总价实时计算、去结算入口打 Git Tag v2.0‑cart 1. …

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 协议。它可以让开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中,并在任…

【websocket】使用案例( ​JSR 356 标准)

目录 一、JSR 356方式:简单示例 1、引入依赖 2、注册端点扫描器 3、编写通过注解处理生命周期和消息 4、细节解读 5、总结 二、聊天室案例 方案流程 1、引入依赖 2、注册端点扫描器 3、编写一个配置类,读取httpsession 4、编写通过注解处理生…

IS-IS中特殊字段——OL过载

文章目录 OL 过载位 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年04月13日20点12分 OL 过载位 路由过载 使用 IS-IS 的过载标记来标识过载状态 对设备设置过载标记后&#xff…

【时频谱分析】快速谱峭度

算法配置页面,也可以一键导出结果数据 报表自定义绘制 获取和下载【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(默认&#xf…

微软Exchange管理中心全球范围宕机

微软已确认Exchange管理中心(Exchange Admin Center,EAC)发生全球性服务中断,导致管理员无法访问关键管理工具。该故障被标记为关键服务事件(编号EX1051697),对依赖Exchange Online的企业造成广…

基于Qt的串口通信工具

程序介绍 该程序是一个基于Qt的串口通信工具,专用于ESP8266 WiFi模块的AT指令配置与调试。主要功能包括: 1. 核心功能 串口通信:支持串口开关、参数配置(波特率、数据位、停止位、校验位)及数据收发。 AT指令操作&a…

html简易实现推箱子小游戏原理(易上手)

实现效果 使用方向键移动&#xff0c;将橙色箱子推到绿色目标区域&#xff08;黑色块为墙&#xff0c;白色块为可通过区域&#xff0c;蓝球为小人&#xff09; 实现过程 <!DOCTYPE html> <html> <head><title>推箱子小游戏</title><style&g…

字符串与栈和队列-算法小结

字符串 双指针 反转字符串(双指针) 力扣题目链接 void reverseString(vector<char>& s) {for (int i 0, j s.size() - 1; i < s.size()/2; i, j--) {swap(s[i],s[j]);} }反转字符串II 力扣题目链接 遍历字符串的过程中&#xff0c;只要让 i (2 * k)&#…

类似东郊到家的上门按摩预约服务系统小程序APP源码全开源

&#x1f525; 为什么上门按摩正在席卷全国&#xff1f; 万亿蓝海市场爆发 2024年中国按摩市场规模突破8000亿&#xff0c;上门服务增速达65% 90后成消费主力&#xff0c;**72%**白领每月至少使用1次上门按摩&#xff08;数据来源&#xff1a;艾媒咨询&#xff09; 传统痛点…

Python | 在Pandas中按照中值对箱形图排序

箱形图是可视化数据分布的强大工具&#xff0c;因为它们提供了对数据集内的散布、四分位数和离群值的洞察。然而&#xff0c;当处理多个组或类别时&#xff0c;通过特定的测量&#xff08;如中位数&#xff09;对箱形图进行排序可以提高清晰度并有助于揭示模式。在本文中&#…

游戏引擎学习第215天

总结并为今天做铺垫 今天的工作内容是解决调试系统中的一个小问题。昨天我们已经完成了大部分的调试系统工作&#xff0c;但还有一个小部分没有完全处理&#xff0c;那就是关于如何层次化组织数据的问题。我们遇到的一个问题是&#xff0c;演示代码中仍有一个尚未解决的部分&a…

【Redis】redis事物与管道

Redis 事务&#xff08;Transaction&#xff09; 事务概念 事务&#xff1a;是一组操作的集合&#xff0c;是不可分割的工作单元。Redis 事务特点&#xff1a; 一个事务可以一次执行多个命令。所有命令都被顺序化&#xff0c;形成一个队列。所有命令在执行 EXEC 时一次性、顺…