问题标签 [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 投票
4 回答
763 浏览

ioc-container - 我应该封装我的 IoC 容器吗?

我正在尝试确定是否需要付出额外的努力来封装我的 IoC 容器。经验告诉我,我应该在我的应用程序和任何第三方组件之间放置一层封装。我只是不知道这是否接近矫枉过正。

我可以想到我可能想要切换容器的情况。例如,我当前的容器停止维护,或者另一个容器被证明更轻/性能更佳,更适合我的需求。如果发生这种情况,那么我可能需要进行很多重新布线。

需要明确的是,我正在考虑对类型的注册解析进行封装。我认为封装分辨率是不费吹灰之力的——我希望将一个助手/实用程序类委托给容器是一种常见的做法。

编辑:

假设是我更喜欢以编程方式连接我的类型以实现类型安全、编译时检查和可重构性。我希望保护自己免受此代码及其对容器的依赖。

我也一直在为其他几个共享许多相同关系的项目使用 IoC 容器,但是使用该容器很痛苦,所以我想要改变。但是,更改意味着我失去了注册码的可重用性。因此,为什么我正在考虑封装。这不是一个巨大的负担,但我还是想减轻负担。

我正在寻找:

  • 最小化容器/容器版本变化的影响
  • 在可能使用不同容器的项目之间提供某种程度的类型注册一致性
  • 提供对我有意义的接口方法(RegisterSingleton<T,T> 而不是 RegisterType<T,T>( SomeLifetimeProvider ) - 以 Unity 为例)。
  • 随着条件/可扩展性要求的变化增强容器,例如在解析/注册期间添加更好的缓存、日志记录等。
  • 提供我自己的模型来注册类型映射。
    • 假设我想在一个程序集/包中创建一堆 RegistrationHandler 对象,因此我可以轻松地将注册职责分离到多个类并自动拾取这些处理程序,而无需在其他任何地方更改代码。

我意识到这有点主观,所以优点/缺点可能会有所帮助

谢谢!

0 投票
6 回答
373 浏览

c++ - 如何正确封装 std::set?

我有一个名为 Particle 的类,它有一个 std::set 作为成员。该类如下所示:

我对 非常不满意getFirstCell()getNextCell()尤其是hasNextCell()它们的存在是因为我不想暴露集合本身。我不得不使用这种方式++ipc--ipc因为if((ipc+1) == this->cells.end())给出了编译器错误,ipc+1 似乎是问题所在。

封装一个集合并访问它的好方法是什么?另外,有没有摆脱这个getFirstCell()功能的好方法?

提前致谢。

编辑:我发布的代码只是类结构的一个例子。“真实”类包含更多的集合和其他对这个问题不那么重要的数据(我假设)。

0 投票
1 回答
73 浏览

.net - 在 .Net MDI 中封装其他应用程序

是否可以将其他 Windows 应用程序封装在 .Net MDI 表单中?源代码不适用于这些应用程序...我们使用的一组程序可以很好地打包到一个应用程序中...

一个简单的例子可能是拥有一个带有计算器按钮的 .net mdi 表单应用程序。单击它时,它将以 mdi 形式打开 windows calc.exe。

0 投票
2 回答
116 浏览

perl - 将内容封装在变量中

我想知道如何substr($text, 12)将变量的结果()封装$opt到自身中(将结果替换表达式substr($text, 12)),但是我该怎么做呢?

如果需要的话。这是我的代码:

0 投票
5 回答
7287 浏览

vba - 为什么 VBA Me 关键字不能访问自己模块中的私有过程?

我刚刚发现 Me 关键字无法访问私有过程,即使它们位于其自己的类模型中。

在 Class1 中取以下代码:

此代码实例化该类的一个实例:

Me.Message抛出编译错误“找不到方法或数据成员”。

如果我改变Private Sub Message()程序Public工作正常。我也可以从 DoSomething 过程中删除 Me 关键字,但我的印象是 Me 关键字背后的想法是确保 Class1 的多个实例被正确封装。

为什么VBA Me关键字不能访问自己模块中的私有程序?省略 Me 关键字并在课堂上做这样的事情是否安全?

谢谢!

更新:感谢有关正确语法的提示,我的代码正在运行。我仍在寻找解释为什么我可以在它自己的模块的实例中引用私有过程。我找不到任何好的文档。

0 投票
3 回答
897 浏览

ruby-on-rails - 如何从外部访问 Ruby on Rails 应用程序的数据?

我正在尝试从一个单独的 Ruby 脚本中处理我的 Rails 应用程序中的数据。

我阅读了这个论坛帖子,其中有人建议处理数据的最佳方式是将数据库封装在一个应用程序中,然后让该应用程序提供一个 API 来处理该数据。因为将数据库集成到几个不同的应用程序中显然很糟糕。

好吧,现在我想处理来自另一个脚本的 Rails 应用程序中的一些数据,但在同一个系统上。我怎样才能做到这一点?

将来我可能希望远程处理来自我的 Rails 应用程序的数据,但也来自脚本。我假设这可能需要 JSON 或 SOAP,但在我去研究它之前我想知道。

0 投票
6 回答
3204 浏览

.net - 尽管我了解大多数 OOP 概念,但我无法清晰地描绘实现 OOP 概念。为什么?

我一直在做我自己的一些项目,没有任何工业接触。目前,我使用简单的方法来开发具有可忽略的 OO 方法的小型应用程序,例如使用函数的多态性为数据库函数创建一个通用类,稍微使用构造函数,但我真的不知道如何使用 OOP 实现整个项目逻辑。

我知道什么是接口、抽象类、密封类和其他 oops 概念,并且非常清楚。但问题是我应该何时以及如何在我应该的地方大量实施 OOP。

我是否需要研究实时应用程序及其案例研究,如果需要,请向我推荐一些网站或书籍/电子书,我可以从中阅读并能够实施它们。

目前我在编程时觉得自己不完整。我有效地实现了数据库及其大部分组件,但是在尝试使用 OOP 时还是个孩子。

我已经阅读了许多示例,这些示例试图让人们理解 OOP 之类的形状,例如汽车。所有这些。他们很想清楚概念,但不足以在一些现场项目中实施

0 投票
3 回答
551 浏览

c - 单元测试基于不透明结构的 C API

我有一个基于不透明结构的 API 编写的库。使用不透明结构有很多好处,我对此非常满意。

现在我的 API 在规范方面已经稳定了,我想写一个完整的单元测试电池,以确保在发布之前有一个坚实的基础。

我的担心很简单,你如何基于主要目标是隐藏内部逻辑的不透明结构对 API 进行单元测试?

例如,让我们以一个非常简单的对象,一个带有非常简单测试的数组为例:

当然,这会测试一些事实,比如数组实际上是用 1 个值执行的,但是当我编写单元测试时,至少在 C 中,我通常会将我的数据结构的内存占用与已知状态进行比较。

在我的示例中,我不知道数组的某些内部状态是否损坏。

你会怎么处理?我真的很想避免在实现文件中添加仅用于单元测试的代码,我非常强调模块的松散耦合,并且将单元测试注入实现对我来说似乎相当有侵略性。

我的第一个想法是将实现文件包含到我的单元测试中,将我的单元测试静态链接到我的库。

例如:

这是一个好主意吗?

当然,单元测试不会从封装中受益,但它们在这里是为了确保它实际工作。

0 投票
9 回答
72551 浏览

java - Java:子包可见性?

我的项目中有两个包:odp.projodp.proj.test. 我希望某些方法只对这两个包中的类可见。我怎样才能做到这一点?

编辑:如果Java中没有子包的概念,有什么办法吗?我有某些方法,我希望只对测试人员和该包的其他成员可用。我应该把所有东西都扔到同一个包裹里吗?使用广泛的反射?

0 投票
7 回答
570 浏览

ruby - 对象私有与类私有

在任何 OOP 语言中都有对象私有的概念吗?我的意思是比经典的私人访问更严格?

私有(或类私有)限制对类本身的访问。只有属于同一类的方法才能访问私有成员。

object-private :限制对对象本身的访问。只有可以访问成员的方法对象,并且无法编写:

编辑 :

如果存在,你能给我一些例子吗?如果没有,你认为拥有这种功能很有趣吗?是否可以用其他 OOP 语言模拟它?

编辑2: 谢谢你们,所有的答案都非常有启发性......

到现在,暂时的结论

实例私有概念存在于 2 种语言中:

1 - 经过数小时的谷歌搜索后的 Smalltalk :) 我找到了这个概念背后的语言!

对象持有的状态始终是该对象私有的。其他对象只能通过向对象发送请求(消息)来查询或更改该状态。

2 - Ruby感谢洛根

有人总结了这些区别,他说在 C++ 中,“private”的意思是“这个类的私有”,而在 Ruby 中,它的意思是“这个实例的私有”。这意味着,在 C++ 中的 A 类代码中,您可以访问任何其他 A 类型对象的私有方法。在 Ruby 中,您不能:您只能访问您的对象实例的私有方法,而不能访问任何其他对象的私有方法对象实例(A 类)。