我们可以说对象具有属性,状态和行为吗?


16

我正在阅读Oracle对OOP概念的介绍,并且遇到了以下描述:

实际对象具有两个特征:它们都具有状态和行为。狗具有状态(名称,颜色,品种,饥饿)和行为(吠叫,抓捕,摇尾巴)。软件对象在概念上与现实世界中的对象相似:它们也由状态和相关行为组成。

我的问题是,当描述状态时,它的混合属性也存在。例如,狗的名字和颜色是它的属性,而饿或渴则是它的状态。

因此,我认为将对象的特征分为三个部分更为准确:属性,状态和行为

当然,将其翻译成编程语言时,我可以看到三重分区变成了两重分区,因为属性和状态都将存储在字段/变量中,而行为将存储在方法/函数中。

但是从概念上讲,将三件事分开是更有意义的。

这是另一个示例:考虑一盏灯。在我看来,说灯泡的大小以及它是否已打开都是状态。灯的大小是属性,而不是状态,而打开或关闭是状态。

还是我错过了什么?


4
是的,您缺少特征作为一种模拟行为的技术。
yannis 2012年

看看这篇文章,它可以帮助:yegor256.com/2014/12/09/...
yegor256

Answers:


13

如果将属性定义为表示实例的不变特征,则对象就是属性,状态和行为,这是正确的。作为事实上,它使这种区别很重要,因为存在包含对象属性,(在你的意识,)和无状态; 它们被称为不可变的,它们在编程中非常有用。

这个由三部分组成的定义确实以编程语言表示,例如,使用finalJava中的readonly关键字或C#中的关键字来表示实例数据,这些数据在实例的整个生命周期内都不会改变。

不过,我必须补充说,不变的实例数据通常不称为属性。根据我们使用的语言,我们倾向于将它们称为“最终”或“只读”或“常量数据”。它们的恰当称呼是“不变式”,但是从这个意义上讲,这个词并不经常使用。它更常用于其他用途。


将其视为实例的不变和变化特性的术语是有意义的。我很高兴我离那儿并不遥远。谢谢!
丹尼尔

在制造或组装过程中,灯的尺寸是否处于固定状态?
JeffO 2012年

