在“;封装”;,短语“;保护对象免受客户端不必要的访问”;

在“;封装”;,短语“;保护对象免受客户端不必要的访问”;,c,encapsulation,C,Encapsulation,在“C编程:一种现代方法”的第19章中,介绍了封装的概念(尽管在C编程语言中是“微薄的”) 作为实现封装的动机,作者提到保护对象不被客户端访问的重要性。参考了有关避免结构中数据字段“损坏”的注释 也许是因为我在软件开发方面还是一个新手(我只写过一些小程序…有几个.h和.c文件),我并不真正理解“保护对象”的必要性 归根结底,程序员(使用显式代码)不决定是否直接访问对象吗?编译器不会“意外”访问结构并修改成员,对吗 根据我的理解,“腐蚀性访问”只有在有一段明确的代码表示“访问该结构并更改数据”时才

在“C编程:一种现代方法”的第19章中,介绍了封装的概念(尽管在C编程语言中是“微薄的”)

作为实现封装的动机,作者提到保护对象不被客户端访问的重要性。参考了有关避免结构中数据字段“损坏”的注释

也许是因为我在软件开发方面还是一个新手(我只写过一些小程序…有几个.h和.c文件),我并不真正理解“保护对象”的必要性

归根结底,程序员(使用显式代码)不决定是否直接访问对象吗?编译器不会“意外”访问结构并修改成员,对吗

根据我的理解,“腐蚀性访问”只有在有一段明确的代码表示“访问该结构并更改数据”时才会发生……而且可能负责启动该操作的代码段是用户生成的

因此,封装的唯一目的是保护“程序目的”不受在实际编程过程中发生的用户错误的影响吗

谢谢

根据我的理解,“腐蚀性访问”只有在有一段明确的代码表示“访问该结构并更改数据”时才会发生……而且可能负责启动该操作的代码段是用户生成的

是的,这正是问题所在。如果用户可以访问内部结构/对象/任何东西,那么他们访问的可能性非零。如果您知道某些内部对象对最终用户没有用处,为什么不阻止他们访问它呢?这样,您就可以保证您的库按预期工作,因为它的内部结构或对象仅由您自己编写的代码修改

也许是因为我在软件开发方面还是一个新手(我只写过一些小程序…有几个.h和.c文件),我并不真正理解“保护对象”的必要性

归根结底,程序员(使用显式代码)不决定是否直接访问对象吗?编译器不会“意外”访问结构并修改成员,对吗


如果没有限制对内部对象的访问,那么最终用户就有责任保持内部对象的正确性。对于大型库,这可能很难管理。同样,限制对用户不需要访问的内容的访问是免除他们责任和防止错误的一种方法。

应通过定义良好的公共API访问组件,内部状态受保护,不允许直接访问客户端代码。示例:组件可能具有x/y坐标。不允许客户端代码直接访问来更改coords,只允许定义良好的API来moveLeft、moveRight等。有了这些API,组件可以阻止coords从预定义的网格中移动,而直接客户端访问可能会使组件的coords值无效。@kaylum我感谢您的响应,但你使用的是一个我根本不熟悉的词汇。我的编程经验仅限于本书的19章。简单来说,封装是指代码块应该“拥有”自己的数据。如果区块A“拥有”它的数据,它控制其他区块可以对该数据做什么——可能是读取数据,也可能是更改数据;或者什么都没有。我们需要这样做,才能使大型程序中的数据管理问题变得合理易处理。我之所以使用“chunk”这个词,是因为用于强制封装的功能在不同的语言中有所不同。你说“这不像编译器会“意外地”访问一个结构……”但我们需要担心的不是编译器——而是人,他们的记忆和智力有限。由于缺乏封装而导致的问题随着程序的发展而迅速增加。@S.Cramer——我认为用“错误”这个术语来描述人类无法跨数千行代码管理数千个单独的数据项是不正确的。如果没有某种策略来管理这些数据的使用,编写任何复杂的程序都将是一个无法克服的智力挑战。例如,同时下棋十局是可能的(尽管对我来说不是)。但是有可能在一个有80x80个方格和几百个不同棋子的棋盘上下棋吗?编程就是这样——我们需要策略来管理复杂性。