为什么我们有时更喜欢数据结构而不是对象?

Why do we sometimes prefer having data structures over objects?

提问人:laahaa 提问时间:11/3/2018 最后编辑:BSMPlaahaa 更新时间:11/3/2018 访问量:536

问:

正如罗伯特·马丁(Robert Martin)的《清洁代码》(Clean Code)所说:

对象隐藏 他们的数据隐藏在抽象后面,并公开了对该数据进行操作的函数。数据结构 暴露他们的数据,并且没有有意义的功能。

但他也提到:

过程代码(使用数据结构的代码)可以很容易地添加新函数,而无需 更改现有数据结构。另一方面,OO 代码使其易于添加 在不更改现有函数的情况下创建新类。

和:

... 这种混合使得添加新功能变得困难,但也使添加新数据变得困难 结构。它们是两全其美的最糟糕的。避免创建它们。

上面的混合是指数据结构和对象之间的混合。

但是数据结构似乎存在冲突:使用数据结构的优点是更容易添加函数,但对于数据结构,我们最好永远不要在其中添加函数。那么拥有数据结构有什么意义呢?例如,DTO(数据传输对象)是使用数据结构而不是使用对象的例子之一。而且,不要在其中添加大量逻辑总是一个好习惯。--但是为什么?

OOP 设计模式 与语言无关

评论

1赞 Ryan Pierce Williams 11/6/2018
一般来说,当你用面向对象的语言实现数据结构时,数据结构将使用类来定义,其实例将是对象。术语似乎更面向 C/C++,其中类和结构作为语言特性是有区别的。
0赞 jaco0646 12/6/2018
请注意,对象和数据结构之间的冲突称为表达式问题

答:

1赞 Nghia Bui 11/3/2018 #1

你误解了鲍勃叔叔说的话。

使用数据结构的优点是可以更轻松地添加函数

不,应该是:分离数据结构和函数的优点是更容易添加函数。

当数据结构和函数分离时,可以在不破坏旧函数的情况下添加新函数。相反,当数据结构和函数被捆绑到单元中时,就像 OOP 中的类一样,添加一个新函数(方法)将破坏所有旧的单元/类。

评论

0赞 laahaa 11/4/2018
我们如何分离数据结构和函数,尤其是在像 java 这样的面向对象语言中?
0赞 Nghia Bui 11/4/2018
在“OO”语言中,你仍然可以很容易地编写非OO代码,只写不带方法的类,只写不带属性的类,只用静态方法写不带属性的类。
0赞 jaco0646 11/5/2018
我建议使用组合方法,而不是静态方法:编写由数据结构组成的对象并将它们封装起来。这样可以保持数据结构的纯粹性和简单性,并防止对象作为数据结构本身传递。