不,这将是一个属性。(按OP的
说法

4
状态和属性之间没有根本的区别,因此将状态定义为可能可变或不可变更为简单。尽管具有(不可变的)属性和(可变的)状态是不正确的(并且在许多意义上是等效的),但是这种区别使定义比必要的更为复杂。尽管IMO术语“状态”可能不是描述该概念的最佳术语,因为“状态”以某种方式暗示着它应该改变,而“状态”(如Oracle文章中所述)则没有。
Lie Ryan

我认为随着岁月的流逝,人们对不变性的态度正在发生变化。对于那些了解它的重要性的人来说,可变状态和不可变状态之间存在根本的区别,足以保证使用不同的名称。我可以推荐一本非常有趣的读物吗?埃里克·利珀特(Eric Lippert)-精彩的代码冒险-C#中的不可变性第一部分:不可变性
Mike Nakis 2012年

4

我认为说对象只有两个特征更为准确。以Oracle为例:

狗具有状态(名称,颜色,品种,饥饿)和行为(吠叫,抓捕,摇尾巴)。软件对象在概念上与现实世界中的对象相似:它们也由状态和相关行为组成。

名称,颜色,品种和饥饿程度的值(状态)存储在对象的属性中,这是实现细节。您根本不需要属性。

如果要将属性作为第三个特征,则还必须将方法作为第四个特征,因为对象的行为(如状态)也可能发生变化。状态和行为是对象的两个抽象特征。属性和方法是这些概念的具体实现。


狐狸的毛皮颜色会因为冬天的变化而变成一种状态吗?
JeffO 2012年

@JeffO毛皮的颜色也会随着变老,变湿,变色而改变。这并不是真正的状态,仅仅是因为它可以在一个对象的生存期内发生变化,而是因为相同类型的不同对象可以对该属性具有不同的值。
比尔蜥蜴2012年


0

我们可以用无数种方式对事物进行分类,每种分类都没有“正确答案”。仅当分类导致更深入的了解或改善交流时,才对分类进行分类是有好处的。如果您的团队更喜欢使用术语“属性”,“状态”和“功能”,并且具有良好的工作定义,则这将有助于改善内部沟通,但在该小组之外进行沟通时,您需要保持灵活性。

“饥饿”和“口渴”的概念可以从基本属性(例如血糖,水合水平)中得出,因此我们可以将状态视为元属性,它是从基本属性中得出的,我们可以根据这些基本属性将其循环为“真”或“假”相关基本属性的状态。对于光为例,我们能想到的光具有的属性applied_voltage,并resistance与职能voltage_switch()shine()。的voltage_swich()是然后一些输入(例如手动开关,光,定时器等)的函数,并且shine()是的函数applied_voltageresistance。我们可以声明一个称为light_stateTrue或False 的元属性,以帮助从心理上构造对象,但最终这些想法都是我们用来组织工作的心理构造。


-2

对象的状态直接或间接地编码在其属性中。例如,如果您想让狗口渴,可以让它有一个

private boolean thirsty;

或者,您可以让它具有类似

private Date lastDrinkAt;

并通过比较当前时间和上次喝东西的时间来推断您的狗是否口渴。

无论哪种方式,对象的状态都位于其属性内。

然后是一些没有属性的类,主要是实用程序类。但是在这种情况下,您通常也不想创建它们的实例。

为了能够对陈述进行推理,科学家通常坚持最小化原则。我认为这就是为什么Oracle没有明确提及状态的原因。它可以从属性的值得出。


1
Oracle 确实明确提到了状态。阅读报价。并且OP显然是从对象的不变特性的意义上使用单词属性,因此他不会将它们与状态混淆。
Mike Nakis 2012年

它们仍然是特征-无论它们是在变化还是在您将其称为“属性”或“成员”。在编程世界中,除了对象的属性外,没有其他任何东西可以表示对象的状态。
拉库

-3

真实世界的连接是错误的。这是我要教的方法(C ++方法):

  1. 计算机支持两种不同的存储格式:数据和代码
  2. 数据看起来像位010101010101
  3. 代码看起来像asm指令
  4. 数据位有两个不同的值,可以是0或1
  5. 数据被抽象为数据类型:int i = 1; 只是一些位0000001的简写
  6. 代码看起来像一个函数:int f(int a){return a + a + a; }是一些asm指令的简称
  7. 当您有多个变量时,可以将它们组合为一个结构:int a; 浮动b; 可以放置到结构AB {int a; 浮动b; };
  8. 当您将一些代码段组合到其中时,您将得到一个类:ABf类{int a; 浮动b; 浮点数sum(float c)const {return a + b + c; };
  9. 然后,对于数据,我们具有可用于查找值的变量名称:a + b + c以访问数据。
  10. 然后我们有正常的函数调用:int k = f(10); 访问“存储”在f函数中的asm指令。
  11. 然后是对象实例:ABf var;
  12. 成员函数调用:int k2 = var.sum(10.0);
  13. 函数的类型为int f(int);
  14. 成员函数的类型为int ABf :: sum(float);
  15. 该指针的类型为ABf *
  16. 像a和b以及c这样的变量是上下文相关的,如果它们在成员函数中,则可能表示this-> b或b。
  17. 成员函数int ABf :: sum(float c)只是int sum(ABf * this,float c)的简称。
  18. “状态”一词的含义与数据相同
  19. “行为”一词的含义与代码相同
  20. “属性”一词的含义与数据相同。

因此,状态和属性之间实际上没有任何区别。这只是位的随机收集。分开它们只是任意区别。只需知道它的别名即可。

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.