Cocoa教学:Windows OOP与Cocoa MVC之对比

封装不封装,这是个问题。

今天我在看Cocoa开发者邮件列表的时候,看到一个帖子,求助如何在两个View之间互相通信的问题。做Windows程序员的时间长的我都不好意思说了,我意识到,这个问题在我刚刚接触到Mac上的Objective-C时也遇到过。

我现在可以提出这个问题的简化版:“我有一个对话框,获取了一些用户输入的数据。我现在需要从我那个对话框中把这个数据提取出来以供主窗口使用。如何才能从主窗口获取到对话框里的数据呢?”


在Windows里,尤其是C# .NET,你可以通过添加一个Form对象来创建新的窗口,而且还可以简单地在设计窗口中添加一些不同的“控件”。这些操作是非常容易的。不过一旦窗口创 建好之后,你需要在主窗口的代码中建立刚才新建的窗口的实例,然后提供公共变量在两个窗口之间设置或者获取数据。窗口类是由Windows Form模板写好直接交给你使用的,这当然可以使代码看起来清晰干净,但是它打破了MVC的惯例,所以大部分Windows的程序员会花费不少时间提升他 们思考的方式也就不足为奇了。

我用VS2008做了一个demo程序,截图大概是这样的:

看一下主窗口的代码:

  1. public partial class Form1 : Form
  2. {
  3.     Panel p;
  4. ?
  5.     public Form1()
  6.     {
  7.         InitializeComponent();
  8.         p = new Panel();
  9.         p.Show();
  10.     }
  11. ?
  12.     private void btnChangeText_Click(object sender, EventArgs e)
  13.     {
  14.         p.OutputText = this.tbInputText.Text;
  15.     }
  16. }

 

注意看我声明了一个Panel的对象,这是我们需要在上面设置文字的第二个窗口(view)。下面是Panel类的代码:

 

  1. public partial class Panel : Form
  2. {
  3.     public Panel()
  4.     {
  5.         InitializeComponent();
  6.     }
  7. ?
  8.     public string OutputText
  9.     {
  10.         set
  11.         {
  12.             this.tbOutputText.Text = value;
  13.         }
  14.     }
  15. }

 

好,代码很容易理解,但是从这里就可以看出我的观点:MVC模型已经被破坏了。虽然这个例子里面并没有任何编程逻辑,不过很清楚的是这样的设计导致你只需要把代码放到按钮的事件处理里面就可以了,而不是去将逻辑抽象到controller对象中。

 

你也许会问,我在C#中如何做MVC呢?呃……这是一个关于Objective-C、Cocoa编程的网站,对于读者们来说这是个作业了……不过坦 白讲,我可不知道。我知道那是一件可能的事情,不过C#语言的内部就没有把开发者向这个方向去引导。我也看过一些讲这方面事情的文章,不过那些也都是基本 上困难到没法实践的。有几篇号称是MVC不过根本不算,所以如果你真想在C#上面实现MVC,自己想办法弄吧……^o^ 我想说的其实就是要想在C#上面实现MVC,那算你狠。

 

Objective-C/Cocoa的方式

 

在Objective-C里,你必须明确地创建一个controller用来处理model和view之间的变化。其实MVC应该被称做MCV,因 为controller是在model和view之间的一个协调员。如果你的model发生了改变,你的controller会通知view。如果用户在 view中做出了某种改变,controller就会通知model。所以我建议初学者可以叫它MCV,会更加形象一点。有点跑题了。

在Objective-C/Cocoa的世界里,我们建立的controller通常是指应用程序(Application)的托管 (Delegate),或者可以简单称做app delegate。很多Windows程序员都会在这里迷惑不解的事情是,我们通常学习到的面向对象开发就是你应该去做的事情,而并不会关注为什么你会去 做,或者你为什么不去做。我并不是说你别用OOP的思想,而正相反我建议去用。问题是如果把一切都抽象化,那就有点太傻叉了……我们应该有很好的理由去写 这些代码,而不要用诸如“我从大学里面学的……”或是“我一直就这么干……”这种理由。

