面向对象与面向过程、函数式编程

面向对象与面向过程、函数式编程

1. 面向过程编程(Procedure-Oriented Programming)

面向过程编程将程序视为一系列函数的集合,数据和操作数据的函数是分离的。在 Vue 3 中,这种风格通常表现为使用组合式 APIComposition API)以函数式的方式组织代码。

示例:Todo 应用(面向过程)

// Todo 应用 - 面向过程实现
import { ref, computed, onMounted } from 'vue';// 定义数据结构
interface Todo {id: number;title: string;completed: boolean;
}// 状态管理(使用 ref 和 reactive)
const todos = ref<Todo[]>([]);
const newTodoTitle = ref('');// 计算属性
const completedTodos = computed(() => todos.value.filter(todo => todo.completed)
);// 方法
const addTodo = () => {if (newTodoTitle.value.trim()) {todos.value.push({id: Date.now(),title: newTodoTitle.value,completed: false});newTodoTitle.value = '';}
};const toggleTodo = (id: number) => {const todo = todos.value.find(t => t.id === id);if (todo) {todo.completed = !todo.completed;}
};const deleteTodo = (id: number) => {todos.value = todos.value.filter(t => t.id !== id);
};// 生命周期钩子
onMounted(() => {// 从本地存储加载数据const savedTodos = localStorage.getItem('todos');if (savedTodos) {todos.value = JSON.parse(savedTodos);}
});// 监听变化,保存到本地存储
watch(todos, (newTodos) => {localStorage.setItem('todos', JSON.stringify(newTodos));
});// 导出所有需要在模板中使用的内容
export {todos,newTodoTitle,completedTodos,addTodo,toggleTodo,deleteTodo
};

特点

  • 数据和逻辑分离:状态(todosnewTodoTitle)和操作(addTodotoggleTodo)是分开定义的。
  • 线性结构:代码按照功能逻辑组织成独立的函数。
  • 灵活组合:可以轻松地复用单个函数或组合多个功能。

2. 面向对象编程(Object-Oriented Programming)

面向对象编程将数据和操作数据的方法封装在一起,形成对象,通过类来创建对象实例。在 Vue 3 中,可以使用类组件或在组合式 API 中封装类来实现。

示例:Todo 应用(面向对象)

// Todo 应用 - 面向对象实现
import { ref, computed, onMounted, watch } from 'vue';// 定义 Todo 类
class Todo {constructor(public id: number,public title: string,public completed: boolean = false) {}toggle() {this.completed = !this.completed;}
}// Todo 管理器类
class TodoManager {private _todos = ref<Todo[]>([]);private _newTodoTitle = ref('');constructor() {// 初始化onMounted(() => this.loadFromLocalStorage());watch(this._todos, () => this.saveToLocalStorage());}// 获取 todos 的计算属性get todos() {return this._todos;}get newTodoTitle() {return this._newTodoTitle;}get completedTodos() {return computed(() => this._todos.value.filter(todo => todo.completed));}// 方法addTodo() {if (this._newTodoTitle.value.trim()) {this._todos.value.push(new Todo(Date.now(), this._newTodoTitle.value));this._newTodoTitle.value = '';}}toggleTodo(id: number) {const todo = this._todos.value.find(t => t.id === id);todo?.toggle();}deleteTodo(id: number) {this._todos.value = this._todos.value.filter(t => t.id !== id);}// 私有方法private saveToLocalStorage() {localStorage.setItem('todos',JSON.stringify(this._todos.value));}private loadFromLocalStorage() {const savedTodos = localStorage.getItem('todos');if (savedTodos) {this._todos.value = JSON.parse(savedTodos).map((todo: any) => new Todo(todo.id, todo.title, todo.completed));}}
}// 创建单例实例
const todoManager = new TodoManager();// 导出需要在模板中使用的内容
export {todoManager
};

特点

  • 封装性:将数据(_todos_newTodoTitle)和操作(addTodotoggleTodo)封装在 TodoManager 类中。
  • 继承与多态:可以通过继承扩展功能(例如创建 AdvancedTodoManager)。
  • 状态内聚:相关的状态和方法被组织在一起,便于维护和复用。
维度面向过程面向对象
代码结构函数和数据分离,线性组织数据和方法封装在类中,层次化组织
复用方式函数复用类的继承和组合
状态管理分散管理(多个 ref/reactive)集中管理(类的实例属性)
适用场景简单逻辑、工具函数、快速迭代复杂业务逻辑、需要高内聚低耦合的系统
Vue 3 实现方式组合式 API类组件或在组合式 API 中封装类

在实际项目中,通常会混合使用两种范式。例如:

  • 使用面向过程的方式处理简单逻辑
  • 使用面向对象的方式封装复杂业务领域模型
// 混合使用示例:在组合式 API 中使用类
import { ref, computed, onMounted } from 'vue';// 定义领域模型(面向对象)
class User {constructor(public id: number, public name: string) {}changeName(newName: string) {this.name = newName;}
}// 在组合式 API 中使用(面向过程风格)
export function useUser() {const currentUser = ref<User | null>(null);const fetchUser = async (id: number) => {// API 请求...const userData = { id, name: 'John' };currentUser.value = new User(userData.id, userData.name);};const userName = computed(() => currentUser.value?.name || 'Guest');return {currentUser,userName,fetchUser};
}
  • 面向过程适合简单、灵活的场景,在 Vue 3 中自然地体现为组合式 API 的使用。
  • 面向对象适合复杂、需要高内聚的场景,可以通过类来封装业务逻辑。

3.函数式编程

3.1 对比

编程范式核心思想关键特性
面向过程(POP)将程序分解为一系列步骤(函数),数据与操作分离函数、顺序执行、共享状态
面向对象(OOP)将数据和操作封装为对象,通过类创建实例,强调继承和多态类、对象、继承、封装、多态
函数式编程(FP)将计算视为函数的求值,避免共享状态和可变数据,强调纯函数和不可变性纯函数、不可变数据、高阶函数、函数组合、无副作用

3.2 函数式编程与面向过程的关联

3.2.1 相似点
  • 函数为基本单元:两者都使用函数作为代码的基本构建块。
  • 过程式执行:都可以按照步骤顺序执行代码。
3.2.2 不同点
  • 状态管理
    • POP:依赖共享状态和可变数据。
    • FP:避免共享状态,强调不可变性和纯函数。
  • 函数特性
    • POP:函数可以有副作用,修改外部状态。
    • FP:函数是纯的,不产生副作用,相同输入始终返回相同输出。

POP 风格:

// 面向过程:使用共享状态和有副作用的函数
const count = ref(0);const increment = () => {count.value++; // 修改共享状态
};

FP 风格:

// 函数式:使用不可变数据和纯函数
const state = ref({ count: 0 });const increment = () => {state.value = { ...state.value, count: state.value.count + 1 }; // 创建新对象
};

3.3 函数式编程与面向对象的关联

3.3.1 互补性
  • OOP擅长处理复杂的状态管理和对象关系(如继承、多态)。
  • FP擅长处理数据转换和无副作用的操作。
3.3.2 不同点
  • 封装方式
    • OOP:通过类和对象封装数据和行为。
    • FP:通过函数封装行为,数据和操作分离。
  • 数据流动
    • OOP:通过对象方法修改内部状态(可变数据)。
    • FP:通过纯函数产生新数据(不可变数据)。

OOP 管理领域模型:

class ShoppingCart {private items = ref<Product[]>([]);addItem(product: Product) {this.items.value = [...this.items.value, product]; // 使用 FP 思想的不可变更新}
}

FP 处理数据转换:

// 使用纯函数处理数据
const calculateTotal = (items: Product[]) => items.reduce((total, item) => total + item.price, 0);

3.4. 函数式编程在 Vue 3 中的典型应用

3.4.1 纯函数组件
// 纯函数组件(无状态)
const Button = (props: { label: string; onClick: () => void }) => {return (<button onClick={props.onClick}>{props.label}</button>);
};
3.4.2 不可变数据处理
// 使用 Immer 简化不可变数据操作
import produce from 'immer';const updateUser = (userId: number, newData: Partial<User>) => {users.value = produce(users.value, draft => {const user = draft.find(u => u.id === userId);if (user) {Object.assign(user, newData);}});
};
3.4.3 高阶函数与组合
// 高阶函数:创建可复用的状态处理器
const withLoading = <T>(fetcher: () => Promise<T>) => {const loading = ref(false);const data = ref<T | null>(null);const error = ref<string | null>(null);const execute = async () => {loading.value = true;try {data.value = await fetcher();} catch (err) {error.value = err.message;} finally {loading.value = false;}};return { loading, data, error, execute };
};

3.5. 三种范式的协作模式

3.5.1 分层架构
  • 表现层Vue 组件(可以是 OOPPOP 风格)
  • 业务逻辑层:领域模型(OOP)+ 纯函数(FP
  • 数据访问层:函数式的数据转换(FP
3.5.2 混合使用示例
// 组合式 API 中混合使用三种范式
import { ref, computed } from 'vue';// OOP:领域模型
class Todo {constructor(public id: number, public title: string) {}markAsCompleted() {return new Todo(this.id, this.title, true); // 使用 FP 思想创建新对象}
}// FP:纯函数处理数据
const filterTodos = (todos: Todo[], status: 'all' | 'completed' | 'active') => {if (status === 'completed') return todos.filter(t => t.completed);if (status === 'active') return todos.filter(t => !t.completed);return todos;
};// POP:组合式 API 组织逻辑
export function useTodos() {const todos = ref<Todo[]>([]);const filter = ref<'all' | 'completed' | 'active'>('all');const filteredTodos = computed(() => filterTodos(todos.value, filter.value));const addTodo = (title: string) => {todos.value = [...todos.value, new Todo(Date.now(), title)];};return {todos,filter,filteredTodos,addTodo};
}
场景推荐范式理由
简单脚本或工具函数面向过程(POP)快速实现,逻辑直接
复杂业务对象建模面向对象(OOP)封装状态和行为,利用继承和多态
数据处理、流式计算函数式编程(FP)纯函数和不可变性避免副作用,便于测试和调试
状态管理与组件交互混合使用Vue 3 的组合式 API 天然支持多种范式,根据具体需求选择或组合使用

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

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

相关文章

基于大数据的淘宝用户行为数据分析系统的设计与实现

开发环境开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

视频人脸处理——人脸面部动作提取

文章目录基于openface实现的技术方案windows环境下使用1. 安装依赖软件2. 下载OpenFace代码3. 编译OpenFace4. 提取面部动作单元5.选择提取目标方案liunx环境下使用安装与配置使用 OpenFace 提取面部动作单元应用场景基于py-feat实现的方案1. 从HuggingFace下载模型并设置Detec…

【Docker基础】Dockerfile构建与运行流程完全指南:从原理到实践优化

目录 引言 1 docker build命令参数详解 1.1 命令概述 1.2 常用参数详解 1.2.1 -t, --tag 1.2.2 -f, --file 1.2.3 --build-arg 1.2.4 --no-cache 1.2.5 --pull 1.3 构建流程图解 2 构建上下文&#xff08;Context&#xff09;优化技巧 2.1 构建上下文定义 2.2 优化…

StarRocks Community Monthly Newsletter (Jun)

版本动态 v3.5.0 存算分离&#xff1a;支持生成列、主键表重建索引&#xff1b;大规模导入逻辑优化&#xff0c;降低小文件数量。 数据湖分析&#xff1a;Beta 支持 Iceberg 视图创建与修改&#xff1b;支持 Iceberg REST Catalog 嵌套命名空间&#xff1b; 性能提升与查询优…

HDMI接口 vs. DisplayPort接口:电竞玩家该如何选择更优?

在搭建游戏主机或电竞PC时&#xff0c;显示器接口的选择&#xff08;HDMI vs. DP&#xff09;会直接影响画质、刷新率和延迟表现。本文将从分辨率、刷新率、可变刷新率&#xff08;VRR&#xff09;、带宽、兼容性等角度对比&#xff0c;帮你选出最适合游戏的接口。1. 基础对比&…

论文笔记:Learning Cache Replacement with CACHEUS

2021 USENIX GitHub - sylab/cacheus: The design and algorithms used in Cacheus are described in this USENIX FAST21 paper and talk video: https://www.usenix.org/conference/fast21/presentation/rodriguez Learning Cache Replacement with CACHEUS 1 intro 基于…

极致cms多语言建站|设置主站默认语言与设置后台固定语言为中文

小记 很长时间没有建站了,最近有需求所以又回炉了&#xff0c;使用的极致cms 极致cms帮助文档 | 极致CMS帮助文档 由于很长时间没做&#xff0c;又遇到了之前碰到的两个问题&#xff0c;凭借经验和记忆还是处理掉了 1.当网站前台使用?len或?lzh来切换语言时&#xff0c;管…

Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)

前言在 Linux 的世界中&#xff0c;Vim 是一款被无数开发者喜爱和追捧的强大文本编辑器。如果你厌倦了鼠标点来点去&#xff0c;不妨试试 Vim —— 一款专注于高效键盘操作的“终极利器”。本文将带你全面了解 Vim 的基本概念、模式切换、常用命令、窗口管理&#xff0c;并附上…

web前端渡一大师课 01 事件循环

一. 浏览器的进程模型 1.何为进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意 2.何为线程?有了进程后,就可以运行程序的代码了,运行代码的"人",称之为"线程&…

linux网络存储——freeNAS的安装配置

一、前言 freeNAS 是一款基于 FreeBSD 的开源网络存储操作系统&#xff0c;支持文件共享&#xff08;如 SMB/CIFS、NFS、AFP&#xff09;、数据备份、虚拟化存储等功能。同时FreeNAS开源优势明显&#xff0c;代码开放可自主定制&#xff0c;能满足多样需求。支持多种协议…

深度学习图像分类数据集—七种树叶识别分类

该数据集为图像分类数据集&#xff0c;适用于ResNet、VGG等卷积神经网络&#xff0c;SENet、CBAM等注意力机制相关算法&#xff0c;Vision Transformer等Transformer相关算法。 数据集信息介绍&#xff1a;七种树叶识别分类&#xff1a;[冬青叶, 杨树叶, 柳叶, 梧桐叶, 石楠叶,…

c++图形题练习程序

一.练习题背景 这题是作者再一家公司实习的时候&#xff0c;实习期间的一个考核题目&#xff0c;感觉还是比较有价值的。希望能给还在努力的学弟学妹们一些启发。 题目大致就是要求用继承和多态来实现圆、三角形和长方形的面积和周长求解。这步的大致思路是这样的&#xff0c;你…

【论文阅读 | PR 2024 |ITFuse:一种用于红外与可见光图像融合的交互式 Transformer】

论文阅读 | PR 2024 |ITFuse&#xff1a;一种用于红外与可见光图像融合的交互式 Transformer1.摘要&&引言2.方法2.1 问题表述2.2 框架概述2.3 特征交互模块2.3.1 共同特征提取分支&#xff08;IcI_{c}Ic​ 分支&#xff09;2.3.2 独特特征提取分支&#xff08;I1I_{1}I…

【Qt】 设计模式

在Qt应用程序开发中&#xff0c;结合数据库操作、通信、界面逻辑和显示等功能&#xff0c;以下是常用的设计模式及其典型应用场景&#xff1a; 一、MVC/MVVM&#xff08;模型-视图-控制器/视图模型&#xff09; 作用&#xff1a;分离数据&#xff08;模型&#xff09;、界面&am…

【HarmonyOS】ArkUI-X 跨平台框架入门详解(一)

【HarmonyOS】ArkUI-X 跨平台框架入门详解&#xff08;一&#xff09; 一、前言 1、ArkUI-X框架是什么&#xff1f; ArkUI-X是在ArkUI开发框架的基础上&#xff0c;进行扩展。支持多个OS平台&#xff0c;目前支持OpenHarmony、HarmonyOS、Android、 iOS。2、ArkUI-X目前的能力现…

开发者进化论:驾驭AI,开启软件工程新纪元

导语&#xff1a;人工智能&#xff08;AI&#xff09;的浪潮&#xff0c;特别是以大型语言模型&#xff08;LLM&#xff09;为代表的生成式AI&#xff0c;正以前所未有的力量&#xff0c;深刻地重塑着软件开发的传统疆域。我们正处在一个关键的转折点——产业的重心正从模型的“…

智慧水务平台,智慧水务,惠及民生,提升水务管理效率与服务质量

平升电子智慧水务平台支持海量物联网数据接入实现供水全流程信息化&#xff0c;深度逻辑运算自动控制实现供水调度智慧化&#xff0c;融入管网地理信息系统实现测点数据时空化&#xff0c;数字孪生实现水厂各工艺环节运行情况可视化&#xff0c;多角度统计分析实现水务运营管理…

【Unity基础】Unity中元素的层级排序

在Unity中&#xff0c;控制元素的层级排序&#xff08;渲染顺序&#xff09;是确保场景正确显示的关键。以下是常见的层级排序方式及其适用场景&#xff1a;1. 通过GameObject的层级顺序&#xff08;Sorting Layer/Order in Layer&#xff09; 适用对象&#xff1a;2D精灵&…

梁的振动特征函数分析2

问题7&#xff1a;左端固定、右端自由梁的振动分析 考虑梁的振动方程&#xff1a; uttKuxxxx0,0<x<l,K>0 u_{tt} K u_{xxxx} 0, \quad 0 < x < l, \quad K > 0 utt​Kuxxxx​0,0<x<l,K>0 边界条件&#xff1a; 左端固定&#xff08;位移和斜率为零…

AI问答-Token:在人工智能领域,Token 是模型处理文本的核心单元 / 最小可处理片段

一、在人工智能领域&#xff0c;Token 是模型处理文本的核心单元&#xff0c;可理解为文本的“最小可处理片段”二、表格理解类别详细说明基本定义Token 是模型处理文本的最小语义或语法单位&#xff0c;可以是单词、子词、字符、标点符号或特殊符号。例如&#xff1a;- 单词级…