发现的一种很简单的set/get封装办法

news/2024/11/14 12:43:26/

参考:

C++ 中简化set/get 函数封装的 方式_c++ get set-CSDN博客

定义一个模板类

你可以创建一个模板类Property,用于封装设置和获取功能:

template<typename T>
class Property {
private:T value;public:void set(const T& v) {value = v;}T get() const {return value;}
};
使用模板类

在你的原始类中,你可以用Property类替代所有的成员变量和它们的setter/getter方法:

class SoftwareUpdate {
public:Property<std::string> version;Property<std::string> updateUrl;Property<std::vector<std::string>> updateFiles;Property<std::string> updateDir;Property<std::string> updateScript;Property<std::string> updateScriptArgs;Property<std::string> updateScriptOutput;Property<std::string> updateScriptError;// 其他方法和成员...
};
如何使用

使用新的模板化属性是直接的:

SoftwareUpdate su;
su.version.set("1.0");
std::string ver = su.version.get();su.updateFiles.set({"file1.txt", "file2.txt"});
auto files = su.updateFiles.get();// 等等...
优势

这种方法的优势在于:

减少冗余代码:你不再需要为每个属性编写独立的setter和getter方法。
提高可维护性:任何对属性访问逻辑的修改都可以在Property模板类中一次性完成,而不需要修改多个地方。
类型安全:模板确保了类型安全,防止了某些类型错误。
这种方法适用于需要大量简单访问方法的类。如果你的属性访问逻辑更复杂(比如需要验证或其他逻辑处理),那么可能需要更定制的解决方案。

这种方法属于“封装属性(Property Capsule)”模式,有时也被称作“封装字段(Encapsulated Field)”模式。这种模式主要目的是将数据访问封装在单独的类或结构中,以便统一管理数据访问逻辑,减少代码重复,并提高数据操作的安全性和灵活性。

模式特点


封装性:通过封装字段和访问逻辑,增强了类的内聚性和封装性。
可维护性:当需要改变数据访问逻辑或添加额外的逻辑(如验证或通知)时,只需要修改封装类,而不需要修改每个使用点。
灵活性:可以轻松地对属性的读写操作进行扩展,比如添加日志记录、错误处理或者触发事件等。

与设计模式的关系


尽管“封装属性”模式不是传统设计模式中经常提到的模式之一,它却与几个经典设计模式有相似之处:

桥接模式(Bridge):通过将实现从抽象中分离出来,可以改变实现而不影响客户代码。
代理模式(Proxy):Property类在某种意义上充当原始数据的代理,提供额外的封装和控制。
策略模式(Strategy):可以将不同的访问策略封装为策略对象,通过Property类使用不同策略来控制数据访问。
这种模式非常适用于构建高度模块化和易于维护的系统,特别是在属性多、访问频繁且可能未来需要扩展的场景中。


http://www.ppmy.cn/news/1527919.html

相关文章

代码随想录算法训练营43期 | Day 21 —— 108.将有序数组转换为二叉搜索树、 538.把二叉搜索树转换为累加树

代码随想录算法训练营 代码随想录算法训练营43期 | Day108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树 代码随想录算法训练营43期 | Day 108.将有序数组转换为二叉搜索树 class Solution { private:TreeNode* traversal(vector<int>& nums, int left…

Java项目实战II基于Java+Spring Boot+MySQL的房屋租赁管理系统的设计与实现

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市租…

OpenAIAPI报错和ATL延迟优化

Open AI API报错&#xff1a; ————————————————加更———————————————————— 1.API Error: {“error”:{“message”:“无效的令牌”,“type”:“one_api_error”}}/报错403 调用接口不对&#xff0c;openkey的调用需要对应使用https://open…

C#和数据库高级:抽象类和抽象方法

文章目录 一、为什么使用抽象类和抽象方法&#xff1f;1.1、父类与子类的相互转换 二、抽象类和抽象方法2.1、抽象类的定义和方法声明规范2.2、使用继承多态的机制解决问题 三、抽象类的概念和使用特点总结 一、为什么使用抽象类和抽象方法&#xff1f; 1.1、父类与子类的相互…

二十种编程语言庆祝中秋节

二十种编程语言庆祝中秋节 文章目录 二十种编程语言庆祝中秋节中秋快乐&#xff01;家人们 &#x1f973;一 Python二 C三 C四 Java五 C#六 Perl七 Go八 Asp九 PHP十 JavaScript十一 JavaScript HTML十二 Visual Basic十三 早期 VB十四 Visual C十五 Delphi十六 Shell十七 Cobo…

在设计开发中,如何提高网站的用户体验?

在网站设计开发中&#xff0c;提高用户体验是至关重要的。良好的用户体验不仅能提升用户的满意度和忠诚度&#xff0c;还能增加转化率和用户留存率。以下是一些有效的方法和策略&#xff1a; 优化页面加载速度 减少HTTP请求&#xff1a;合并CSS和JavaScript文件以减少HTTP请求…

人工智能——猴子摘香蕉问题

一、实验目的 求解猴子摘香蕉问题&#xff0c;根据猴子不同的位置&#xff0c;求解猴子的移动范围&#xff0c;求解对应的过程&#xff0c;针对不同的目标状态进行求解。 二、实验内容 根据场景有猴子、箱子、香蕉&#xff0c;香蕉挂天花板上。定义多种谓词描述位置、状态等…

深度学习中常见的损失函数

在机器学习和深度学习中&#xff0c;损失函数用于衡量模型预测值与真实值之间的差异。根据任务的类型&#xff08;如回归、分类等&#xff09;&#xff0c;可以使用不同的损失函数。下面列举了一些常见的损失函数&#xff1a; 1. 回归问题中的损失函数 回归任务的目标是预测连…