当你在Objective-C里面建立一个app delegate的时候,这个delegate可以做为你所有model和view的controller,或者你也可以为不同的model和view分 别创建controller。想怎么干就怎么干吧。不过有一个比较重要的事情是要记住的,如果你把所有的代码都扔到同一个app delegate类里头,那你就有了一个超大的app delegate文件,很难看清楚。

一些例子程序

为了帮助那个提出问题的朋友,还有另外一些想从Windows开发转变到Cocoa开发的朋友们,我也写了点简单例子来帮助把这个问题变简单。如果 你想让两个View,或者两个窗口可以互相之间通信,只要在他们之间传递消息就可以了。虽然把你的view们封装到它们自己的类中并不是坏事,不过通常来 说真的没必要。在任何一种语言和任何一种平台上,都有实现这个功能的方法,所以就别管我没提到的事情了,我也没说这是唯一的方法不是……我说的方法是简单 直接的方法,可以帮你更快的理解。

我同样建了一个简单的demo程序来演示上面说的,这里是截图:

你可以在这里下载例子。

这里是我提到的代码,只需要在app delegate的头文件中将你的view声明为outlet:

 

  1. @interface AppDelegate : NSObject {
  2.     IBOutlet NSTextField *inputText;
  3.     IBOutlet NSTextField *outputText;
  4. }

然后声明这样一个方法,在按下按钮之后会执行:

  1. - (IBAction)updateText:(id)sender;

 

最好要做的事情就是在IB里面把action和outlet连到AppDelegate对象上,任务完成。就这么简单。

 

为什么Windows的方法烂,Mac的方法赞

 

好吧,这个小标题仅仅是个玩笑,Windows专家们千万表喷俺。不过我的确认为C#设计用户界面的方式会把人们的代码搞得贼乱,而且明显不是MVC模式。

当然,又来了,怎么做还是看你自己,不过.NET的用户界面设计工具非常鼓励用户去破坏MVC模式。当你在设计器里面把一个按钮拽到窗口里,然后双 击那个按钮的时候,它就自动地给你指到按钮点击事件代码里,大部分程序员就自然而然地在那里写代码了。当你在设计过程的时候,倒也没什么,不过它根本没有 做什么来支持你将逻辑和表现分开。

在Objective-C里,想破坏MVC设计模式倒是很困难的事情。基本上你都必须遵循这个模式。甚至当你使用Interface Builder在app delegate和action及outlet中间建立连接的时候,都会带有一个可视的MVC表现。要连接app delegate类(你的controller)到outlet的时候(比如输入框),你按住ctrl之后从AppDelegate拖拽一根线放到 outlet上。当你想告诉AppDelegate执行一些动作,你要从触发动作的对象中拽到AppDelegate对象上。反过来是不行的。养成这样的
习惯其实很好,只不过Windows的铁杆程序员会相当不习惯。

结论

从Windows程序员转到Mac程序员是有一点挑战的,不过你越早抛掉从前的开发的概念,就越容易接受Mac开发的概念。想想令狐冲吧……Mac的开发的确是不太一样的。要习惯这种开发思路,而不要试图沿用从前的习惯来进行Mac开发。

承认这一点吧兄弟们,工程师们都是很傲慢的,而且当学习一门新的语言、技术或是平台的时候,通常会认为他们已经很清楚了。最后这句的英文真的很棒, 我不知道怎么翻译才能完美的表达这句话,和大家共勉:Goto is not inherently evil, you know? Until next time.

转自iOS分享网--http://iosshare.cn

时间: 2024-09-17 04:14:55

Cocoa教学:Windows OOP与Cocoa MVC之对比的相关文章

《从零开始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式

原创文章,欢迎转载.转载请注明:关东升的博客   MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在Smalltalk语言中.现在,很多计算机语言和架构都采用了MVC模式.   MVC模式概述 MVC模式是一种复合设计模式,由 "观察者"(Observer)模式."策略"(Strategy)模式和"合成"(Composite)模式等组成.MVC模式由3个部分组成,如图所示,这3个部分

Windows 7/Vista/XP启动速度横向对比

