提问人:Reverse Engineered 提问时间:11/15/2023 最后编辑:Reverse Engineered 更新时间:11/18/2023 访问量:77
同时支持 N 和 N-1 维关系的整体式应用程序是否有名称?这是反模式吗?
Does a monolithic application which simultaneously supports N and N-1 dimensional relations have a name? Is this an anti-pattern?
问:
我有一个数据库和应用程序,旨在处理正好 4 个维度的不同结构:分子、原子、粒子和夸克。在系统的各个层面都存在多对多关系,使用户能够重用各种分子中的原子、各种原子中的粒子等。
粒子必须始终属于原子,夸克必须始终属于粒子,等等。但是,这 4 种不同的模型不是子类型,并且不涉及遗传。
当应用程序加载时,它被设计为基于当前 Molecule 设置本地上下文。有数百种硬编码的方法、调用和数据库关系,它们假设系统的局部上下文由当前分子决定。当一个分子被加载时,它的所有原子、粒子和夸克也会被加载。该系统旨在假设每个分子都有 >= 1 个原子,其中有 >= 1 个粒子,其中有 >= 1 夸克。
我被要求调整系统,以便顶级上下文可以额外处理原子而不是分子。由于所有数据库关系和方法都假定 Atom 属于 Molecule,因此实现这一点需要在系统的每个点引入检查,以检查当前顶级对象是 Molecule 还是 Atom。
如果系统确实是任意多维的,而不是硬编码为 4 维(即,如果不是这四个命名维度,系统被设计为具有任意命名的对象,其中包含 n 个维度的对象),这可能是可行的。然而,该系统在一开始就被设计为处理这个问题(几乎就像一个基本的面向对象系统)。
然而,目前的系统最初被设计为永久地具有 4 层维度。系统的四个维度中的每一个都具有不同的名称和属性集。从数据库关系到前端 UI 的所有内容都经过硬编码以假设这一点。
我看到了两种潜在的解决方案;第一个似乎是一个很好的解决方案,第二个似乎是一个复杂的反模式:
只需创建一个一次性的“分子”,当原子需要位于本地表示上下文的顶层时。在后端,这将使我们能够在不对系统进行任何重大更改的情况下继续前进。在前端,我们也可以很容易地解决这个问题,因为在前端没有对 Molecule 的视觉引用——它仅用于为用户正在查看的 Atom 提供上下文,并且永远不会向用户显示。对于没有分子的原子,我们只需用它们包含的“一次性非分子”填充应用程序的顶层,然后继续我们的快乐之路。
尝试使系统处理原子处于顶层以及分子处于顶层的情况。不支持其他上下文,仅支持这两个上下文。这将需要对整个平台的系统架构进行重大改革,并引入各种难题。如果没有完全的重新架构,所有方法调用和数据库关系都必须检查系统的局部维度上下文(是 4 深还是 3 深?),然后根据它采取行动。我们一半的顶级方法调用会中断,因为它们会寻找不存在的东西,如果没有某种我不确定是否存在的巧妙解决方案,重要的最低级方法调用将永远无法实现。这尤其困难,因为原子和分子具有不同的属性。
这听起来像是一件非常困难的事情,因为它会破坏模式概念的整个概念。就像建造一个带孔的咖啡机一样,您可以在其中放置 Keurig 杯或倒入未研磨的咖啡豆。这毫无意义。
系统应设计为假设单个不同的维度级别或 N 个维度级别。一个设计用于处理 N 维和 N-1 维的系统似乎不必要地过于复杂。
这样一个同时支持 N 维和 N-1 维关系的系统有名称吗?
这是反模式吗?
答:
这样一个同时支持 N 维和 N-1 维关系的系统有名称吗?
不,至少我不知道,但事实上,IMO 你的假设是不正确的:你似乎将(概念)数据模型和具有这些关系的实体的层次结构这一事实与数据访问模式混为一谈,即可能发出的查询和命令,这确实不需要检索或触及整个数据层次结构才有意义。
目前的系统最初被设计为永久地具有 4 层维度。[...]这是反模式吗?
不,不是本身:在一个给定的数据模型和“就是这样”(这是一个概念要求,而不是技术要求)的领域中,用严格反映语义的固定数据和代码结构来实现固定语义确实是非常有意义的。
我被要求调整系统,以便顶级上下文可以额外处理原子而不是分子。
我也同意你应该选择你的选项 1,创建一个只包含该原子的“虚拟”分子,虚拟的,就像在数据库中没有具体一样。这不仅最大限度地减少了编码工作,而且完全符合预期的固定语义。
评论