我有两个类,Server和Application,具有多对多关系:一个服务器可以运行多个应用程序,一个应用程序可以跨多个服务器运行。第三个类Host表示单个服务器上的单个应用程序,包括对application和server对象的引用以及应用程序在服务器上使用的磁盘空间量等附加数据。Server和Application对象都包含其所有主机的列表:因此,应用程序了解主机,主机了解应用程序,服务器了解主机,主机了解服务器。
我的项目的目的是制定出将一堆应用程序迁移到新服务器上的时间表。最初,每个应用程序都有一个迁移开始日期和迁移结束日期。一些应用程序也有虚拟化的开始和结束日期。如果迁移不能在应用程序的约束范围内执行,就会发生虚拟化(不管这些约束是什么)。它发生在迁移之前,并将应用程序从其约束中解放出来。名为'Schedule‘的对象由Application对象持有,该对象包括这4个日期以及一个布尔标志,用于说明是否要虚拟化它,以及一个’月‘列表,该列表包含在每个特定月份迁移(或虚拟化)应用程序所需的工时。
我们现在希望允许服务器在指定的日期单独进行虚拟化。这些服务器上的所有应用程序(或应用程序的一部分,即主机)将在这一天虚拟化;它们将与应用程序的其余部分一起迁移。我们最初决定让服务器类拥有自己的Schedule对象。然后在服务器中设置虚拟化日期。但是,我们决定要保持服务器和应用程序计划的一致性-例如,服务器计划的迁移开始日期和结束日期应分别设置为该服务器上运行的所有应用程序的最早开始日期和最晚结束日期。这意味着每次我们更新应用程序日期时,我们必须记住更新它的所有服务器日期(通过主机对象)。或者,如果我们想要更新特定月份的应用程序的工时,我们还必须更新服务器的工时。
然后我们考虑在每个Host对象中放置一个单独的Schedule对象。这解决了一致性问题,但导致了相当多的冗余:由于属于应用程序的所有主机对象都必须具有相同的迁移日期(但可能具有不同的虚拟化日期),因此当您为应用程序设置迁移日期时,您必须为每个主机设置相同的日期。此外,在一些情况下,我们需要计算服务器和应用程序的最早开始日期和最晚完成日期,如上所述。这将涉及:将此数据保存在每个应用程序和服务器对象中(有效地为每个应用程序和服务器对象提供自己的调度,从而带来一致性问题),或者:通过循环所有主机的调度,在每次需要时动态计算此数据。应用程序每月所需的工时也是如此,它是在应用程序级别计算的,每月分成每个主机的小时数,然后当我们需要在应用程序级别再次计算时重新计算。正如您所期望的,这是一点也不高效的。
这不是一个直截了当的问题,但我想知道是否有任何可以接受的策略来处理这种情况。为我的帖子冗长而提前道歉;希望我已经把情况说得足够清楚了。
发布于 2012-09-18 10:52:39
一旦我们进入第三段,这就很复杂了。
我将使用以下设计原则
例如,应用对象可以包含开始日期、结束日期以及虚拟化开始日期和虚拟化结束日期。想一想它是否需要包含服务器列表?还是Host的实例?
,
a)使用List执行完整迁移过程的MigrationManager
b) MigratioContext将为迁移过程合成信息。
c) ErrorContext将组合错误和异常处理
迁移管理器获取Scheduler的实例并安排迁移
通过这种方式,我们可以围绕核心业务对象和业务逻辑逐步发展出一种框架。
重要的是要记住
来完成
(这个答案是基于我的高级理解和可能是错误的假设。但我认为您可能会得到一些指导来构建应用程序以满足需求)
我再提一次建议。使用StarUML或ArgoUML等建模工具将您的想法以图形化形式呈现出来。这将帮助所有成员非常快地进入问题。
谢谢
发布于 2013-01-20 22:05:56
我认为面向对象编程的一个基本原则是,在可能的范围内,状态的每个可变方面在任何时候都应该只有一个定义良好的所有者(该所有者可能恰好属于一个其他实体,而该实体又被另一个实体转而拥有,等等)。其他对象和实体可能包含对该可变状态的引用,但任何此类引用都应该从所有者的角度来考虑。例如,如果一个方法接受对一个集合的引用,并且应该填充该集合,则该方法不会考虑对其拥有的集合进行操作,而是为了该实体的利益而对其他人拥有的集合进行操作。
有时,有必要让不同的对象拥有不同的副本,这些副本应该是相同的可变状态。这种情况经常出现在图形用户界面中,其中对象可能“拥有”对象的旋转角度,但显示控件可能需要在其当前方向上缓存该对象的私有呈现。在一个对象被指定为绝对主对象的情况下,这种情况的处理可以大大简化,并且它保持向其他对象通知其状态。如果有多个对象,这将非常复杂,这些对象都不具有独占所有权,但所有这些对象都应该彼此保持同步。
如果你能让你的模型不需要复制任何状态,我强烈建议你这样做。然而,至关重要的是,您的模型能够表示所有感兴趣的场景,包括两个本应处于相同状态的事物可能不是这样。最重要的是,状态的每个方面都有一个定义良好的所有权链,因此当状态的一个方面发生变化时,可以说谁的状态受到了影响。
https://stackoverflow.com/questions/12468252
复制相似问题