问题标签 [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.
oop - 一个类什么时候应该使用自己的getter/setter而不是直接访问成员?
在 Eclipse 中生成 setter 和 getter 时,选项之一是在类中使用 getter 和 setter,而不是直接访问类成员。这种级别的类内部封装是有用的,还是将一个好主意走得太远了?
java - Spring的依赖注入不会破坏信息隐藏吗?
来自 C++ 背景的我必须掌握 Java 世界及其框架的复杂性。查看 DI 的 spring 框架,我发现我很难相信我必须将每个 setter 函数都公开给 DI。这个要求不是破坏了信息隐藏的原则吗?
当然,我希望 spring 能够设置我的类的一些私有部分,但我当然不希望每个客户端类都能够这样做。
我在这里想念什么?
language-agnostic - 通过信息隐藏进行有效封装的绝妙例子?
”抽象和封装是互补的概念:抽象关注对象的可观察行为……封装关注引起这种行为的实现……封装通常通过信息隐藏来实现,即隐藏所有信息的过程对象的秘密对其本质特征没有贡献。” - Grady Booch面向对象分析和设计
你能告诉我一些通过信息隐藏封装的好处的令人信服的例子吗?
c# - 访问自动属性中的支持字段
有什么方法可以访问属性的支持字段以进行验证、更改跟踪等?
可能会出现以下情况吗?如果没有,是否有计划在 .NET 4 / C# 4 中使用它?
我遇到的主要问题是,使用自动属性不允许在验证等方面具有与具有显式支持字段的属性相同的灵活性。然而,显式支持字段在某些情况下具有缺点,即当它应该访问和重用属性的验证、更改跟踪等时,允许包含它的类访问支持字段,就像可能正在访问的任何其他类一样外部的财产。
在上面的示例中,对支持字段的访问将限定在属性范围内,从而防止绕过属性验证、更改跟踪等。
编辑:我已将 <Backing Field> 更改为 <Keyword>。我会提出一个类似于 value 的新关键字。字段会做得很好,尽管我确信它已在很多现有代码中使用。
wpf - WPF - 我可以停止 UserControl 公开其命名的子元素吗?
这是一个菜鸟问题,但我刚刚意识到,如果我创建一个 UserControl 并选择将它的一些子元素命名为 la -
然后我可以在使用 XAML 的代码隐藏中引用命名元素。所以对于上面的例子我可以写
我很好奇为什么会这样,更重要的是,我如何安全地封装这些控件。
像往常一样,任何帮助将不胜感激。
oop - 类定义中的封装
例如,您是在方法定义中使用访问器和修改器还是直接访问数据?有时,一直或何时在罗马?
language-agnostic - OO 设计的优势是语义还是封装?
面向对象设计 (OOD) 结合了数据及其方法。据我所知,这实现了两件伟大的事情:它提供了封装(所以我不关心有什么数据,只关心我如何获得我想要的值)和语义(它将数据与名称联系起来,以及它的方法始终如一地使用数据)。
那么OOD的实力在哪里呢?相比之下,函数式编程将丰富性归因于动词而不是名词,因此封装和语义都是由方法而不是数据结构提供的。
我使用的系统处于功能范围的末端,并且一直渴望 OO 的语义和封装。但我可以看到,OO 的封装可能成为对象灵活扩展的障碍。所以目前,我可以将语义视为更大的力量。
还是封装是所有有价值代码的关键?
编辑:我的意思是这里提供的封装 OO 的类型。changeColor(door,blue)
变成door.changeColor(blue)
.
c# - 如何使引用类型属性“只读”
我有一个Bar
包含引用类型的私有字段的类Foo
。我想Foo
在公共财产中公开,但我不希望财产的消费者能够改变Foo
......但是它应该可以通过内部改变Bar
,即我不能制作该领域readonly
。
所以我想要的是:
...这当然是无效的。我可以只返回一个Foo
(假设它是IClonable
)的克隆,但这对消费者来说并不明显。我应该将属性名称更改为FooCopy
?? 它应该是一种GetCopyOfFoo
方法吗?您认为最佳做法是什么?谢谢!
oop - 抽象和封装的区别?
封装和抽象之间的确切区别是什么?
java - Java:如何干净地处理大量字段及其封装?
假设我的任务是编写某种 RPG。这意味着,例如,我要跟踪 a及其统计数据,例如智力、伤害加成或生命值。Character
GameCharacter
我非常害怕在项目结束时我最终可能会处理大量字段 - 对于每个字段,我都必须确保它们遵循一组非常相似的约束和行为(例如,我希望它们限制在最小值和最大值之间;我希望能够区分“基本值”和“临时奖金”;我希望能够在不通过 setter 和 getter 的情况下增加和减少两者) . 突然之间,对于每个字段,我都需要一个(两个?)getter 和四个 setter,也许还需要几个重置器!即使对于 10 个字段,这也意味着很多方法都相似,eek。
对于 DRYness,我已经开始将在Field
类中处理这些统计数据的逻辑封装起来,这样我就可以编写诸如intelligence.applyBonus(10)
or之类的代码hitpoints.get()
(它会注意返回的值在范围内)等。我什至花了这么长的时间来创建类将这些字段组合在一起,但这不是现在的重点。
现在,我在“插入”时遇到了这个问题Field
:GameCharacter
大多数 Java 教科书都说每个类都应该有带有公共 getter 和 setter 的私有字段。这在理论上听起来不错,而且我已经围绕int
;建立了一个完整的课程。但是,当您发现自己调用 getter 来获取... getter 时,这个想法听起来并不可靠:
我宁愿直接访问该字段。也许这是我的 Python/VB [1] “背景”,但对我来说它更干净、更清晰、更直接:
公共领域的(理论上)问题是我放弃了对它的所有控制;例如,在代码库中的某个其他点,不幸的是,可能会发生以下情况:
听起来像是一个微妙的错误……但是……我的意思是,我真的应该担心吗?我从来没有打算Field
直接分配 [2],我已经在 Javadoc 中记录了这不是应该做的事情,但我仍然是新来的,所以我有点被撕裂了。
所以我想听听你对这个话题的看法。封装的优势是否如此巨大,以至于我应该继续使用 getter getter 和 setter getter 等等……还是我应该采取健康措施进行封装并将其Field
作为一个public
领域?
[1] 是的,我知道。我一直在努力忘记。但是我们最近也看到了一些 C# 和 man,属性并不甜。那好吧。
[2] 构造函数除外!getter 不会把我从错误的构造函数中拯救出来。