鲍勃·马丁:"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++ 确实提供了避免这种情况的有用方法)。
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++ 确实提供了避免这种情况的有用方法)。