鲍勃·马丁:“C有完美的封装”怎么说?

鲍勃·马丁:“C有完美的封装”怎么说?,c,oop,encapsulation,software-design,C,Oop,Encapsulation,Software Design,Bob Martin在这篇文章中说C具有完美的封装。我不明白他为什么这么说。。。我知道我们可以在.c文件中分离实现,并在header.h文件中声明接口,但没有什么真正阻止我访问以下实现细节: main.c #include <stdio.h> #include "file1.h" extern int x; int main() { printf("%d\n", x); return 0; } 文件1.h int getnum_file1(); 在本例中,main

Bob Martin在这篇文章中说C具有完美的封装。我不明白他为什么这么说。。。我知道我们可以在.c文件中分离实现,并在header.h文件中声明接口,但没有什么真正阻止我访问以下实现细节:

main.c

#include <stdio.h>
#include "file1.h"
extern int x;
int main() {
    printf("%d\n", x);
    return 0;
}
文件1.h

int getnum_file1();

在本例中,main.c可以访问file1.c中的实现细节。此代码还编译并执行预期结果。这种完美的封装是如何确保封装将x声明为静态int x=5;

的;,因此,即使使用extern,也无法从外部对象看到它


显然,全局变量x可以通过链接器从另一个对象访问,通过您添加的外部变量。然而,这通常会导致一个意大利面代码,其中变量从任何地方被访问和/或修改,因为没有适当的封装,C或C++提供了避免这种错误的有用方式。

< P>一种确保封装的方法是声明X为静态int x=5;因此,即使使用extern,也无法从外部对象看到它


显然,全局变量x可以通过链接器从另一个对象访问,通过您添加的外部变量。但是,这通常会导致一个意大利面代码,因为没有合适的封装,在哪里访问和/或修改变量,C或C++提供了避免这种错误的有用方法。

仅仅因为语言具有封装功能,并不意味着程序员不能封装。因为FIL1通过定义潜在的全局变量C来破坏封装。并且C++可以被滥用,它真正地被开发者用来进行良好的实践。在这两种语言中都可以做一些非常糟糕的事情,甚至Java也可以让你做一些非常糟糕的事情,例如定义一个全局可访问的静态公共成员变量是完全可能的。在您的示例中,删除extern int x,将file1.c中的x更改为静态。。那么,最佳做法是将“static”关键字附加到任何希望作为实现细节隐藏的变量上吗?@N.Parikh,静态只是将变量限制在声明的范围内。仅仅因为语言具有封装功能并不意味着程序员不能封装。因为FIL1通过定义潜在的全局变量来破坏封装;C和C++可以被使用和滥用,这实际上是开发人员采用良好的实践。在这两种语言中都可以做一些非常糟糕的事情,甚至Java也可以让你做一些非常糟糕的事情,例如定义一个全局可访问的静态公共成员变量是完全可能的。在您的示例中,删除extern int x,将file1.c中的x更改为静态。。因此,将“static”关键字附加到任何要作为实现细节隐藏的变量上是最佳做法吗?@N.Parikh,static只是将变量限制在其声明的范围内。
int getnum_file1();