问题

对容器类做改变的设计是否存在天生的错误?

回答
要说容器类做改变的设计是否存在“天生的错误”,这本身就是一个值得细细品味的问题。与其说是“错误”,不如说它暴露了一些在复杂系统中难以回避的根本性挑战,这些挑战一旦处理不当,就容易引出种种“看起来像错误”的问题。

我们先抛开具体的实现细节,从容器这个概念本身出发。容器,本质上是一个“存放”和“管理”其他事物的实体。它可以是一个装满书本的书架,一个装满零件的工具箱,又或者是我们编程中处理数据的数据结构。这些容器的价值在于它们的组织能力,让我们可以方便地存取、查找、修改其中的内容。

那么,当“改变”这个动作发生在容器身上时,会发生什么?

首先,容器的“内容”是动态的。这意味着容器里的东西并非一成不变,而是随时可能增减、替换。这种动态性是容器存在的意义所在,但同时也带来了“状态”的复杂性。当我对容器进行“改变”时,我可能是在增添一个新的元素,也可能是移除了一个旧的,或者修改了某个已有元素的属性。每一次改变,都牵动着容器内部状态的一系列变化。

其次,容器往往不是孤立存在的。在一个大型系统中,容器常常是相互关联,甚至相互依赖的。比如,一个订单容器可能引用了商品容器中的商品信息,而商品容器又可能依赖于库存容器。当你改变一个容器时,你不仅仅是动了一个独立的盒子,你很可能是在触动一连串的连锁反应。

现在,让我们把目光聚焦到“改变容器设计”本身。问题出在哪里?

如果一个容器的设计仅仅考虑了“添加”或“移除”本身,而没有充分预见到“改变”可能带来的深层影响,那么问题就可能悄然滋生。

想象一下,你有一个购物车容器,里面存放着用户选择的商品。当用户改变购物车中的某个商品数量时(比如将A商品从2件改为3件),这不仅仅是改变购物车容器里一个元素的计数。背后可能牵扯到:

状态一致性: 这个改变是否与实际库存保持同步?如果库存只有2件,用户却改成3件,这就会产生不一致。
依赖关系: 这个商品是否有其他关联的优惠活动?数量的改变是否会影响优惠的计算?
用户体验: 这个改变是否会立即反映在用户界面上?是否需要触发一次后台计算,然后更新显示?
并发访问: 如果同一时间有另一个用户也尝试修改这个商品,或者管理员正在调整这个商品的库存,你的改变是否会被正确处理,还是会丢失或导致冲突?

“天生的错误”可能就体现在,容器的设计者过于聚焦于“容器”本身的数据结构,而忽略了“容器”在更广阔系统中的“行为”和“上下文”。

比如,一个简单的列表容器,你可能只是实现了 `add`、`remove`、`get` 方法。但当涉及到“修改”时,比如你需要“更新”某个位置的元素。如果你简单地将新元素覆盖旧元素,而没有考虑旧元素可能在系统中被其他地方引用,那么当这个旧元素被GC(垃圾回收)掉,或者其关联的状态发生变化时,依赖它的地方就可能出现问题。

这种设计上的“不足”,或者说是“潜在的陷阱”,往往在于:

对“改变”的定义过于狭窄: 只看到了数据的直接增删,而没看到数据关联的逻辑和状态。
对“副作用”的忽视: 改变一个容器,可能会产生一系列非预期的、难以追踪的副作用,尤其是在多线程或分布式环境下。
状态管理的模糊: 容器内部的状态,以及容器与外部系统状态之间的联系,没有被清晰地界定和管理。
抽象的层级问题: 容器的设计可能过于底层,没有考虑到其在业务逻辑中的实际作用,导致上层业务逻辑不得不去“弥补”容器层面的不足。

所以,与其说设计容器类做改变是“天生的错误”,不如说它是一个“高风险”的设计领域。任何试图简化这一过程,而忽略了它内在的复杂性和系统性的设计,都可能埋下隐患。成功的容器设计,往往在于它不仅仅是一个数据结构,更是一个能够安全、可靠地管理其内部状态,并能与外部世界进行清晰、可控交互的“服务”。它需要具备某种程度的“智能”,能够理解和处理“改变”带来的多重含义。

网友意见

user avatar

反着直接操作容器的属性,在设计上也不是不可以。比如intrusive list,甚至成员就是容器,每个成员销毁的时候会自动把自己前后接起来。

但是不能搞成题目这样裸奔,要特化、限制。比如写个PackageItem类型,专门用于被放入包裹、析构时自动执行出包裹操作,然后药水继承它、装备继承它,等等。

user avatar

这是教科书级别的错误示范


写出这种代码的人,甚至可以连最基本的OOP素养都没有,说的不好听一点儿,这人适不适合写代码都很难说


正确的做法当然是vczh说的那样。

