鲍勃·马丁:"C has perfect encapsulation" 如何?

Bob Martin: "C has perfect encapsulation" HOW?

Bob Martin 在这个 video 中说 "C has perfect encapsulation"。我不明白他为什么这么说......我明白我们可以在 .c 文件中分离实现并在 header .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 中的实现细节。此代码还编译并执行了预期的结果。这么完美的封装怎么样??

一种确保封装的方法是将 x 声明为 static int x = 5;,因此它不会从外部对象可见(即使使用 extern)。

显然,像 x 这样的全局变量可以从另一个对象访问(通过链接器,通过您添加的 extern)。然而,这通常会导致 "spaghetti" 代码,其中变量被访问 and/or 从任何地方修改,因为没有适当的封装(C 或 C++ 确实提供了避免这种情况的有用方法)。