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