【问题标题】:What does "monolithic" mean?“单体”是什么意思?
【发布时间】:2011-03-11 21:35:27
【问题描述】:

我已经在类的上下文中看到了它。我怀疑这意味着该类可以使用被分解为逻辑子单元,但我找不到一个好的定义。可以举一些例子吗?

感谢您的帮助。

编辑:我喜欢聪明的回复,但我显然指的是软件上下文中的“单片机”。我知道巨石、巨石、支石墓和所有与石头有关的背景。哎呀,我的国家已经够多了……

【问题讨论】:

  • monolithic的反义词是polylithic
  • 也可以有单体架构。在典型的企业解决方案中,它可以是:单个 Java WAR 文件、Rails 或 NodeJS 代码的单个目录层次结构link

标签: class oop programming-languages terminology


【解决方案1】:

如果您查看该词的词源,您会发现它来自希腊语 monos(单一)和 lithos(石头)。在您提到的软件上下文中,它描述了single-tiered application in which the code for the user interface and the data access are combined into a single program from a single platform

【讨论】:

    【解决方案2】:

    有趣的问题。我认为对于什么是单体类没有任何正式的定义,但你已经明白了。包含多个逻辑上未连接或无意义耦合的组件的类是单体类。

    如果您已阅读我强烈推荐的 The Pragmatic Programmer,您可以将单体类定义为一种反模式,该模式与该书中几乎所有内容都背道而驰。

    例如,您会在芯片和操作系统设计领域找到更多示例,其中有单片芯片/kernels 的正式定义,类似于单片类。以下是一些示例,尽管每个示例都可以反对列入此列表:

    1. JOGL - 用于 OpenGL 的 Java 绑定。这可能是有争议的,并且有充分的理由。
    2. 大多数学术项目 - 原因显而易见。

    如果您是独自开始编程,而不是加入团队,那么您很可能会打开您的第一个项目,并且会有一个单体类。

    【讨论】:

      【解决方案3】:

      “Monolithic”是has been used to flame succesful software 的一个术语。此链接揭示了该术语固有的假设及其有限的用处。

      基本假设是,如果系统由软件组件构建而成,每个组件都有单独的、明确定义的任务,则系统会更好地工作。直觉上,这似乎是对的。如果每个组件都工作,整个系统必须工作,对吗?

      实际上,这并不容易。一个更大的、组合式(非整体式)系统可能会错过一个关键功能,即使没有单个组件可以归咎于此。当架构设计未能将功能分配给任何特定组件时,就会发生这种情况。这可能会发生,特别是如果它是一个不能干净地映射到单个组件的函数。

      现在 Linux(继续链接的示例)实际上并不是单片的。它在单一内核之上有一个模块化的用户空间,一个带有许多独立实用程序的用户空间。 Except when it doesn't.

      【讨论】:

      • 明确的火焰诱饵。我很惊讶 5 年过去了,这是第一个评论。不确定这个答案是否能帮助读者理解什么是单体设计以及它的优缺点是什么。读到这里的人可能会认为你在争辩说单体设计从来都不是坏事,这当然是荒谬的。一个真正的单片操作系统设计需要有人希望为操作系统创建一个字处理器,以将所需的功能添加到内核代码中,这当然是完全荒谬的。
      【解决方案4】:

      这意味着某些东西与模块化相反。模块化应用程序可以具有被称为模块的部分,无需更换整个应用程序即可更换。而单片应用程序,在修复或升级某个部分后,必须全部替换。

      来自Wikipedia:“一般来说,模块化是可取的,因为它支持应用程序逻辑的部分重用,并且通过允许修复或更换应用程序的部分而不需要大规模更换来促进维护。”

      因此,在单体类的上下文中,它的所有功能都是独立的,如果您想向该类添加或更改某个功能,您需要更改/添加类中的代码并重新编译它。相反,模块化类公开对外部实现的功能的访问。例如,“Calculator”类可以使用单独的“Add”类来实际添加数字;从单独的库中调用“乘法”函数;甚至从 Web 服务调用“摊销”功能。只要这些功能部分中的每一个都可以从类外部进行更改,它就是模块化的。

      【讨论】:

        【解决方案5】:

        我对软件开发中的单体设计的定义是一种需要将附加功能添加到单个不可分割代码块的设计。

        专业版:

        • 一切都在一个地方,因此很容易找到
        • 可以更简单,因为要考虑的关系更少(也可以更复杂,请参阅缺点)

        缺点:

        • 随着时间的推移,随着功能的增加,系统的复杂性可能会呈指数级增加,以至于新功能极难实现或不可能实现
        • 可能使多个开发人员难以使用,例如,实体框架 EDMX 文件将整个数据库放在一个文件中,这对于多个开发人员来说可能极其困难。
        • 可重用性降低,根据定义,它没有更小的组件,这些组件可以被重用并重新用于解决其他问题,除非制作了完整的代码副本然后修改。

        【讨论】:

          【解决方案6】:

          单体架构是一种软件结构模型,它被创建为一个整体,其中所有 Rails 工具(ActionMailer、ActiveJob、ActionCable 等)可以与这些工具应用的代码一起收集。这些工具没有相互连接,但它们也不是自治的。

          如果一个特性需要改变,它会影响整个流程的工作和其他特性,因为它们是一个流程的一部分。

          让我们回顾一下 Ruby on Rails 是什么,它可以提供什么,它的优点和缺点。它最重要的好处是易于使用。

          如果您编写 rails new,您会立即获得一个新应用程序,然后您可以创建任何您想要的 REST API 并使用 Rails 帮助器和生成器,这使得开发更加容易。

          如果您需要在 Rails 应用程序中发送电子邮件,请使用 Rails ActionMailer。当你需要做一些硬处理时,ActiveJob 会帮助你。使用 Rails 5,您还可以使用开箱即用的 websockets。因此,创建聊天或使您的应用程序更具交互性将很容易。

          如果您使用正确的 DSL 语法,您可以使用所有这些,甚至更直接。此外,您不必完全了解这些工具的内部实现,将其视为 DSL,并获得预期的结果。

          【讨论】:

            猜你喜欢
            • 2016-08-21
            • 2011-10-02
            • 1970-01-01
            • 2017-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-12
            • 2017-06-11
            • 2018-03-05
            相关资源
            最近更新 更多