【问题标题】:Role of model in MVC text editor scenario模型在 MVC 文本编辑器场景中的作用
【发布时间】:2010-09-05 23:24:38
【问题描述】:

我设计一个电影脚本编辑文本编辑器是为了好玩,并尝试学习一些有关低级 UI 设计的知识。剧本的格式非常简单,按照长期以来的标准,完全是用 12pt 快递写成的。所以我的印象是设计一个编辑器相当简单,只有一种字体和字体大小,没有特殊的格式。

我热衷于保留语义信息——例如,我希望将场景标题存储为场景标题,而不仅仅是格式化为场景标题的文本。

脚本中所需的更改跟踪使应用程序变得更加复杂。附加页面的顶部应该有修订信息,因此需要将文档存储为一组页面,并带有识别修订的适当信息。

将文档作为与视图分开的对象似乎是有意义的,然后根据视图中的输入调用文档对象上的方法来添加文本等。但是,哪个对象负责分页?起初我猜我会说文档,但分页似乎是一个演示文稿。文档使用图形文本 API 来测量字符串并计算出它们占用了多少空间也是没有意义的。但是,如果由视图决定,这在理论上很容易与它在文档中的存储方式发生冲突。那么最好的解决方案是什么?

我有丰富的编程经验,但对从头开始绘制我自己的用户控件的细节几乎没有任何关系。我也故意避免将其与特定语言联系起来,但我很可能会用 C# 或 C++ 编写。

感谢您的宝贵时间。

【问题讨论】:

    标签: c# c++ user-interface


    【解决方案1】:

    IMO 视图或模型都不负责分页。这就是 MVC 范例中控制器的工作。当然你会有一些东西来代表视图中的寻呼机,但控制器的实际工作是控制有多少记录被发送到视图。

    当然,pager 类本身是一个模型,但它的实例化应该在控制器中。

    【讨论】:

    • 好的,但是只有视图才能确定文本有多大,因此页面可以容纳多少?
    • 当您说“大”时,您是指字体大小还是文本长度?
    • 每个字符的尺寸 - 我会从 Graphics.MeasureString 或类似的东西中找到这个,它只对视图可用。
    【解决方案2】:

    但是,如果由视图决定, 这在理论上容易发生冲突 以及它是如何存储在 文件

    为什么?文档是数据,带有一些语义信息。您在页面上显示的数据中有多少不是您想要存储在文档中的。

    让您的文档完全不考虑页码、页面大小或页面上的内容,您将能够将所有演示逻辑保留在您的视图中。

    想想 HTML 和您的浏览器之间的关系 - HTML 对页面、如何查看、如何打印等等一无所知。

    【讨论】:

    • 是的,但是存储此类信息的必要性正是我的观点——文档大概需要存储页面信息,以便存储有关已更改或已插入的页面的信息原来的版本,不是吗?
    • 文档应存储有关其内容的信息。页面不是内容。更改跟踪不应围绕页面进行。问自己这个问题——如果我在文档开头插入半页文本会发生什么。这是否意味着您在文档的每一页上都发生了更改?还是您只是更改了文档的数据,而 View 类调整了该数据的显示方式?想想 Microsoft Word - 以及当您将视图更改为无页面布局时会发生什么。
    【解决方案3】:

    如果“页面”的概念实际上是需要与其余数据保持一致的数据,而不管它是如何查看的,那么我会投票支持它进入模型。这是非正统的,这是肯定的。但是您在描述中暗示“页面”是数据的实际实体。如果是这种情况,那么页面模型应该知道它需要了解的关于自身的所有信息,包括它可以容纳多少文本(鉴于您的数据模型假设/需要特定的字体来显示,这应该不是非常困难......这需要以某种方式从模型内部强制执行,我不确定如何)。

    这听起来不像是视图真正决定如何显示页面,但在这种情况下显示的要求是业务逻辑。视图只是根据这些要求处理实际显示。

    关于这个主题的标准想法是“如果它是关于显示的,它不属于模型。”但每条规则都有例外。如果存储的数据是排版数据,那么模型别无选择,只能知道一些直观感觉像是显示的东西。您会希望在 cmets 等中很好地记录它,但这听起来像是直觉规则的一个很好的例外情况。

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 2017-02-22
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多