C++ 結構體封裝模式與 Promise 鏈式調用:設計思想的異曲同工

C++ 結構體封裝模式與 Promise 鏈式調用:設計思想的異曲同工

在軟件開發中,我們常常追求代碼的可維護性、可擴展性和可讀性。不同的編程語言和場景下,雖然實現方式各異,但背后的設計思想往往存在著奇妙的相似性。本文將探討 C++ 中結構體封裝模式與 JavaScript 中 Promise 鏈式調用的內在聯系,揭示它們如何通過不同的語法實現相似的設計目標。

一、C++ 結構體封裝模式:數據聚合與接口統一

在 C++ 編程中,我們經常會遇到需要封裝多個相關屬性的類。一種常見的實踐是將所有私有屬性封裝在一個結構體中,通過統一的接口訪問這個結構體。這種模式在團隊協作中尤為有用,它能夠提高代碼的一致性和可維護性。

1.1 基礎實現示例

#include <iostream>class Myc {
private:// 將所有私有數據封裝在一個結構體中struct Data {int num1;int num2;};Data main_data;public:Myc() : main_data({0, 0}) {}~Myc() = default;// 統一的訪問接口const Data& getData() const {return main_data;}// 統一的修改接口void setData(const Data& data) {main_data = data;}
};int main() {Myc obj;obj.setData({2, 6});// 按需訪問具體數據std::cout << "num1: " << obj.getData().num1 << std::endl;std::cout << "num2: " << obj.getData().num2 << std::endl;return 0;
}

1.2 模式優勢分析

這種模式的核心優勢在于:

  1. 數據聚合:將相關數據集中管理,使類的結構更加清晰
  2. 接口穩定:類的公共接口不隨內部數據結構的變化而變化
  3. 維護便捷:修改數據結構只需在一個地方進行更改
  4. 代碼規范:形成統一的代碼模式,便于團隊協作

二、JavaScript Promise 鏈式調用:異步操作的流程控制

在 JavaScript 中,Promise 是處理異步操作的標準方式。通過 .then() 方法,我們可以鏈式調用多個異步操作,形成清晰的執行流程。

2.1 基礎實現示例

