0

我有两个类,Server 和 Application,具有多对多的关系:一个服务器可以运行多个应用程序,一个应用程序可以跨多个服务器运行。第三个类 Host 表示单个服务器上的单个应用程序,包括对 Application 和 Server 对象的引用以及其他数据,例如服务器上的应用程序使用的磁盘空间量。Server 和 Application 对象都包含其所有主机的列表:因此,应用程序了解主机,主机了解应用程序,服务器了解主机,主机了解服务器。

我的项目的目的是制定将一堆应用程序迁移到新服务器上的时间表。最初,每个应用程序都有一个迁移开始日期和迁移结束日期。一些应用程序还具有虚拟化的开始和结束日期。如果迁移不能在应用程序的限制内执行(不管这些是什么),就会发生虚拟化。它发生在迁移之前并将应用程序从其约束中释放出来。Application 对象持有一个名为“Schedule”的对象,其中包括这 4 个日期以及一个表示是否要虚拟化的布尔标志,以及一个包含迁移所需工时的“月”列表(或虚拟化)每个特定月份的应用程序。

我们现在希望允许服务器在指定日期单独进行虚拟化。这些服务器上的所有应用程序(或部分应用程序,即主机)将在该日期进行虚拟化;它们将与应用程序的其余部分一起迁移。我们最初决定让服务器类拥有自己的 Schedule 对象。然后在服务器中设置虚拟化日期。但是,我们决定要保持服务器和应用程序计划的一致性 - 例如,服务器计划的迁移开始日期和结束日期应分别设置为在该服务器上运行的所有应用程序的最早开始日期和最晚结束日期服务器。这意味着每次更新应用程序日期时,我们都必须记住更新其所有服务器日期(通过主机对象)。或者,如果我们想更新应用程序'

然后我们考虑在每个 Host 对象中放置一个 Schedule 对象。这解决了一致性问题,但导致了相当多的冗余:因为属于应用程序的所有主机对象都必然具有相同的迁移日期(但可能是不同的虚拟化日期),当您为应用程序设置迁移日期时,您有为每个主机设置相同的日期。此外,在某些情况下,我们需要计算出服务器和应用程序的最早开始日期和最晚结束日期,如上所述。这将涉及:在每个应用程序和服务器对象中保存此数据(有效地为每个对象提供自己的调度,从而带回一致性问题),或者:通过循环在每次需要时动态计算此数据通过所有主持人的日程安排。应用程序每月所需的工时也是如此,它是在应用程序级别计算的,每个主机每月分成几小时,然后在我们需要在应用程序级别再次计算时重新计算。正如您所料,这丝毫没有效率。

这不是一个简单的问题,但我想知道是否有任何公认的策略来处理这种情况。提前抱歉我的帖子冗长;希望我已经把情况说得够清楚了。

4

2 回答 2

1

一旦我们进入第三段,这很复杂

我将使用以下设计原则

  1. 保持应用程序、服务器、主机对象包含最低要求的行为和状态。

例如,应用程序对象可能包含开始日期、结束日期以及虚拟化开始和虚拟化结束日期。想想它是否需要包含服务器列表?或主机实例?

  1. 然后想想像这样的小框架作品。

    a) MigrationManager 使用 List 完成迁移的完整过程

b) MigratioContext 将为迁移过程合成信息。

c) ErrorContext 将复合错误和异常处理

Migration Manager 获取 Scheduler 的实例并安排迁移

通过这种方式,我们可以围绕核心业务对象和业务逻辑逐步演化出一种框架类的东西。

重要的事情要记住

  1. 关注点分离。
  2. 代码的可重用性:例如,您的 Application 对象可能不需要捆绑整个迁移过程。相反,这些事情可以由另一个对象来完成

(此答案基于我的高级理解和可能错误的假设。但我认为您可能会得到一些指导来构建应用程序以满足要求)

我还有一次建议。使用 StarUML 或 ArgoUML 等建模工具将您的想法以图片形式呈现。这将有助于所有成员快速进入问题。

谢谢

于 2012-09-18T10:52:38.813 回答
0

我认为面向对象编程的一个基本原则是,在可能的范围内,状态的每个可变方面都应该始终有一个明确定义的所有者(该所有者可能反过来又被另一个实体所拥有,这由另一个实体转等)。其他对象和实体可能持有对该可变状态的引用,但任何此类引用都应该从所有者的角度来考虑。例如,如果一个方法接受一个对集合的引用并且应该填充它,那么该方法不会考虑操作它拥有的集合,而是考虑操作其他人拥有的集合,因为该实体的利益。

有时需要有不同的对象来拥有应该是相同可变状态的单独副本。这种情况经常出现在图形用户界面之类的事物中,其中对象可能“拥有”对象的旋转角度,但显示控件可能需要缓存该对象在其当前方向上的私有渲染。在一个对象被指定为绝对主控的情况下,这种情况的处理可能会大大简化,并且它会通知其他对象其状态。如果有多个对象,其中没有一个具有独占所有权,但所有对象都应该保持同步,这将非常复杂。

如果您可以使用您的模型以便不需要复制任何状态,我强烈建议您这样做。然而,至关重要的是,您的模型能够代表所有感兴趣的场景,包括两件本应处于相同状态的事物可能不处于相同状态的可能性。最重要的是,状态的每个方面都有明确定义的所有权链,因此当状态的某个方面发生变化时,可以说出谁的状态受到影响。

于 2013-01-20T22:05:55.650 回答