Objective c 面向对象的MVC

Objective c 面向对象的MVC,objective-c,Objective C,关于……我有点困惑。。简单地说。。MVC是如何完全面向对象的 通过使用大量java和c语言,我知道OOP中的对象具有状态和行为 我发现我正在分离对象操作,并将它们全部放在我的控制器中,而不是将它们保存在一个实现中(与视图一起是我最感兴趣的地方,但显然您不能这样做) 例如,假设我有一个气球对象。。 其模型保持其状态,如颜色、位置、在屏幕上移动的速度、移动的方向等。。 但是,如果我试图采取以下行动 -(void)moveBalloon:(CGPoint)destination 这在模型中通常是不被

关于……我有点困惑。。简单地说。。MVC是如何完全面向对象的

通过使用大量java和c语言,我知道OOP中的对象具有状态和行为

我发现我正在分离对象操作,并将它们全部放在我的控制器中,而不是将它们保存在一个实现中(与视图一起是我最感兴趣的地方,但显然您不能这样做)

例如,假设我有一个气球对象。。 其模型保持其状态,如颜色、位置、在屏幕上移动的速度、移动的方向等。。 但是,如果我试图采取以下行动

-(void)moveBalloon:(CGPoint)destination
这在模型中通常是不被接受的,因为模型只保存有关对象的数据,而视图只绘制对象,无法知道其位置等

也许我对这件事的想法很奇怪。。我通常认为BallooView是一个独立于BallooModel的对象,而控制器是它自己的对象

我的想法完全错了吗


还有。。在可重用性方面,如果我想把这个对象交给其他人在他们的应用程序中使用,我会给他们BallooView和BallooModel,但他们无法访问我已经作为Balloon对象的一部分实现的任何操作,因为它们在控制器中。

MVC是关于分离业务逻辑的(模型)从用户界面(视图和控制器)。MVC本身与面向对象(OO)编程关系不大。您可以轻松编写遵循MVC设计策略的软件,而无需遵循OO策略

程序的核心是其业务逻辑。在balloon示例中,如果程序需要移动balloon,那么模型肯定应该有一个
moveBalloon:
方法。换句话说,模型代码应该能够执行程序需要执行的所有操作。它应该存储程序状态,处理数据,以及与软件内部工作相关的任何其他内容。视图应该是实际的UI元素(窗口、按钮、文本字段、图形等)。它们通常应该是“哑的”(即没有内置业务逻辑)。控制器应该处理UI的内部工作


如果用户希望用鼠标移动气球,那么控制器和视图通常会处理所有的点击、拖动和移动,而模型只处理纯粹的逻辑部分:气球的位置。

你是部分正确的。通过将气球分布到MVC部件中,你无法我会交出视图、模型和控制器。不过,别担心,你会看到,即使使用MVC,你仍然可以拥有一个可重用的气球。但是你需要一些改变你的视图

您可以像往常一样在MVC应用程序中运行气球。为气球提供一些setter和getter,并将其称为BallodView。气球仅承载使用这些setter提供给它的数据

然后决定运行引出序号所需的数据。可能是引出序号位置。创建引出序号模型并为其提供位置属性。在MVC应用程序中,数据可能存储在模型层中。引出序号的另一个用户(另一个应用程序)可以将数据存储在主类中,甚至在设置对象时设置静态数据。这取决于用户如何处理气球数据

然后,控制器将引出序号与应用程序连接。可能有一个按钮触发控制器。控制器访问引出序号模型,用新位置更新它。然后,引出序号模型更改必须以某种方式传播到引出序号视图。实现这一点的方法有多种。MVC framewWorks通常期望模型分派事件,并期望视图中介器连接此事件和特定视图。因此视图无需知道其模型。但它可能知道。在我们的示例中,模型将分派更新事件,中介器将接收该事件并更新视图的位置属性。 另一个用户(应用程序)可以通过将按钮直接连接到气球定位来完全省去控制器:

onclick: balloonView.x += 5;
你们看,即使你们不移交模型和控制器,你们的BallookView仍然可以重用

--

MVC对于规模较大的应用程序是有意义的。简单的应用程序不需要遵循MVC。这会有点过分。较大的应用程序需要一些高级结构来轻松定位职责,例如:数据来自何处、允许哪些操作以及在何处可以找到它们

UI组件开发人员通常只为特定组件创建迷你MVC体系结构。然后,模型、视图和控制器位于同一目录中,可以编译成二进制文件(my_super_list_component.binary)并在其他项目中重用。

MVC和OOP:

MVC应用程序的不同部分通过事件(或信号或消息)进行通信。参与者(视图、模型或控制器)可能会发送这样的事件,而另一个参与者会侦听该事件。这不是OOP,因为一个对象知道另一个对象,并通过定义的接口调用方法,这让您担心

然而,使用MVC甚至鼓励更好的OOP设计!那么让您的所有对象自行承载其数据和操作。您需要什么连接才能让它们一起玩。MVC允许您限制对象之间必要的连接。这是OOP原则之一。MVC的另一个功能是封装理解整个应用程序的责任。不使用MVC要求应用程序逻辑分布在整个代码中,这不是OOP建议的。MVC允许您封装应用程序的不同部分,因此是应用程序宏级别的OOP。并且-我们遵循OOP原则-你容易吗