function fetchUserData(userId) {return new Promise((resolve, reject) => {// 模擬網絡請求setTimeout(() => {if (userId > 0) {resolve({id: userId,name: "John Doe",age: 30,email: "john@example.com"});} else {reject(new Error("Invalid user ID"));}}, 1000);});
}function processUserData(user) {return new Promise((resolve) => {// 模擬數據處理setTimeout(() => {const processedData = {...user,profile: `Name: ${user.name}, Age: ${user.age}`};resolve(processedData);}, 500);});
}// 鏈式調用
fetchUserData(1).then(user => processUserData(user)).then(processedData => {// 按需訪問具體數據console.log("User Profile:", processedData.profile);console.log("Email:", processedData.email);}).catch(error => {console.error("Error:", error.message);});

2.2 模式優勢分析

Promise 鏈式調用的核心優勢在于:

  1. 流程清晰:將復雜的異步操作線性化,避免回調地獄
  2. 關注點分離:異步操作的執行與結果處理分離
  3. 錯誤統一處理:通過 .catch() 集中處理異常
  4. 延遲執行:結果在異步操作完成后按需訪問

三、兩種模式的內在聯系

雖然 C++ 結構體封裝模式處理的是同步數據,而 JavaScript Promise 處理的是異步操作,但它們在設計思想上存在著明顯的相似性。

3.1 統一返回接口

兩種模式都通過統一的接口返回數據:

  • 結構體封裝模式返回一個包含多個屬性的結構體
  • Promise 鏈式調用返回一個包含異步結果的 Promise 對象

這種設計使得調用者可以以一致的方式獲取數據,而不必關心數據的具體來源或生成方式。

3.2 延遲訪問

在兩種模式中,數據的具體訪問都是延遲的:

  • 結構體封裝模式中,調用者在需要時才訪問結構體的具體成員
  • Promise 鏈式調用中,調用者在異步操作完成后才通過回調函數訪問結果

這種延遲訪問的設計使得代碼更加靈活,可以根據實際需要選擇性地處理數據。

3.3 關注點分離

兩種模式都實現了關注點的分離:

  • 結構體封裝模式將數據管理與數據使用分離
  • Promise 鏈式調用將異步操作的執行與結果處理分離

這種分離使得代碼更加模塊化,每個部分只負責自己的核心職責。

四、模式結合應用示例

在實際開發中,這兩種模式經常結合使用,特別是在處理網絡請求時。下面是一個 C++ 和 JavaScript 的對比示例,展示它們如何協同工作。

4.1 C++ 網絡請求模擬

#include <iostream>
#include <future>
#include <string>
#include <vector>// 模擬網絡響應結構
class ApiResponse {
private:struct Data {int statusCode;std::string message;std::vector<int> data;};Data responseData;public:ApiResponse(int code, std::string msg, std::vector<int> data) : responseData{code, msg, data} {}const Data& getResponse() const {return responseData;}bool isSuccess() const {return responseData.statusCode == 200;}
};// 異步網絡請求
std::future<ApiResponse> fetchDataAsync() {return std::async([]() {// 模擬網絡延遲std::this_thread::sleep_for(std::chrono::seconds(1));return ApiResponse(200, "Success", {1, 2, 3, 4, 5});});
}int main() {auto future = fetchDataAsync();// 等待異步操作完成ApiResponse response = future.get();if (response.isSuccess()) {const auto& data = response.getResponse();// 按需訪問具體數據std::cout << "Message: " << data.message << std::endl;std::cout << "Data size: " << data.data.size() << std::endl;}return 0;
}

4.2 JavaScript 網絡請求示例

function fetchData() {return fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}return response.json();}).then(data => {// 封裝響應數據return {statusCode: response.status,message: "Success",data: data.items};});
}fetchData().then(response => {// 按需訪問具體數據console.log("Message:", response.message);console.log("Data size:", response.data.length);}).catch(error => {console.error("Error:", error.message);});

五、設計原則的普適性

這兩種模式的相似性反映了軟件設計中的兩個重要原則:

5.1 單一職責原則

每個組件(類、函數)應該只負責一個明確的職責:

  • 結構體封裝模式中的類負責管理數據
  • Promise 鏈式調用中的每個異步操作負責生成特定的結果

5.2 接口隔離原則

通過統一的接口提供訪問,減少調用者與實現細節的耦合:

  • 結構體封裝模式通過 getData() 方法提供統一訪問
  • Promise 鏈式調用通過 .then() 方法提供統一的結果處理接口

六、總結與實踐建議

6.1 模式適用場景

  • 結構體封裝模式適用于:

    • 需要封裝多個相關屬性的類
    • 希望保持接口穩定,減少外部依賴的場景
    • 團隊協作中需要統一代碼風格的場景
  • Promise 鏈式調用適用于:

    • 處理異步操作,如網絡請求、文件讀寫等
    • 需要按順序執行多個異步操作的場景
    • 希望清晰表達異步流程,避免回調地獄的場景

6.2 團隊協作建議

  1. 明確規范:在團隊文檔中明確這兩種模式的使用場景和最佳實踐
  2. 代碼審查:在代碼審查過程中,確保模式的正確應用
  3. 靈活應用:根據具體場景選擇合適的模式,避免過度設計
  4. 持續學習:關注不同語言和框架中的設計模式,理解其背后的共性思想

通過理解和應用這些模式,我們可以編寫出更加優雅、可維護的代碼,同時也能更好地理解不同技術棧之間的內在聯系,提升自己的技術視野。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Go】1、Go語言基礎

前言 本系列文章參考自稀土掘金上的 【字節內部課】公開課&#xff0c;做自我學習總結整理。 Go語言的特點 Go語言由Google團隊設計&#xff0c;以簡潔、高效、并發友好為核心目標。 具有以下優點&#xff1a; 語法簡單、學習曲線平緩&#xff1a;語法關鍵字很少&#xff0c;且…

AI時代的新營銷范式:生成式引擎優化(GEO)的崛起——品牌如何被大模型收錄

在數字化浪潮席卷全球的今天&#xff0c;我們正站在一個前所未有的歷史拐點。如果說過去二十年&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;重塑了企業與消費者的連接方式&#xff0c;那么未來二十年&#xff0c;生成式引擎優化&#xff08;GEO&#xff09;將徹底顛覆…

實用藍牙耳機哪款好?先做好使用場景分析!

市面上的藍牙耳機款式繁多&#xff0c;618到來之際&#xff0c;消費者如何選擇適合自己的藍牙耳機&#xff1f;實用藍牙耳機哪款好&#xff1f;關鍵在于做好使用場景分析&#xff01;今天&#xff0c;就帶大家結合不同的使用場景&#xff0c;分享三款倍思音頻的精品藍牙耳機。 …

PTA刷題筆記3(微難,有詳解)

7-15 計算圓周率 代碼如下&#xff1a; #include <stdio.h>int main() {double threshold;scanf("%lf", &threshold);double pi_over_2 1.0; // π/2的初始值&#xff08;第一項1&#xff09;double term 1.0; // 當前項的值int n 1; …

基于SpringBoot+Vue的社區醫院信息平臺設計與實現

項目背景與概述 隨著醫療健康信息化的發展&#xff0c;社區醫院的管理逐漸由傳統的手工模式轉向信息化管理。為了提高醫院的管理效率、減少人工操作、提升服務質量&#xff0c;開發一個高效且實用的社區醫院信息平臺顯得尤為重要。本系統基于Spring Boot框架與MySQL數據庫設計…

舊物回收小程序:讓閑置煥發光彩,為生活增添價值

你是否常常為家中堆積如山的閑置物品而煩惱&#xff1f;那些曾經心愛的物品&#xff0c;如今卻成了占據空間的“雞肋”&#xff0c;丟棄可惜&#xff0c;留著又無處安放。別擔心&#xff0c;一款舊物二手回收小程序將為你解決這一難題&#xff0c;讓閑置物品重新煥發光彩&#…

掩碼與網關是什么?

1. 子網掩碼&#xff08;Subnet Mask&#xff09; 作用&#xff1a;劃分“小區”范圍 想象你住在一個小區&#xff08;子網&#xff09;里&#xff1a; 小區門牌號 IP地址&#xff08;如 192.168.1.10&#xff09; 小區邊界 子網掩碼&#xff08;如 255.255.255.0&#xf…

【Bluedroid】藍牙HID Host disconnect流程源碼解析

本文基于 Android 藍牙 HID&#xff08;Human Interface Device&#xff09;Host 模塊的源碼&#xff0c;深入解析 HID 設備斷開連接的完整流程。重點覆蓋從應用層觸發斷開請求&#xff0c;到 BTIF 層&#xff08;接口適配層&#xff09;狀態校驗與異步傳遞、BTA 層&#xff08…

python定時刪除指定索引

腳本 import logging from datetime import datetime, timedelta from elasticsearch import Elasticsearch# 配置日志記錄 logging.basicConfig(filenamedelete_uat_indices.log,levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s )# Elasticsearch 集群的…

GESP編程等級認證C++三級7-字符、字符數組與字符串2

2.3 用字符串定義字符數組的好處 使用字符串定義字符數組需要額外考慮其末尾的“\0”&#xff0c;為什么還要使用這種看上去“麻煩”的方法呢&#xff1f;從圖5所示的代碼就能看出原因。 圖5 用字符串定義字符數組好處的代碼 從圖5中可以看出&#xff0c;a4是用字符串進行初始…

EasyRTC音視頻實時通話WebP2P技術賦能的全場景實時通信解決方案

一、技術背景 在數字化浪潮席卷全球的當下&#xff0c;實時通信技術憑借其即時性、高效性的優勢&#xff0c;已然成為推動各行業創新發展的核心動能。EasyRTC深度融合WebP2P技術&#xff0c;構建起去中心化的通信架構&#xff0c;實現了低延遲、高可靠的數據傳輸&#xff0c;為…

Claude MCP協議從入門到精通

目錄 一、什么是MCP協議? 二、Function Calling 和 MCP 協議的區別? 三、MCP相關網站 3.1 官方文檔 3.2 綜合型 MCP 資源聚合平臺 3.3 垂直領域 MCP Server 工具 3.4 開發者工具與社區 3.5 企業級服務與數據庫集成 3.6 新手友好型平臺 四、MCP 架構 4.1. MCP Hosts…

YOLOv11改進 | Conv/卷積篇 | 2024 ECCV最新大感受野的小波卷積WTConv助力YOLOv11有效漲點

YOLOv11改進 | Conv/卷積篇 | 2024 ECCV最新大感受野的小波卷積WTConv助力YOLOv11有效漲點 引言 在計算機視覺領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;的核心操作——卷積運算正經歷著革命性的變革。2024年ECCV會議提出的**小波卷積&#xff08;WTConv, Wav…

英偉達CEO黃仁勛COMPUTEX 2025演講實錄:AI工廠時代已來,Blackwell架構全面投產

5月19日&#xff0c;英偉達創始人兼首席執行官黃仁勛在臺北國際電腦展&#xff08;COMPUTEX 2025&#xff09;發表主題演講&#xff0c;系統闡述了英偉達從芯片設計向AI基礎設施服務商的戰略轉型&#xff0c;并披露了包括Blackwell架構升級、新一代AI計算平臺及機器人技術在內的…

RabbitMQ的核心原理及應用

在分布式系統架構中&#xff0c;消息中間件是實現服務解耦、流量緩沖的關鍵組件。RabbitMQ 作為基于 AMQP 協議的開源消息代理&#xff0c;憑借高可靠性、靈活路由和跨平臺特性&#xff0c;被廣泛應用于企業級開發和微服務架構中。本文將系統梳理 RabbitMQ 的核心知識&#xff…

服務攻防矩陣

4.1 中間件漏洞利用 WebLogic反序列化漏洞&#xff08;CVE-2023-21839&#xff09; 漏洞原理&#xff1a; T3協議反序列化未嚴格校驗&#xff0c;攻擊者可注入惡意序列化對象執行任意代碼。 攻擊流程&#xff1a; 使用ysoserial生成CommonsCollections6 payload&#xff1…

PictureThis 解鎖高級會員版_v5.3.0 拍植物知名稱和植物百科

PictureThis 解鎖高級會員版_v5.3.0 拍植物知名稱和植物百科 PictureThis是一款創新的植物識別與園藝指導應用程序&#xff0c;旨在幫助用戶快速識別植物種類、了解植物信息&#xff0c;并提供專業的園藝養護建議…

大模型 Agent 就是文字藝術嗎?

最近在技術圈里有一個很有趣的爭論&#xff1a;大模型 Agent 是不是就是各種 Prompt 的堆疊&#xff1f;像 Manus 這樣看起來很智能的 Agent&#xff0c;本質上是不是就是用巧妙的 Prompt 約束大模型生成更好的輸出&#xff1f;換句話說&#xff0c;這是不是一門文字藝術&#…

LeetCode 1340. 跳躍游戲 V(困難)

題目描述 給你一個整數數組 arr 和一個整數 d 。每一步你可以從下標 i 跳到&#xff1a; i x &#xff0c;其中 i x < arr.length 且 0 < x < d 。i - x &#xff0c;其中 i - x > 0 且 0 < x < d 。 除此以外&#xff0c;你從下標 i 跳到下標 j 需要滿…

三相電壓的優勢,應用場景,功率測量

三相系統概述 我國三相系統&#xff0c;由頻率相同&#xff0c;幅度類似的三個交流電壓組成&#xff0c;每個電壓相差120度。 三相系統的優勢 啟動電機&#xff1a;三個矢量間隔的電壓&#xff0c;在電機中產生旋轉磁場&#xff0c;不需要額外繞組就可以啟動電機。 減少線損…