面向對象與面向過程、函數式編程

面向對象與面向過程、函數式編程

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
英文地址,請注明出處:http://en.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;- 單詞級…