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

language-agnostic - 你能解释一下关于封装的事情吗?

回应你最久的编程假设是什么,结果证明是不正确的?问题,错误的假设之一是:

私有成员变量是实例私有的,而不是类私有的。

链接

我听不懂他在说什么,谁能用一个例子来解释什么是错/对?

0 投票
6 回答
371 浏览

service - 关于嘲笑的另一个问题

首先让我声明,尽管我是一个相当新的 TDD 实践者,但我对它的好处非常满意。我觉得我已经取得了足够的进步,可以考虑使用模拟,并且在了解模拟在 OOP 中的位置时遇到了真正的障碍。

我已经阅读了尽可能多的关于该主题的相关帖子/文章(FowlerMiller),但仍然不完全清楚如何或何时嘲笑。

让我举一个具体的例子。我的应用程序有一个服务层类(有人称它为应用程序层?),其中方法大致映射到特定用例。这些类可以与持久层、域层甚至其他服务类协作。我一直是一个很好的 DI 小男孩,并且已经正确地分解了我的依赖项,因此可以将它们替换为测试目的等。

示例服务类可能如下所示:

}

我通过使用 NMock 隔离了它的依赖项(DocumentDao、PatientSnapshotService)来测试这个方法的过程。这是测试的样子

我对这个嘲弄的小尝试的想法如下:

  1. 这个测试似乎打破了许多基本的 OO 规则,尤其是封装:我的测试完全了解被测类的具体实现细节(即方法调用)。每当类内部发生变化时,我都会看到很多非生产性的时间花在更新测试上。
  2. 也许是因为我的服务类目前相当简单,但我不太清楚这些测试增加了什么价值。我是否保证正在按照特定用例的要求调用协作对象?对于这么小的好处,代码重复似乎高得离谱。

我错过了什么?

0 投票
1 回答
356 浏览

java - 将枚举中的方法链接到客户端类的成员变量

以下枚举结构执行某些操作,同时对客户端类保持不可知(出于封装原因)

客户端类

我的问题是如何链接属于 MyEnum.A 和 MyEnum.C 的 method1() 的具体实现,以便它们对 Client 类成员 varY 进行操作,而 MyEnum.B 和 MyEnum.D 的 method1() 实现只能在客户端类成员变量 varX。

例如在 main() 方法中:

因此,根据当前的枚举状态,上述语句应仅对 varX 或 varY 进行操作,并更改 aClient 上的状态。

让我们说:

由varY表示的aClient的状态应更改为varY+2。varX 应该保持不变。

从简单的命名约定可以看出,此时 MyEnum 中的 varX 并没有以任何方式链接到 Client 类中的 varX。我的想法倾向于变量的类型。由于我正在使用原语(int),因此无法区分..

您是否建议我在 Client 类中为每个 varX 和 varY 创建不同的自定义类型(以某种方式包装它们?)?

我希望我对这个问题不太冗长。如果我不清楚,请告诉我。非常感谢。

0 投票
2 回答
474 浏览

coding-style - 关于范围和封装的问题

我有一个关于范围和封装的一般性问题。采取两种情况:

场景一:

场景二:

从功能上讲,这两个代码片段做同样的事情。我试图了解编码风格的细微之处以及为什么一种方式可能优于另一种方式?从封装的角度来看,方案 2 似乎更好。但是场景 1 更加万无一失,因为条件中的布尔值仅来自一个地方,即全局常量。您不必担心在正确接收参数时可能会传入错误值的函数调用。但是场景 2 似乎值得,因为您删除了常量的依赖关系并且可以让函数表现得更加动态。对此有什么想法吗?我还有其他权衡吗?

同样的概念和问题也适用于对象和类。但是为了简化代码示例,我只是根据函数来展示示例。

0 投票
3 回答
1379 浏览

python - 如何封装python模块?

是否可以将 python 模块 'mechanize' 和 'BeautifulSoup' 封装到一个 .py 文件中?

我的问题如下:我有一个需要机械化和 BeautifulSoup 的 python 脚本。我从 php 页面调用它。webhost 服务器支持 python,但没有安装模块。这就是为什么我想这样做。

