Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 对于依赖于两种主要类型(或其子类型)的行为,以最通用的方式进行建模的最佳体系结构是什么? 我想让你们考虑一个土木工程应用,其目的是检测哪些元素称为“强>交叉>/强”,穿过墙内的某些“强>洞>/强”。最终目标是将交叉点列表与每个孔元素相关联_Design Patterns_Architecture - Fatal编程技术网

Design patterns 对于依赖于两种主要类型(或其子类型)的行为,以最通用的方式进行建模的最佳体系结构是什么? 我想让你们考虑一个土木工程应用,其目的是检测哪些元素称为“强>交叉>/强”,穿过墙内的某些“强>洞>/强”。最终目标是将交叉点列表与每个孔元素相关联

Design patterns 对于依赖于两种主要类型(或其子类型)的行为,以最通用的方式进行建模的最佳体系结构是什么? 我想让你们考虑一个土木工程应用,其目的是检测哪些元素称为“强>交叉>/强”,穿过墙内的某些“强>洞>/强”。最终目标是将交叉点列表与每个孔元素相关联,design-patterns,architecture,Design Patterns,Architecture,交叉口可以是许多子类型(管道、风道、设备等),也可以是孔(圆形、矩形、“L”形、多边形等)。检测给定的交叉是否通过孔的算法取决于孔和交叉子类型。注意,在开发开始时,并非所有的交叉和孔子类型都已知 考虑到可能的数量、要实现的不同算法及其不同程度的复杂性,应用程序体系结构应允许添加较新的算法和洞/交叉子类型,而无需付出太多努力 由于检测算法同时依赖于孔和交叉口,因此将计算方法(算法)构建在其中一个内似乎是人为的。这也适用于从这些主要类型派生的任何可能的子类型 事实上,并不是所有涉及的对象的确切子类型

交叉口可以是许多子类型(管道、风道、设备等),也可以是孔(圆形、矩形、“L”形、多边形等)。检测给定的交叉是否通过的算法取决于交叉子类型。注意,在开发开始时,并非所有的交叉子类型都已知

考虑到可能的数量、要实现的不同算法及其不同程度的复杂性,应用程序体系结构应允许添加较新的算法和/交叉子类型,而无需付出太多努力

由于检测算法同时依赖于交叉口,因此将计算方法(算法)构建在其中一个内似乎是人为的。这也适用于从这些主要类型派生的任何可能的子类型

事实上,并不是所有涉及的对象的确切子类型(交叉)都是事先知道的,这让我想到了工厂DP。然而,在这里尝试应用工厂DP时,对子类型(“检测算法”)的行为依赖不知何故使我感到困惑

我还考虑将“检测算法”作为一个独立的对象。然后,一种“工厂”可能负责根据特定的/交叉对发布给定的“计算方法”。然而,由于所涉及的算法的复杂性,我担心这个“工厂”的实现可能会变成一群愤怒的古代长毛猛犸象

总而言之,我的两个主要问题是:

  • 我应该如何对两种“明显”的主要类型(交叉)及其多个主要未知亚型之间的区别进行建模
  • 我应该如何为“检测算法”建模
回答这些问题时应记住,将来应容易添加更多的交叉点,以及它们各自的算法

有谁能帮我找出一个优雅的解决方案来解决这个架构问题


谢谢

域的建模方式很大程度上取决于需要什么数据以及如何使用它。通过阅读你的问题,我得出以下结论,如果我错了,请随意评论。 -您将拥有一组算法,用于输入参数,分别为交叉。 -交叉点有多种不同类型,其中一些目前尚不清楚

首先要考虑的是,表示每种孔所需的信息是不同的。例如,圆孔和L形孔的信息不同,前者有中心和半径,而后者没有。对于交叉对象,这种情况也以类似的方式发生。因此,我们应该扪心自问,考虑到这些差异,什么才是最好的代表

如果我们在OOP模型中对此进行建模,可能会想到一种基于基类+继承的方法。然而,有两个警告,第一个是,正如@Lini交叉点/孔所指出的,它们没有表现出行为,它们是简单的数据。第二,基类不会与子类共享属性,因为每种交叉/洞都由不同的属性表示,访问器方法也是如此,所以我们会有一个空基类,其全部目的是了解对象是交叉的子类型还是洞的子类型。根据您使用的语言,这种方法可能是强制性的,我认为这也不是一种糟糕的方法

如果您使用Clojure之类的函数式语言,则可以将交叉点和孔建模为字典,其中有两个字段表示类型和子类型,从而允许使用标准函数访问和修改数据。最后,在这两种情况下添加新的子类型都很容易

第二件事是,可能的配对数量可能会非常高,因此您需要一种方法来组织算法,并决定每个配对应该以一种允许轻松处理新子类型的方式调用哪个配对。就个人而言,我不喜欢将检测算法作为一个类,因为它是一个数据处理的东西,而不是数据本身(我在这里有点纯粹:)。我的方法是,这是动态调度函数。总体思路如下:

  • 创建所有必要的算法来处理每个配对。如果一个算法可以处理多个交叉点或孔,您也可以这样做
  • 创建一个配对函数来执行配对过程,该过程将返回一个关键字,该关键字用于了解要调用的检测算法
  • 创建多重方法。它将接受任何一对交叉点和孔,然后调用配对,最后根据配对结果分派到相应的算法
使用这种方法,每个算法都是孤立的,添加新算法只需要在配对和匹配中添加一个新匹配即可
Alg1 :: (CrossA HoleA) --> Result
Alg2 :: (CrossA HoleB) --> Result
Alg3 :: (CrossB (Either HoleB HoleC)) --> Result
Pairing :: (Crossing Hole) --> Keyword
Detection :: (AnyCross AnyHole) --> result