Model view controller 以用户界面为中心的应用程序上的独立演示

Model view controller 以用户界面为中心的应用程序上的独立演示,model-view-controller,architecture,separation-of-concerns,Model View Controller,Architecture,Separation Of Concerns,我很难为这种应用程序找到正确的体系结构:它是一个图表应用程序,类似于MSVisio。这些关系图用于生成数据,这些数据被传递到另一个应用程序 在设计应用程序时,我一直尝试使用分层,但现在我无法决定在数据与表示紧密耦合的情况下如何进行分层。例如,画布中的某个对象具有(X,Y)数据,该数据仅用于表示目的,但必须像域数据一样存储 我哪里弄错了?我很确定我从一个错误的角度看这个问题,但我无法找到正确的角度 再次感谢 更新: 我也知道,在这种情况下,也许我不应该将UI和域分开。如果是这样的话,请给我一些关于

我很难为这种应用程序找到正确的体系结构:它是一个图表应用程序,类似于MSVisio。这些关系图用于生成数据,这些数据被传递到另一个应用程序

在设计应用程序时,我一直尝试使用分层,但现在我无法决定在数据与表示紧密耦合的情况下如何进行分层。例如,画布中的某个对象具有(X,Y)数据,该数据仅用于表示目的,但必须像域数据一样存储

我哪里弄错了?我很确定我从一个错误的角度看这个问题,但我无法找到正确的角度

再次感谢

更新:


我也知道,在这种情况下,也许我不应该将UI和域分开。如果是这样的话,请给我一些关于何时应用分离和何时不应用分离的合理信息。

您可以尝试实现某种视图模型,以保存对象的当前布局。这样,x/y值与对象id一起存储在布局文件中,而纯模型数据则存储在其他位置


也许这会有所帮助,

您可以尝试实现某种视图模型,以保存对象的当前布局。这样,x/y值与对象id一起存储在布局文件中,而纯模型数据则存储在其他位置


也许这会有点帮助,

我认为你需要确保将“什么”和“如何”分开。您显示的是抽象的、坐标集和形状类型。你如何展示它是非常具体的。我要确保域模型只处理什么,而视图层只处理如何处理。在不了解更多应用程序的情况下,很难深入了解具体情况。

我认为您需要确保将“是什么”和“如何”分开。您显示的是抽象的、坐标集和形状类型。你如何展示它是非常具体的。我要确保域模型只处理什么,而视图层只处理如何处理。在不了解更多应用程序的情况下,很难了解细节。

在图表工具中,形状的x/y位置是域数据的一部分(形状的位置是图表的一部分-没有它,你无法绘制图表),使用这些x/y坐标并在屏幕上绘制形状的代码是表示层的一部分

我知道有些人认为只用于显示的数据应该单独保存,但在我曾经处理过的每个单独保存数据的项目中,这变成了一个巨大的维护和支持噩梦

在一个简单的图表工具中(如果该工具只是绘制和编辑图表,而没有任何基于图表的奇特处理),没有业务逻辑,只有绘制和编辑图表(属于表示层)和图表数据(即域模型)的代码

如果没有业务逻辑,通过为域和表示使用一组单独的对象,您将不得不复制所有模型数据两次(一次在模型对象中,一次在表示对象中),并且将业务逻辑与表示分离不会带来任何好处(因为没有)

另一方面,如果在数据上运行了一些算法,那么通过将图形数据与绘图代码分离,您确实可以获得一些好处—您可以在工具之外运行该算法,您可以进行更好的自动化测试,等等

此外,如果编写的另一个系统使用相同的数据,则如果将模型定义和图形代码分开,则至少可以共享模型定义和保存/加载代码

那么,让我们总结一下:

  • 所有图表数据都是模型的一部分(包括仅用于表示目的的数据)

  • 任何吸引到屏幕或处理用户输入的东西都在表示层(显然)

  • 如果这两个方面涵盖了您的所有代码和数据,那么您的应用程序就没有任何“业务逻辑”,层分离可能是过火了

  • 如果您有任何代码不适合这两个类别,并且您认为它应该是模型的一部分,那么您应该构建两个独立的层

  • 如果系统之间有任何代码共享的机会,您应该确保共享的代码没有与表示代码混合在一起

  • 还有最后一个“奖金”要点-如果这是一个项目,可能会在很长一段时间内积极开发,并在将来添加新功能-您可能希望分离UI/数据,只是为了使将来的工作更容易-您必须决定现在是否值得在将来节省额外的时间,以及这种分离是否真的有可能在将来有所帮助


在绘图工具中,形状的x/y位置是域数据的一部分(形状的位置是图表的一部分-没有它您无法绘制图表),使用这些x/y坐标并在屏幕上绘制形状的代码是表示层的一部分

我知道有些人认为只用于显示的数据应该单独保存,但在我曾经处理过的每个单独保存数据的项目中,这变成了一个巨大的维护和支持噩梦

在一个简单的图表工具中(如果该工具只是绘制和编辑图表,而没有任何基于图表的奇特处理),没有业务逻辑,只有绘制和编辑图表(属于表示层)和图表数据(即域模型)的代码

如果没有业务逻辑,通过为域和表示使用一组单独的对象,您将不得不复制所有模型数据两次(一次在模型对象中,一次在表示对象中),并且您将无法获得任何优势