标签: encapsulation

什么时候应该使用自己的getter/setter来直接访问成员?

在Eclipse中生成setter和getter时,其中一个选项是使用类中的getter和setter而不是直接访问类成员.这种级别的内部封装是否有用,或者它是一个好主意,一步到位?

DUPE:你应该在课堂上使用访问者属性,还是只从课堂外使用?

oop encapsulation

13
推荐指数
1
解决办法
1739
查看次数

访问复制构造函数中另一个对象的私有字段 - 真的有问题吗?

在我的Java应用程序中,我有一些这样的复制构造函数

public MyClass(MyClass src) {
    this.field1 = src.field1;
    this.field2 = src.field2;
    this.field3 = src.field3;
...
}
Run Code Online (Sandbox Code Playgroud)

现在Netbeans 6.9警告这个,我想知道这个代码有什么问题?

我的担忧:

  • 使用getter可能会引入不必要的副作用.新对象可能不再被视为原始对象的副本.
  • 如果建议使用getter,如果将为新实例使用setter,它会不会更加一致?

编辑:实际警告是"访问另一个对象的私有字段",Netbeans提供的唯一可用操作是添加一个@SuppressWarnings("AccessingNonPublicFieldOfAnotherObject")

我的代码实际上和给定的例子一样简单.

java encapsulation

13
推荐指数
2
解决办法
2970
查看次数

我可以在setter方法中编写验证逻辑吗?

setter方法是否仅用于设置属性的值,因为它作为参数传递?在将值赋给属性之前,我们可以编写一些验证逻辑吗?

java oop encapsulation

13
推荐指数
5
解决办法
1万
查看次数

在这里和那里创建具有大量导入函数的类

假设我有很多函数,alotoffunc.py它被多于一种类型的对象使用.

比方说,ObjectIObjectIIObjectXI所有在使用一些功能alotoffunc.py.每个Object都使用不同的函数集,但所有对象都有变量object.table.

alotoffunc.py:

def abc(obj, x):
  return obj.table(x) * 2

def efg(obj, x):
  return obj.table(x) * obj.table(x)

def hij(obj, x, y):
  return obj.table(x) * obj.table(y)

def klm(obj, x, y):
  return obj.table(x) *2 - obj.table(y)
Run Code Online (Sandbox Code Playgroud)

然后我导入函数并重载它们:

import alotoffunc

class ObjectI:
  def abc(self, x):
    return alotoffunc.abc(self, x)

  def efg(self, x):
    return alotoffunc.efg(self, x)

class ObjectII:
  def efg(self, x):
    return alotoffunc.efg(self, x)
  def klm(self, x, y): 
    return alotoffunc.klm(self, x, y) …
Run Code Online (Sandbox Code Playgroud)

python oop encapsulation class object

13
推荐指数
3
解决办法
434
查看次数

有哪些方法来模块化C代码?

您知道在项目规模扩大时模块化C代码有哪些方法,实践和约定?

c encapsulation namespaces module scoping

12
推荐指数
3
解决办法
2618
查看次数

为什么分别坚持get-set而不是car.speed()和car.speed(55)?

除了明确清晰,我们为什么要坚持:
car.getSpeed()car.setSpeed(55)
当这可以作为很好: car.speed()car.speed(55)

我知道get()和set()对于通过将所有内容保存在一个地方来保持对数据成员的任何更改都是有用的.

另外,显然,我理解car.speed()并且car.speed(55)相同的功能,这使得这个错误,但是在PHP和Zend Framework中,相同的操作用于GET,POST和回发.
在VB和C#有"属性",和许多被使用,多少我听说纯粹主义者的厌恶,并有东西在类似于Ruby,5.times.each,.to_i
你有操作符重载,多重继承,虚拟函数C++,某些组合可以驱使任何人坚果.

我的意思是说,有太多的范例和方法可以完成任务,似乎没有人尝试过我提到的特定组合.

至于我,我的理由是阅读代码简短而清晰.
我错了,稍微错了,这只是奇怪的,所以不使用,或者还有什么?