对不起,如果这是一个愚蠢的问题。

编辑:谢谢大家的回答。我认为解决这个问题的解决方案是围绕 virtualenv。有人可以用非常简单的术语来解释我吗?我已经阅读了 virtualenv 页面,但仍然很困惑。再次感谢。

0 投票
1 回答
194 浏览

c# - 通过事件与用户控件交互

我浏览了网站上的问题,但还没有找到合适的答案。

我的问题是我的主要表单类由于所有的事件和方法而杂乱无章。

我决定将表单分解为用户控件。不幸的是,我无法从其他用户控件访问信息。

例如,我有一个打印一些信息的用户控件。但其中一些信息在另一个用户控件中。我将如何检索该数据?

我阅读的一种解决方案是将委托传递给 Print User 控件。委托将包含来自信息用户控件的方法,该方法从控件返回数据。因此,每当调用打印事件时,我都会调用该函数。

我的另一个解决方案是将事件附加到信息用户控件。每当用户控件中的信息发生变化时,我都会更新我的打印变量。

0 投票
26 回答
225906 浏览

java - 封装 Integer.parseInt() 的好方法

我有一个项目,我们经常在其中Integer.parseInt()将 String 转换为 int。当出现问题时(例如,String不是数字而是字母a,或其他),此方法将引发异常。但是,如果我必须在任何地方处理我的代码中的异常,这很快就会变得非常难看。我想把它放在一个方法中,但是,我不知道如何返回一个干净的值以表明转换出错了。

在 C++ 中,我可以创建一个接受指向 int 的指针并让方法本身返回 true 或 false 的方法。但是,据我所知,这在 Java 中是不可能的。我还可以创建一个包含真/假变量和转换值的对象,但这似乎也不理想。全局值也是如此,这可能会给我的多线程带来一些麻烦。

那么有没有一种干净的方法来做到这一点?

0 投票
3 回答
1777 浏览

c# - 类方法中的多个参数

总初学者问题。我正在尝试为基于 int Quantity 和小数价格计算对象总价的类创建一个方法。这两个都是私有的并且具有实例变量属性分配。当我在方法中使用两个单独的参数时,我无法弄清楚如何访问它们并计算它们。有问题的方法是 GetInvoiceAmount。任何建议将不胜感激

0 投票
5 回答
394 浏览

c++ - 封装的“巅峰”——关于来自 Effective C++ 的建议的问题

Effective C++ 的第 23 条规定:Prefer non-member non-friend functions to member functions。

该项目的全部目的是鼓励封装,以及包的灵活性和功能可扩展性,但我的问题是,在接受这个建议时你走了多远?

例如,您可以拥有您的类、您的私有数据成员,然后通过将公共函数减少为仅用于您的私有数据成员的访问器和/或修改器来采取极简方法。然后,每个其他函数都可以是非成员函数。

但是,您是否愿意在可能牺牲代码清晰度的情况下增加封装,访问器和修改器遍布各处?线画在哪里?

0 投票
7 回答
3074 浏览

java - 访问 Java 中的私有 Collection 字段

我的一个类有一个包含 Set 的字段。该字段仅在构造函数中填充,然后由其他类读取。最初我有这样的事情:

但这违背了面向对象的最佳实践,myItems 应该是私有的,并且只能通过 setter 和 getter 访问。于是我把它改成了:

现在 myItems 是私有的,但是调用 getItems() 的人仍然可以随意添加/删除项目,这与我之前的情况基本相同。(我实际上并不担心有人更改项目内容,这更像是一个理论问题)

于是我改变了 getItems() 以返回一个数组:

现在我的物品真的很私密。不幸的是,我知道将读取项目的对象实际上想要使用 Set,因此它必须立即将数组转换回来。我还可以返回 myItems 的副本:

这为调用者提供了他们想要的东西,但在每次访问时都会创建一个新的 Set。

在这种情况下你会怎么做——不惜一切代价保护隐私,接受原始结构的转换/复制,或者牺牲对集合内容的控制并依赖负责任的调用者?