百科问答小站 logo
百科问答小站 font logo



为什么不建议一个对象在多处存储引用? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

这个问题简单多了。


不论是Area里面有一个保存Item容器,还是Item上面有一个Area引用,都已经有足够的信息。所以现在的问题是在于,当Item上已经有Area的引用的时候,那么Area是否还有必要保留对Item的引用。


这是个典型的关于冗余的问题。

冗余会带来什么问题?

首先是占用更多的存储空间,但这通常不成为一个问题,尤其是只存储一个引用的时候。

那么另外一个问题就是数据一致性的问题,当冗余数据出现,就可能存在数据的不一致。在这个例子里面,譬如说a : Area保存了b : Item的引用,但是b的Area属性不是a。

这就是数据不一致,这时候我们不知道b到底是属于a还是不属于。或者说通过不同的方式处理数据的时候,例如我们遍历a的时候能找到b,但是找b的容器的时候又找不到a。


为了避免出现一致性的问题,我们通常需要做原子性操作,原子性就是说多个操作要么都成功,要么都失败。例如我们让a添加子元素b和设置b的Area属性为a这两个操作是原子性的,要么都成功要么都失败,就可以避免产生数据不一致的问题。

但遗憾的是,原子性是非常难做到的一件事情,很多时候代价非常大。因为我们要处理非常多的异常情况,例如操作被中断,数据写入时出现故障,并发冲突等等。

当然,大多数时候我们只要把两个操作写在一个方法里面或者其他强约束就足够满足了。更长的生命周期,更重要的数据会有更加严苛的要求。


但是即便做不到绝对的原子性,我们也不一定就会出现数据不一致的情况。而即便出现了数据不一致的情况,也不一定就无法进行修复和补救,例如我们可以强行认定Area属性是正确的数据,据此来修复所有的不一致情况。

所以,这只是一个需要权衡的问题。冗余会带来更好的性能,但是也会带来数据不一致的风险。




  

相关话题

  世界上学习语言难易度排行是怎样的? 
  如何才能写出没有bug的程序? 
  什么时候用C而不用C++? 
  Visual Studio 2019可以用来玩C语言吗? 
  NoSql是一种语言,还是一种概念? 
  如果编程语言有性别?Java、C++、C、C#是男是女?是GAY还是LES? 
  C 语言是否需要改进,甚至重新设计一门语言取代 C 语言? 
  “Facebook 开发的高性能PHP虚拟机 HHVM 比官方的 PHP解释器 快超过9倍”的说法是否属实? 
  你在公司项目里面看到过哪些操蛋的代码? 
  C「带坏了」多少程序语言的设计? 

前一个讨论
如何看待公众号“远方青木”在公众号上传播关于新型冠状病毒肺炎的谣言?
下一个讨论
C# 秒杀物品,程序如何控制并发?





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利