如果我仍然决定保持正确,我可以使用car.speed()car.setSpeed(55).
这有什么不对(只是省略"获取")?

谢谢你的任何解释.

oop getter setter encapsulation car-analogy

12
推荐指数
2
解决办法
733
查看次数

具有地图的类的吸气剂/制定者

为包含地图的类实现/提供getter/setter的最佳实践是什么?

我看到的最常见的实现是:

public class MyClass {

  private Map<String, String> myMap;
  public getMyMap() { /* Return an unmodifiable map */ }
  public setMyMap(Map<String, String> myMap) { ... }
}
Run Code Online (Sandbox Code Playgroud)

或者提供如下界面会更好:

public getMyMap() { /* Return a modifiable map */ }
public addToMap(String key, String value) { myMap.put(key, value); }
Run Code Online (Sandbox Code Playgroud)

为什么这种方法更好?

java encapsulation interface getter-setter

12
推荐指数
1
解决办法
9133
查看次数

为什么PHP允许通过子类中的覆盖使受保护的和私有的方法公开?

从一些简短的提示,我发现当我执行以下操作时覆盖子类中的超类方法时出现错误:

  • 使用私有子类方法覆盖受保护的超类方法
  • 使用protected或private子类方法重写公共超类方法

但是,如果我在另一个方向执行此操作,则不会抛出任何错误:

  • 使用受保护或公共子类方法覆盖私有超类方法
  • 使用公共子类方法覆盖受保护的超类方法

这对我来说似乎很直观 - 我希望它能以相反的方式工作,以强制执行信息隐藏和封装.这似乎允许糟糕的设计,允许内部以可能破坏其他方法的方式暴露,我不能看到这是一个好主意的情况.为什么以这种方式实施,我错过了什么?

此外,这是其他编程语言的标准做法吗?

php oop inheritance encapsulation visibility

12
推荐指数
2
解决办法
8145
查看次数

为什么我们将对象而不是对象成员传递给函数?

FOO()在类A中有一个方法,它从类的数据成员中获取其参数输入B(假设它们是两个浮点数和一个int).我理解这一点的方式,通常更好地实现这一点,如:

A->FOO1(B, other_data_x)
Run Code Online (Sandbox Code Playgroud)

而不是

A->FOO2(B.member1, B.member2, B.member3, other_data_x).
Run Code Online (Sandbox Code Playgroud)

我收集了一个,但不是唯一的优点是它留下了B访问哪些成员的细节,FOO1()因此有助于隐藏实现细节.

但我想知道的是,这是否真正引入了类A和之间的额外耦合B.类A在前者的情况下必须知道类B存在(通过类似include class_B_header.h),如果成员B变化或移动到不同的类或类B被完全消除,你需要修改AFOO1()相应.相比之下,在后一种方法中,FOO2()并不关心类是否B存在,实际上它关心的是它提供了两个浮点数(在这种情况下由B.member1和组成B.member2)和一个int(B.member3).可以肯定的是,在后一个示例中也存在耦合,但是这种耦合在任何地方都可以处理FOO2()被调用或任何类正在调用FOO2(),而不是在A或的定义B.

我想这个问题的第二部分是,是否有解耦的好办法A,并B进一步当我们要实现类似的解决方案FOO1()

c++ oop encapsulation decoupling

12
推荐指数
3
解决办法
724
查看次数

使用JavaScript动态应用CSS

使用JavaScript动态地将样式(即在运行时创建样式的值)应用于HTML元素的好方法是什么?

我正在寻找一种方法来将JavaScript小部件(JS,CSS和标记)打包在一个组件中(基本上是一个对象).我们的想法是让组件封装样式(因此用户可以使用一个很好的API来修改它,而不是直接修改CSS并间接应用更改的更紧密耦合的方法).问题是单个API调用可能意味着对几个样式元素的更改.

我这样做的方法是构造CSS并将styleatrribute设置为适当的元素(最有可能使用ID来避免将更改应用于标记的其他区域).这是一个好的解决方案吗?有没有更好的方法呢?

javascript css encapsulation styling web-component

12
推荐指数
3
解决办法
3万
查看次数