C++变成规范之41:将数据成员设为私有的,无行为的聚类(C语言形式的struct除外)

简介:

摘要:

    它们不关调用者的事:将数据成员设为私有的。简单的C语言形式的struct类型只是将一组值聚集在了一起,并不封装或者提供行为,只有在这种struct类型中才可以将所有数据成员都设成公用的。要避免将公用数据和非公用数据混合在一起,因为这几乎总是设计混乱的标志。

    信息隐藏是优秀软件工程的关键。应该将所有数据成员都设为私有的,不管是现在,还是可以能发生变化的将来,私有数据都是类用来保持其不变式的最佳方式。

    如果类要建模一个抽象,并因而必须维持一个不变式,那么使用公用数据就不好了。拥有公用数据意味着类的部分状态的变化可能是无法控制的、无法预测的、与其他状态异步发生的。这意味着抽象将与使用抽象的所有代码组成无限集合共同承担维持一个或者更多不变式的职责,这是一种显而易见的、根本性的、不可原谅的缺陷。应该断然拒绝这种设计。

    保护数据具有公用数据的所有缺点,因为拥有保护数据仍然意味着抽象将与代码的无限集合共同承担着一个或者更多不变式的职责,只不过这里的集合是由当前的派生类和未来的派生类组成的。而且,通过派生一个新类,并用它来获取数据,任何代码都能够像公用数据那样容易地读取和修改保护数据。

    在同一个类中混合使用公用和非公用数据成员既容易含混不清,又存在前后矛盾。私有数据表明具有不变式而且希望保持这种不变性,而将其与公用数据混合则意味着无法明确地判断这个类到底要不要成为抽象。

非私有数据成员甚至还不如简单的通道性的get/set函数,后者起码还能进行健壮的版本处理。

相关文章
|
24天前
|
存储 Serverless 数据安全/隐私保护
C++ 类的成员函数和数据成员的技术性探讨
C++ 类的成员函数和数据成员的技术性探讨
26 0
|
12天前
|
数据采集 存储 编译器
this指针如何使C++成员指针可调用
本文介绍了C++中的this指针,它是一个隐藏的指针,用于在成员函数中访问对象实例的成员。文章通过代码示例阐述了this指针的工作原理,以及如何使用指向成员变量和成员函数的指针。此外,还提供了一个多线程爬虫示例,展示this指针如何使成员指针在对象实例上调用,同时利用代理IP和多线程提升爬取效率。
this指针如何使C++成员指针可调用
|
2天前
|
存储 Linux C语言
c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写
本文介绍了C++中使用C语言的pthread库实现多线程编程。`pthread_create`用于创建新线程,`pthread_self`返回当前线程ID。示例展示了如何创建线程并打印线程ID,强调了线程同步的重要性,如使用`sleep`防止主线程提前结束导致子线程未执行完。`pthread_exit`用于线程退出,`pthread_join`用来等待并回收子线程,`pthread_detach`则分离线程。文中还提到了线程取消功能,通过`pthread_cancel`实现。这些基本操作是理解和使用C/C++多线程的关键。
|
4天前
|
安全 数据安全/隐私保护 C++
C++一分钟之-成员访问控制:public, private, protected
【6月更文挑战第20天】C++的成员访问控制涉及`public`、`private`和`protected`,影响类成员的可见性和可访问性。`public`成员对外公开,用于接口;`private`成员仅限类内部,保护数据安全;`protected`成员在派生类中可访问。常见问题包括不恰当的访问级别选择、继承中的访问权限误解及过度使用友元。通过示例展示了如何在派生类中访问`protected`成员。正确使用访问修饰符能确保代码的封装性、安全性和可维护性。
32 4
|
7天前
|
数据安全/隐私保护 C++
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
C++ 中的类是一种用户定义的数据类型,用于表示具有相似特征和行为的对象的模板。
|
11天前
|
编译器 C++ 存储
【C++语言】类和对象--默认成员函数 (中)
【C++语言】类和对象--默认成员函数 (中)
【C++语言】类和对象--默认成员函数 (中)
|
11天前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
26天前
|
存储 算法 C语言
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
从C语言到C++_39(C++笔试面试题)next_permutation刷力扣
16 5
|
11天前
|
C语言 C++
【C++语言】冲突-C语言:命名空间
【C++语言】冲突-C语言:命名空间
|
18天前
|
程序员 C语言 C++
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
29 0