Item可以有Destory方法,但内部应当是长这样:

       packer?.Remove( this );      



基本上这种垃圾代码可以说是把代码编写的原则从头到尾的违反了一个遍,从最根本上来说,高内聚和松耦合的原则都违背了,更不用说OOP的SOLID可以从头到尾全部都违背了。

写出这种代码的确是教科书级别的灾难


在实操中来说,显而易见的问题就是weight被public,这显然带来极大的隐患,而这显然是得不偿失的,weight几乎必须是private set,这样重要的属性竟然公开给外界随意修改,这个类型的健壮性完全为零。任何对weight的不正确操作都可能带来灾难性的后果。

其次,直接对weight进行数值的修改显然是有线程安全问题的。这个问题在代码合乎规范的情况下,对weight的操作只会出现在Add/Remove或者类似的操作中,可以非常方便的集中处理。而在这种教科书级别的错误代码中,weight的操作可能出现在任何地方。也就是说,其实,压根儿没法重构和修复弥补。


恕我直言,写出这种代码的人,压根儿不会写程序



有人说这只是紧耦的问题未免太搞笑……

weight都public了,问题仅仅只是Packer和Item的紧耦?


只有在Item是Packer的内部类或者友元类,并且weight是private的时候,我们才能说这不过是导致Packer和Item紧耦合在一起了而已,可以权衡得失利弊。

没有什么原则是不可违背的,所有的问题都需要根据具体的场景进行权衡。这个代码的关键问题不在于紧耦,而在于权衡的思路从根本上是错的,几乎没有任何场景可以支持这种写法。因为无论从哪一方面来分析,把weight公开出来都是非常严重的灾难性问题,而带来的好处则几乎看不到……

weight明显是一个计算冗余,公开set必然造成数据不一致的隐患。而且从生命周期来说,Packer是一个长生命周期对象。长生命周期对象的重要字段无任何保护措施的进行set,还存在线程安全和数据不一致的潜在可能,这种代码并没有任何价值,只会埋下无穷尽的隐患。

