问题标签 [encapsulation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
23504 浏览

c++ - 声明类和方法但不声明成员的 C++ 头文件?

是否可以创建一个 C++ 头文件 (.h) 来声明一个类及其公共方法,但不定义该类中的私有成员?我发现有几页说您应该在头文件中声明该类及其所有成员,然后在您的 cpp 文件中单独定义方法。我问是因为我想要一个在 Win32 DLL 中定义的类,并且我希望它被正确封装:该类的内部实现可能会更改,包括其成员,但这些更改不应影响使用该类的代码.

我想如果我有这个,那么编译器就不可能提前知道我的对象的大小。但这应该没问题,只要编译器足够聪明,可以使用构造函数,并且只传递指向内存中存储对象的位置的指针,并且永远不要让我运行“sizeof(MyClass)”。

更新: 感谢所有回答的人!似乎 pimpl 成语是实现我所说的一个好方法。我要做类似的事情:

我的 Win32 DLL 文件将有一堆单独的函数,如下所示:

这是微软编写 DLL 文件的典型方式,所以我认为这可能是有充分理由的。

但我想利用 C++ 对类的良好语法,所以我将编写一个包装类来包装所有这些函数。它将有一个成员,即“void * pimpl”。这个包装类将非常简单,我不妨声明它并在头文件中定义它。但据我所知,这个包装类除了让 C++ 代码看起来很漂亮之外真的没有其他目的。

0 投票
7 回答
2494 浏览

java - 对象是否封装了数据,即使是同一类的其他实例也不能访问数据?

在 Java 中,

对象是否封装了数据,即使是同一类的其他实例也不能访问数据?仅在使用关键字“private”时?Java 中的“访问器方法”是什么 - 像 getName() 这样的方法?

谢谢

0 投票
7 回答
1471 浏览

java - 为什么java安全编码很重要?

我无法理解为什么 java 安全编码很重要。例如,为什么将变量声明为私有很重要?我的意思是我知道这将使从类外部访问这些变量变得不可能,但我可以简单地反编译类来获取值。类似地,将一个类定义为 final 将使该类无法子类化。什么时候子类化一个类会对安全造成危险?如果有必要,我可以再次反编译原始类并使用我想要的任何恶意代码重新实现它。当应用程序被用户“信任”时,问题是否会出现?然后人们会以某种方式滥用这种信任吗?基本上我正在寻找的是一个很好的例子,说明为什么应该遵循安全编码准则。

0 投票
16 回答
719542 浏览

c++ - 私有继承、公有继承和受保护继承之间的区别

C++public中的、privateprotected继承 有什么区别?

我在 SO 上发现的所有问题都涉及特定案例。

0 投票
5 回答
1337 浏览

model-view-controller - 俄罗斯方块和漂亮的图形

假设您正在构建俄罗斯方块游戏。作为任何合适的程序员,您的视图逻辑在一侧,业务逻辑在另一侧;可能是一个完整的 MVC 正在进行。

当模型发送它的update()时,视图会按预期重绘自己。

但是……如果你想添加一个动画来消失一条线,你将如何在视图中实现它?

做出你想要的任何假设——除了“一切都被正确封装”。

0 投票
6 回答
251 浏览

coding-style - 返回具体或抽象数据类型?

我正在阅读 Code Complete,在本书的最后,在关于重构的章节中,作者列出了一些你应该做的事情,以在重构时提高代码的质量。

他的观点之一是始终尽可能返回特定类型的数据,尤其是在返回集合、迭代器等时。所以,正如我所理解的那样,如果你使用那种数据类型,而不是返回,比如说Collection<String>,你应该返回HashSet<String>方法里面。

这让我很困惑,因为这听起来像是他在鼓励人们打破信息隐藏的规则。现在,我在谈论访问器时理解了这一点,这是一个明确的案例。但是,在计算和修改数据时,方法的抽象级别意味着没有直接的数据结构,我发现最好尽可能返回抽象的数据类型,只要数据不分崩离析(我不会例如,返回Object而不是Iterable<String>)。

所以,我的问题是: Code Complete 的建议背后是否有更深层次的哲学,即始终返回尽可能具体的数据类型,并允许向下转换,而不是保持我刚刚不理解的需要知道的基础?

0 投票
4 回答
962 浏览

database - 如何封装数据库访问?

我正在.NET 中开发一个事务应用程序,并希望获得一些关于如何正确封装数据库访问的意见,以便:

  • 我没有到处都有连接字符串
  • 从不同的函数多次调用同一个存储过程
  • 或更糟糕的是,单个列不同的多个存储过程

我很想知道使用像 NHibernate 这样的 ORM 是否有用,因为它可能只会为快速变化的数据模型增加另一层复杂性,并且需要在紧凑的时间内生成工件。

我对 ORM 包以外的方法或模式更感兴趣。

0 投票
6 回答
6176 浏览

java - 是否值得将日志框架包装在附加层中?

我目前正在考虑升级中型到大型 Java 代码库中的日志记录机制。当前使用Debug类上的静态方法记录消息,我建议将其切换到 SLF4J 或 commons-logging 之类的东西。

应用程序架构师更喜欢我封装对 SLF4J 的依赖(可能通过将其包装在上述Debug类中)。这将使将来更容易更改日志记录实现。

这对我来说似乎有点矫枉过正,因为 SLF4J 已经抽象了具体的日志记录实现。

是否值得将 SLF4J 之类的第 3 方日志抽象封装在另一个本土抽象中?

0 投票
14 回答
83567 浏览

php - php中简单示例的封装是什么?

php中简单示例的封装是什么?

0 投票
21 回答
11687 浏览

oop - 依赖注入必须以封装为代价吗?

如果我理解正确,依赖注入的典型机制是通过类的构造函数或通过类的公共属性(成员)注入。

这暴露了被注入的依赖,违反了 OOP 的封装原则。

我确定这种权衡是否正确?你如何处理这个问题?

另请参阅下面我对我自己的问题的回答。