【问题标题】:Is having a lot of data fields a bad thing?拥有大量数据字段是一件坏事吗?
【发布时间】:2011-07-22 10:27:11
【问题描述】:

在 Java 中,在一个大约 1000 行的类中拥有大约 50 个数据字段是一件坏事吗?

编辑:感谢您的反馈。真的让我大开眼界,我将尝试将功能委托给更多类,而不是拥有一个无所不能的类。 :)

【问题讨论】:

  • 我们甚至需要一些代码才能开始做出决定。
  • 我现在明白了。我想我已经知道我需要做什么了。

标签: java field


【解决方案1】:

这个问题很模糊。答案可以是肯定的,也可以是否定的。是的,如果您可以将功能清晰地分解为更多类,那将是一件坏事。不,如果课程重点突出,这不是一件坏事,而你获得 50 个字段的唯一原因是因为你需要它们。

例如,我有一个包含 70 个字段的 900 行的类,但那是因为该类实现了一点人工智能,并且 AI 算法使用的参数是很多行为和阈值,需要在那里定义,所以那个孩子班调整他们。就我而言,我会说它不是一个糟糕的架构,我 14 年的软件开发似乎也同意:-)。

当然,如果课程超过 1000 行,我可以将其进一步分解为 2:运动 AI 和攻击 AI,但就目前而言,在我的项目中将它们放在一起确实很有意义,因为运动 AI和攻击AI永远不会独立应用:它们一起工作,它们应该属于同一类。如果我必须制作一个只需要移动 AI 的对象,那么无论如何,我会把它分成 2 个。

【讨论】:

  • 棘手的问题。我们甚至需要一些代码示例才能开始回答它::-)。
  • +1 以获得好的答案(尽管我暗中希望您因编写 900 行课程而过早死亡)。
  • 实际上我承认我可以将它分成 2 部分,但这并不严重(我可以将人工智能分成 2 部分 - 移动和攻击)。你总是可以把东西分成更多的部分,但有时这可能会导致另一个问题:类碎片。如果你认为这是我发明的,那是因为我做到了。当您将代码分解得如此之多时,实际上会使其更难管理。我尽量不被软件中一些更激进的趋势所左右,例如“一个类可能不超过 10 个字段”(代码完整)。如果你最终得到了太多的类,那就一样糟糕了。
【解决方案2】:

来自代码完成:

对包含超过大约七个数据成员的类持批评态度:数字“7±2”已被发现是人们在执行其他任务时可以记住的一些离散项目(Miller 1956)。如果一个类包含超过大约七个数据成员,请考虑是否应该将该类分解为多个更小的类(Riel 1996)。如果数据成员是整数和字符串等原始数据类型,您可能会更倾向于 7±2 的高端,如果数据成员是复杂对象,则更倾向于 7±2 的低端。

【讨论】:

  • 我认为这被夸大了。 9个领域是疯狂的。当您上太多课程时,您可能会遇到这样的情况,然后再一次,这很糟糕 ::- )。我认为你需要在你的项目中找到平衡,而不是痴迷于遵循一些人在 30 年前写的一些规则,当时软件开发有很大的不同。
  • 当然,这是一个经验法则,并非针对每种情况都严格准确或可靠。但是,在大多数情况下,它有助于评估设计。
  • 同意,这是愚蠢的。字段的数量应该以凝聚力的原则为指导,而不是根据人们能记住多少的任意数字。
  • 另一个问题是,如果你执着于这样的规则,你可能会得到太多的类,然后更糟::-)。
【解决方案3】:

是的,这是一种代码异味,会使您的代码更难阅读和修改。你的班级将成为God object

Jeff 有一篇很好的文章,我们都应该阅读。

【讨论】:

  • 上帝对象。不知道那个,这是一个很好的命名法。但要小心,并非所有“大类”都是代码异味。编程很像建筑:要建造一座大建筑,有时需要大的混凝土板,而不仅仅是小螺丝和家具::-)。
【解决方案4】:

听起来很糟糕,但谁知道呢。你可能实际上已经找到了一个需要 50 个字段的对象,所有这些字段都是相互关联的,并且需要在一个对象中。

如果不是,为了保持理智,请尽可能将其拆分为更小的部分。

【讨论】:

    【解决方案5】:

    短篇小说;是的。很长的故事;这是非常主观的。一个有 1000 行的类似乎非常过分。所有这些领域真的相关吗?一个班级应该集中注意力(表现出高凝聚力)。尝试将您的领域拆分为更小、更集中的类。

    【讨论】:

      【解决方案6】:

      我认为不好的是有一个大约 1000 行的类...尝试重构它以使其尽可能小...

      【讨论】:

        【解决方案7】:

        不一定,但这通常意味着你的类应该被分成几个类,因为它正在做很多事情,或者你的类承担了应该在其他类中的职责。这取决于您的应用程序的设计。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-19
          • 1970-01-01
          • 2010-09-21
          • 2015-10-27
          • 2013-11-19
          • 2010-09-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多