Oop OO:维护相关对象之间一致性的好方法

Oop OO:维护相关对象之间一致性的好方法,oop,consistency,Oop,Consistency,我有两个类,服务器和应用程序,它们之间有多对多的关系:一个服务器可以运行多个应用程序,一个应用程序可以跨多个服务器运行。第三个类Host表示单个服务器上的单个应用程序,包括对应用程序和服务器对象的引用,以及其他数据,如服务器上应用程序使用的磁盘空间量。服务器和应用程序对象都包含其所有主机的列表:因此,应用程序知道主机,主机知道应用程序,服务器知道主机,主机知道服务器 我的项目的目的是制定将大量应用程序迁移到新服务器的时间表。最初,每个应用程序都有一个迁移开始和迁移结束日期。一些应用程序还具有虚拟

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

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

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

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


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

一旦进入第三段,情况就复杂了

我将使用以下设计原则

  • 使应用程序、服务器和主机对象包含所需的最低行为和状态
  • 例如,应用程序对象可能包含开始日期、结束日期以及虚拟化开始和虚拟化结束日期。考虑是否需要包含服务器列表?还是主机的实例

  • 然后考虑一个像这样的小框架

    a) MigrationManager使用列表完成整个迁移过程

  • b) MigrationContext将为迁移过程合成信息

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

    迁移管理器获取调度程序的实例并安排迁移

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

    重要的是要记住

  • 关注点分离
  • 代码的可重用性:例如,您的应用程序对象可能不需要占用整个迁移过程。相反,这些事情可以由另一个对象完成
  • (这个答案是基于我的高层次理解和可能是错误的假设。但我认为您可能会得到一些构建应用程序以满足要求的方向)

    我还有一个建议。使用建模工具,如StarUML或ArgoUML,以图形形式表达您的想法。这将有助于所有成员很快进入问题


    感谢

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