成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Cocoa教學:對比Windows OOP與Cocoa MVC

移動開發 iOS
本文我們將介紹Windows OOP與Cocoa MVC之間的對比,在Objective-C里,你必須明確地創建一個controller用來處理model和view之間的變化。其實MVC應該被稱做MCV,因為controller是在model和view之間的一個協調員。如果你的model發生了改變,你的controller會通知view。如果用戶在view中做出了某種改變,controller就會通知model。所以我建議初學者可以叫它MCV,會更加形象一點。有點跑題了。

本文我們將介紹Windows OOP與Cocoa MVC之間的對比。在Windows里,尤其是C# .NET,你可以通過添加一個Form對象來創建新的窗口,而且還可以簡單地在設計窗口中添加一些不同的“控件”。這些操作是非常容易的。不過一旦窗口創建好之后,你需要在主窗口的代碼中建立剛才新建的窗口的實例,然后提供公共變量在兩個窗口之間設置或者獲取數據。窗口類是由Windows Form模板寫好直接交給你使用的,這當然可以使代碼看起來清晰干凈,但是它打破了MVC的慣例,所以大部分Windows的程序員會花費不少時間提升他們思考的方式也就不足為奇了。

我用VS2008做了一個demo程序,截圖大概是這樣的:

我用VS2008做了一個demo程序,截圖大概是這樣的

看一下主窗口的代碼:

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

注意看我聲明了一個Panel的對象,這是我們需要在上面設置文字的第二個窗口(view)。下面是Panel類的代碼:

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

好,代碼很容易理解,但是從這里就可以看出我的觀點: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程序來演示上面說的,這里是截圖:

demo程序

你可以在這里下載例子。

這里是我提到的代碼,只需要在app delegate的頭文件中將你的view聲明為outlet:

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

然后聲明這樣一個方法,在按下按鈕之后會執行:

  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.

責任編輯:佚名 來源: cocoachina
相關推薦

2011-08-11 15:46:55

CocoaCocoa Touch框架

2011-07-22 15:50:06

Cocoa MVC 視圖

2011-07-25 13:15:34

Cocoa MVC 架構

2011-08-10 18:37:32

CocoaMac OS X

2011-07-07 13:51:24

Cocoa 框架

2011-07-07 13:39:14

Cocoa 框架

2011-07-07 13:30:32

Cocoa Core

2011-07-07 13:59:49

Cocoa Objective- 根類

2011-07-07 14:22:27

Cocoa 對象 生命周期

2011-08-15 16:28:06

Cocoa內存管理

2021-06-04 09:01:27

Cocoa 協議編程 Swift

2011-06-17 16:23:49

Cocoa蘋果

2011-08-10 18:47:18

Cocoa字符串

2012-05-21 09:51:25

對象Cocoa

2021-06-03 08:55:58

面向協議編程

2011-07-08 16:43:46

iPhone Cocoa 多線程

2011-07-08 18:03:30

Cocoa Touch 網絡

2011-08-10 18:13:01

Cocoa文字字符串

2011-05-11 10:28:03

2011-07-26 10:42:00

Cocoa Cocoa2d 游戲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产一区二区三区成人影院 | 国产综合久久 | 精品一二区| 超碰人人插 | 欧美一区二区三区四区视频 | 中文字幕韩在线第一页 | av一区二区在线观看 | 人妖videosex高潮另类 | 一级免费看 | 青青草原综合久久大伊人精品 | 日韩一区二区黄色片 | 午夜影视免费片在线观看 | 黑人巨大精品欧美一区二区免费 | 国产韩国精品一区二区三区 | 一区二区三区中文字幕 | 日韩影院在线观看 | 久久久精彩视频 | 欧美日韩亚洲视频 | 国产极品粉嫩美女呻吟在线看人 | 玖玖色在线视频 | 欧美一级免费看 | 伊人网一区 | 在线观看av中文字幕 | 欧美成人猛片aaaaaaa | 91久久国产综合久久 | 欧美日韩精品中文字幕 | 久久久精品综合 | 国产精品伦理一区二区三区 | 久草电影网 | 天天射天天干 | 色永久 | 成人免费在线电影 | 久久人人网 | 欧美综合国产精品久久丁香 | 欧美日韩在线一区 | 福利片在线 | 国产99久久精品一区二区永久免费 | 欧美精品一二三 | 日韩av免费看| 视频在线h | 国产成人精品一区二区在线 |