我在Sketch示例AppKit应用程序(在/ Developer/Examples/AppKit/Sketch中找到)中将类定义为模型或视图时有点困惑.SKTRectangle,SKTCircle等类被认为是Model类,但它们具有绘图代码.
我的印象是模型应该没有任何视图/绘图代码.
有人可以澄清一下吗?
谢谢.
Sketch的开发人员在自述文件中略微概述了他/她的基本原理:
模型 - 视图 - 控制器设计
Sketch的Model层主要是SKTGraphic类及其子类.Sketch Document由SKTGraphics列表组成.SKTGraphics主要是数据承载类.每个图形都保留了表示任何图形所需的所有信息.SKTGraphic类定义了一组用于修改图形的基本方法,一些子类添加了自己的新原语.SKTGraphic类还定义了一些用于修改图形的扩展方法,这些方法是根据基元实现的.
SKTGraphic类定义了一组允许它自己绘制的方法.虽然这可能不严格地说它应该是模型的一部分,但请记住,我们建模的是视觉对象的集合.尽管SKTGraphic知道如何在视图中呈现自己,但它本身并不是一个视图.
我不知道这是否是一个令人满意的答案.我对MVC的个人经验是,虽然模型,视图和控制器的分离是一件"好事",但在实践中,层之间的界限变得模糊.我认为设计的妥协经常是为了方便起见.
特别是对于Sketch,我觉得模型知道如何在视图中绘制自己.让每个SKTGraphic子类知道如何绘制自己的替代方法是拥有一个视图类,其中包含每个SKTGraphic子类的知识以及如何呈现它.在这种情况下,添加新的SKTGraphic子类需要编辑视图类(可能会在if/else或switch语句中添加新子句).在当前设计中,可以添加SKTGraphic子类,而不需要对视图类进行任何更改以使事情正常工作.
我不知道你提到的具体例子,但我猜这个设计的原因是:
也许模型(你提到的SKTRectangle,SKTCircle)知道足以绘制自己但不足以实际绘制到屏幕上.通过视图处理到屏幕的绘图,View将调用模型以了解如何在屏幕上绘制它们.
通过采用这种方法,View不必知道如何绘制它可能遇到的每个模型 - View只需要知道如何让模型在屏幕上绘制自己.
我认为这是MVC模型和面向对象编程模型之间的权衡 - 严格按照MVC的方式划分将意味着View将变得非常大并且在添加支持时不会非常灵活其他需要显示的型号.通过面向对象的设计,我们希望模型本身能够在屏幕上绘制自己,并且我们希望View能够通过诸如接口之类的设施来处理新类型的模型.