【问题标题】:Bob Martin: "C has perfect encapsulation" HOW?Bob Martin:“C 具有完美的封装性”如何?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2013-01-06
    相关资源
    最近更新 更多