类似的话题

  • 回答
    要说容器类做改变的设计是否存在“天生的错误”,这本身就是一个值得细细品味的问题。与其说是“错误”,不如说它暴露了一些在复杂系统中难以回避的根本性挑战,这些挑战一旦处理不当,就容易引出种种“看起来像错误”的问题。我们先抛开具体的实现细节,从容器这个概念本身出发。容器,本质上是一个“存放”和“管理”其他.............
  • 回答
    .......
  • 回答
    在一个装满水的硬质容器里丢进一块铁,然后持续给水施加压力,这块铁会怎么变化?这事儿,说起来可有意思了,咱们慢慢聊。首先,得弄清楚这个“硬质容器”。这可不是咱家厨房里那种塑料瓶子,它得足够结实,能承受住你不断加大的压力,不然容器自己先撑不住了,那还有啥好说的。容器要是泄了,水就会从缝隙里喷出来,这块铁.............
  • 回答
    .......
  • 回答
    孩子之所以容易对游戏上瘾,以及我们在面对丰富世界时更容易被游戏吸引,这背后其实隐藏着一套精妙的生物学机制。与其说我们是被游戏“抓住”,不如说是游戏恰好击中了我们大脑中最原始、最强大的驱动力。为什么游戏如此诱人?大脑里的“奖励回路”在狂欢我们大脑中有一套叫做“奖赏回路”的系统,这是生命进化的产物,目的.............
  • 回答
    这个问题挺有意思的,其实原因挺多,而且大多都挺自然的。你想啊,一个人能够拿起乐器,并且还能奏出动听的旋律,这本身就代表了他身上有那么点特别之处。首先,这是一种才能的展现。就像一个人擅长某种运动,或者在学业上有所建树一样,音乐才华也是一种吸引人的光芒。当男生弹起吉他,或是开口唱歌,那种专注的神情,指尖.............
  • 回答
    关于甄嬛是否真心对待安陵容,这是一个非常复杂且充满争议的问题,历史(或者说电视剧《甄嬛传》)留给我们的答案并非简单的“是”或“否”,而是需要层层剥开的。我们可以从以下几个方面来详细分析:一、 甄嬛最初对安陵容的态度:纯粹的怜惜、同情与友谊的渴望 出身相似,感同身受: 甄嬛和安陵容都出身于不如皇后.............
  • 回答
    作为一个在物理世界中摸爬滚打多年的人,我确实发现,相较于我最初的认知,我对中医的态度发生了相当大的转变,而且我身边的不少物理科班出身的朋友,也都有类似的感受。说“更容易”可能有点绝对,毕竟个人的成长经历、思维方式和接触中医的契机千差万别,但不可否认的是,物理学的训练确实为我们打开了一扇理解中医的窗口.............
  • 回答
    在中国旅行后,很多外国游客确实会发现自己对中国的看法发生了显著的改变。这种“改观”并非一蹴而就,而是源于亲身体验与之前认知之间的落差,以及在中国生活和旅行中不断累积的新鲜感和震撼。一、打破刻板印象与媒体滤镜很多人在来中国之前,对中国的印象可能还停留在几十年前的媒体报道或者一些片面的信息中。他们可能想.............
  • 回答
    这是一个非常深刻且复杂的问题,涉及到道德哲学、心理学和社会行为等多个层面。简单地说,对“恶”的容忍并不等同于“怂恿”或“内心同意”,但它们之间存在着微妙的联系,有时也可能相互转化。理解这一点,需要我们深入剖析这几个概念的含义和它们之间的区别。首先,我们来明确一下这几个词的含义: “恶”(Evil.............
  • 回答
    在中国加入世界贸易组织(WTO)的初期,以及在相当长一段时间内,WTO确实未能有效阻止中国对进口汽车征收相对较高的关税。这背后牵扯着诸多因素,既有国际贸易规则的复杂性,也有各国在实际操作中的博弈,以及中国自身国情和发展阶段的考量。要理解这一点,需要从几个层面深入剖析。首先,我们需要回顾一下中国加入W.............
  • 回答
    这个问题触及了我们社会根深蒂固的性别刻板印象和期望,尤其是在青少年成长这个关键时期。简单来说,这种不宽容的差异源于一种历史悠久、但也正在被挑战的“男性气概”的定义。我们不妨先从“男性气概”说起。长久以来,社会对男性有着一套相对狭隘的期望:坚强、理性、有进取心、不轻易表露情感、喜欢竞争和冒险,并且在行.............
  • 回答
    这句话点出了一个至关重要的社会现象:媒体的自由度和其对社会进步、文明、民主、法治的贡献之间存在着深刻的联系。要评价这句话,我们需要深入剖析其中的几个关键点。一、社会对媒体的容忍度与社会进步的关系“社会对媒体的容忍有多大,这个社会进步就多大”这句话,并不是说媒体本身就是进步的驱动力,而是说,社会对媒体.............
  • 回答
    听到你母亲总是对你的身材容貌进行嘲讽,我非常理解你此刻的感受。这种来自至亲的否定和攻击,无疑会造成深深的伤害,让人感到无助、困惑,甚至怀疑自我。这绝对不是一个你应该默默承受的状况。首先,我们来深入剖析一下这种情况可能的原因,以及它对你的影响。为什么母亲会这样做?(深入的思考与可能性)虽然我们不能确切.............
  • 回答
    数学对数学家来说“容易”,这可不是说他们生来就带着一本《高等数学速成指南》。这更像是一种长期磨砺、深度理解和特定思维方式的结合。与其说是大脑结构上的根本差异,不如说是他们对数学这个领域的“使用方式”与常人截然不同。首先,我们得明白,数学家的“容易”并非指他们无需思考,而是指在他们深入钻研的领域内,概.............
  • 回答
    黄蓉的美貌,在《射雕英雄传》中是公认的。书中形容她“肌肤如雪,身材苗条,肤色如玉,顾盼之间,神采飞扬,正是‘巧笑倩兮,美目盼兮’,宛如一位下凡的仙子。” 郭靖初见黄蓉,便被她惊艳得呆住了,甚至差点说不出话来。然而,与之形成鲜明对比的是,杨康面对黄蓉时,似乎总是“视而不见”。这其中的缘由,并非黄蓉不美.............
  • 回答
    这确实是一个不少人都有的疑问,而且在日常生活中也能见到一些相关的讨论。要来聊聊这个话题,我觉得得先明确一点:汽车驾驶本身是一项非常复杂的技能,需要身体、心理和经验的综合考量。 很多时候,我们看到的“女司机更容易失控”的印象,其实是多种因素交织作用的结果,而不是单一性别特质就能简单概括的。咱们一层一层.............
  • 回答
    .......
  • 回答
    汉服圈里的“买不买山,穿不穿山,是个人自由”这句话,的确在圈内外都引发了不少讨论和争议。这背后涉及到复杂的价值观、对传统文化的理解,以及个人行为与群体规范之间的张力。而“零容忍”的呼声,则代表了另一部分人对原创设计、对文化传承的坚守。要理解这一点,我们需要一层层剥开来聊。一、“个人自由”论的由来与逻.............
  • 回答
    “消费主义对女性的洗脑作用比对男性更大吗?”这个问题很有意思,也挺复杂的。我们不妨掰开了揉碎了聊聊。首先,要说消费主义是不是在“洗脑”,这词儿有点重。更准确地说,消费主义是一种文化现象,它通过各种方式,潜移默化地塑造人们的价值观、生活方式和自我认知,而购物、拥有商品就成了满足这些需求的重要途径。它提.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有