内部变量被声明为公共且可访问时,是否使用术语?


10

如果有人编写代码以使内部变量$ _fields可以在不使用getter / setter方法的情况下进行访问,那么是否有合适的术语来描述呢?

有礼貌的东西可以和管理一起使用:)


9
缺乏封装?
奥德

@Oded我认为您是对的-缺少封装/封装不良描述得很好
PeterB 2011年

我在尝试回答此问题时想到的两个短语是“泄漏抽象”和“松散范围界定”-每个单词在我的脑海中指的是什么?
PeterB 2011年

1
泄漏抽象是当您尝试抽象一个概念但实际上并不起作用时-底层概念仍然泄漏(SQL上的ORM和HTTP / HTML上的Web框架往往是泄漏的抽象)。
奥德

@PeterB-要添加到Oded的说明中,请参见:joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans

Answers:


30

在礼貌的社会中,公开私人成员绝不是一件好事。

这种做法是缺乏/不良封装。


6
+1,那么,你不会得到你的私处了在办公室你会吗?
StuperUser 2011年

6
-1:封装确实确实发生并且发生得很好。但这不是通过公认的方式通过源代码记录的。某些语言(如Python)缺少真正的私有变量,但仍然实践封装。
S.Lott

6
@Oded:封装是一个设计概念。不同的语言具有不同的概念实现。具有私有声明的语言允许一种实现。具有无状态对象的功能编程语言可能具有不同的实现。Python(缺少private)具有封装概念的另一种实现。
S.Lott

1
@S Lott; Oded-封装是好的,而依赖于经常直接从其他类访问私有变量的代码的封装是不好的。在python中,您可以通过访问另一个类的名称混杂的私有变量或忽略单个下划线前缀的约定来实现此目的(尽管如果您的getter正在执行其他行为;实际上应该__用于名称修饰)。其他语言也可能具有较差的封装,例如,Java中的反射和C ++中的指针运算以获取私有变量。Python只是没有使语法变得那么麻烦。
jimbob博士2011年

2
@drjimbob:Python代码很少使用__名称修饰。没有__,它的设计仍然反映出良好的封装性。声称“公共”表示“缺乏/封装不良”是错误的。这个概念仍然存在。源代码缺乏适当的修饰。
S.Lott



2

它称为财产袋。

通常,它用于保存一组可能相关的属性(每个属性可能都是具有适当访问说明符的类对象)。但是周围的结构只是一袋财产。


2

它被称为“不遵循特定的编码标准”。

OP写道:

内部变量$ _fields无需使用getter / setter方法即可访问

这可能违反您的标准,并且(因此)可能是代码异味。但这不一定是封装不良。将内部变量(如“仅内部使用”)暴露给外部的getter和setter会更糟。

问题是:$_fields外部世界应该可以访问吗?

如果是这样,我们有一种情况,您将添加getter / setter方法。这些方法不封装任何东西,而是封装$_fields某种事实(与动态计算/获取/等相反)。根据语言的不同,您可能仍然会将类型(也称为实现细节)泄漏到外部。无论您是始终要使用吸气剂/设定器,还是仅在“需要”时才是编码标准问题。

如果$_fields应该被访问的话,好了,不对其进行访问。同样,是否应该阻止其他人在语言级别(私人和朋友)访问它(在某些情况下可能会简化调试),这再次成为编码标准问题。

封装问题与此完全正交。使用吸气剂和吸气剂绝对可以违反封装。插入起来甚至更容易,因为大多数人看到一堆吸气剂和吸气剂时,它们的警钟不会响起-这些代码似乎遵循最佳实践。与可能$_fields没有被指定为的变量相比,代码很可能在内部实现细节上引入更多的依赖性private

我是一个坏比喻的拥护者:称呼不佳的封装就像将持枪的人称为凶手。



-2

如果您的setter / getter方法只不过是

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

那么只需要制作一个公共变量就可以节省一些区别很重要的情况。


3
仅仅是因为您的getter和setter现在要做的一切,并不意味着那将一直是这样。而且,如果要向设置器添加验证需要组合成千上万行代码来查找可访问该属性的任何地方,则可以通过有意避免首次封装来立即浪费自己保存的十几秒钟。
Plutor 2011年

@Plutor:如果这就是对象所能做的所有事情(例如,因为它代表发送到另一个进程的消息或数据库中的记录),那么就可以了;这些都是应该高度保守的。
Donal Fellows
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.