【发布时间】:2018-11-22 08:45:32
【问题描述】:
Bob Martin 在video 中说“C 具有完美的封装性”。我不明白他为什么这么说......我知道我们可以在 .c 文件中分离实现并在头 .h 文件中声明接口,但没有什么能真正阻止我访问这样的实现细节:
main.c
#include <stdio.h>
#include "file1.h"
extern int x;
int main() {
printf("%d\n", x);
return 0;
}
file1.c
int x = 5;
int getnum_file1() {
return x + 1;
}
file1.h
int getnum_file1();
在这种情况下,main.c 可以访问 file1.c 中的实现细节。此代码还可以按照预期结果进行编译和执行。这个完美的封装怎么样??
【问题讨论】:
-
语言具有封装功能并不意味着程序员不能失败进行封装。
-
因为 file1 通过定义一个(潜在的)全局变量来破坏封装?
-
c 和 c++ 可以使用和滥用,这完全取决于开发人员采用良好的做法。你可以用两种语言做一些非常糟糕的事情,甚至 Java 也可以让你做一些非常糟糕的事情,例如它完全可以定义一个全局可访问的静态公共成员变量。在您的示例中,删除 extern int x,将 file1.c 中的 x 更改为静态。
-
啊,我明白了.. 将“静态”关键字附加到您希望作为实现细节隐藏的任何变量的最佳做法是什么?
-
@N.Parikh,静态只是将变量限制在它声明的范围内。
标签: c oop encapsulation software-design