c - Bob Martin:“C 具有完美的封装性”如何?
问题描述
Bob Martin 在此视频中说“C 具有完美的封装性”。我不明白他为什么这么说......我知道我们可以在 .c 文件中分离实现并在头 .h 文件中声明接口,但没有什么能真正阻止我访问这样的实现细节:
主程序
#include <stdio.h>
#include "file1.h"
extern int x;
int main() {
printf("%d\n", x);
return 0;
}
文件1.c
int x = 5;
int getnum_file1() {
return x + 1;
}
文件1.h
int getnum_file1();
在这种情况下,main.c 可以访问 file1.c 中的实现细节。此代码还可以按照预期结果进行编译和执行。这是如何完美的封装?
解决方案
一种确保封装的方法是声明x
为static int x = 5;
,因此它不会从外部对象可见(即使使用extern
)。
x
显然,可以从另一个对象(通过链接器,通过extern
您添加的)访问一个全局变量。但是,这通常会导致“意大利面条”代码,其中变量可以从任何地方访问和/或修改,因为没有适当的封装(C 或 C++ 确实提供了避免这种情况的有用方法)。
推荐阅读
- angularjs - 我如何以角度动态化我的 Flash 消息。消息必须来自 API 响应
- python - 根据公共键对熊猫数据框进行分组
- laravel - 将策略与 apiResource 路由一起使用
- php - 目前使用 CodeIgniter 框架我有一个错误
- ios - 核心数据缺少模型版本?
- swagger - 在 swagger UI 上获取错误按钮,即 schemaValidationMessages
- android - 从版本 11.0.4 升级到 15.0.1 后,Firebase 数据库停止在 Android Oreo 上运行。有没有办法重置 Firebase“缓存”?
- html - 从 XML 生成 XSLT
- javascript - 如何创建具有不确定状态的自定义复选框
- php - 基于 url 字符串在 iframe 中加载页面