测试环境:CPU为Intel Core2双核心3.16GHz,内存4GB,Windows XP,Vista,Windows 7 Preview都安装到同一块物理SATA硬盘上.此次测试的Windows 7版本是上个月PDC会议上流出的版本,而Vista已经安装了SP1,Windows XP则安装了SP3.测试内容:就是很简单的启动电脑,显示选择系统时开始计时,然后一直记录到达显示用户登陆界面这个时间段. 测试1:从启动界面到完全加载用户桌面 这个测试先要创建一个非管理员帐号然后Startup里无

Windows 7和Windows Vista处理器、内存性能对比

Windows 7和Windows Vista的性能对比评测很多,但大多都是关于3D游戏的,不过玩游戏毕竟不是长久之计,所以今天我们再看看另外两个更基本的方面:处理器和内存性能. 测试平台配置: 处理器:Core i7-920 OC 4GHz (200MHz×20) 散热器:Noctua NH-U12P 主板:技嘉GA-EX58-UD5 显卡:技嘉GeForce GTX 285 内存:OCZ Blade PC-16000 DDR3 2GB×3 (7-8-7-20) 硬盘:西部数据VelicoRa

Windows上使用Objective-c和Cocoa

最近进行iPhone的开发,使用了Cocoa,感觉Cocoa设计很精致,Objecitive-c语法也很简单和易用,因此想是否在Windows下也有可以运行的环境,这样可以方便使用,否则只在MAC上用,安装虚拟机或购买硬件都比较麻烦,搜索了一下资料,还真有这方面的工具. 关于cocoa跨平台的问题 http://stackoverflow.com/questions/2049099/cocoa-programming-on-windows GNUStep http://www.gnustep.o

《企业级ios应用开发实战》一2.3 Cocoa Touch 框架简介

2.3 Cocoa Touch 框架简介 Cocoa Touch框架是进行iPhone应用程序开发工作的主要框架,主要包括UIKit和Foundation(NS)框架,这些库统称为Cocoa Touch框架.该框架完全是面向对象的,它是Cocoa框架的子集. 注意:Cocoa框架早先是用于Mac OS X上的一个面向对象的应用程序快速开发(Rapid Application Development,RAD)框架,包含了Foundation和App Kit框架,可用于开发Mac OS X系统的应用

Cocoa框架类之间继承关系

原文出处:http://blog.csdn.net/duanyipeng/article/details/7110324 Cocoa框架类之间继承关系是本文要介绍的内容,主要是来了解cocoa的继承关系,Cocoa框架包含两个核心框架:Foundation和Application Kit (UIKit) 框架. 在Cocoa开发中是必要的,至于其它框架(如:Core Data.Sync Services.Address Book.Preference Panes.Screen Saver.Web

设计模式中的迭代器模式在Cocoa Touch框架中的使用_IOS

基本理解迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示. 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式. 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. 迭代器定义了一个用于访问集合元素并记录当前元素的接口. 不同的迭代器可以执行不同的迭代策略.外

《iOS 8开发指南》——第6章,第6.2节Xcode中的MVC

6.2 Xcode中的MVC iOS 8开发指南 在用Xcode编程并在Interface Builder中安排用户界面(UI)元素后,Cocoa Touch的结构旨在利用MVC(Model-View-Controller,模型-视图-控制器)设计模式.在本节的内容中,将讲解Xcode中MVC模式的基本知识. 6.2.1 原理 MVC模式会将Xcode项目分为如下3个不同的模块. 1.模型 模型是应用程序的数据,比如项目中的数据模型对象类.模型还包括采用的数据库架构,比如Core Data或者直

《iOS 8开发指南(第2版)》——第6章,第6.2节Xcode中的MVC

6.2 Xcode中的MVC iOS 8开发指南(第2版) 在用Xcode编程并在Interface Builder中安排用户界面(UI)元素后,Cocoa Touch的结构旨在利用MVC(Model-View-Controller,模型-视图-控制器)设计模式.在本节的内容中,将讲解Xcode中MVC模式的基本知识. 6.2.1 原理 MVC模式会将Xcode项目分为如下3个不同的模块. 1.模型 模型是应用程序的数据,比如项目中的数据模型对象类.模型还包括采用的数据库架构,如Core Dat