2010-01-23 72 views
1

我經常閱讀關於將大型(單片?)應用程序代碼塊分成單獨的源代碼文件以便更容易維護等的需求,但我還沒有看到任何解釋如何做到這一點的東西。將代碼分割成多個源文件

創建單獨文件的過程在添加子類的過程中很簡單 - 當然這是我試圖實現的一個很好的例子 - 但是如果我們只有一個控制器對象並且想要分割我們的代碼到比方說,(1)含有用於計算的東西和(2)含有另一對印刷相關的方法的方法的接口和實現文件組,但具有各方法能夠訪問所有其它的方法,如他們都仍然在一個(源)文件。

任何有關如何去解決這個問題的詳細建議(如果可能的話)將不勝感激。謝謝:-)

回答

3

這最好通過使用類別完成。例如,創建一個名爲+ myController的一個Printing.h頭文件:

#import "MyController.h" 
@interface MyController (PrintingSupport) 
- (void)print:(id)sender; 
@end 

和執行文件+ myController的Printing.m:

#import "MyController+Printing.h" 
@implementation MyController (PrintingSupport) 
- (void)print:(id)sender 
{ 
} 
@end 

看在蘋果的頭文件對這項技術的很好的例子。

+0

非常感謝代碼片段,Costique!學習一些Apple代碼需要花一些時間(並且還要閱讀「類別」),所以我不能馬上嘗試它,但應該設法在週末結束。那麼我會盡快回復你。同時,再次感謝您的幫助:-) – Bender 2010-01-23 11:12:52

+0

不客氣。 – Costique 2010-01-23 13:15:27

1

我對這種編程語言並不熟悉,但總的來說,模塊化的要點是隱藏複雜的實現並暴露一個簡單的接口。這很好,因爲您通常不需要所有的數據和所有功能來完成每項任務。這是通過保持數據接近他們使用的地方(例如同一類)和使用少量的公共方法來完成的。

然而,有些情況下,你需要支持共享大量數據和模塊之間的功能很容易,這聽起來像你想做什麼情況。例如。在GUI編程中,模型 - 視圖 - 控制器設計模式就是這樣做的。關鍵是要以其他方式對數據和功能進行分組,但做起來不那麼容易。

問題要問自己: 而不是讓控制器與數據分離,是否有可能重構,使每個部分的數據與控制器的相應部分?例如,如果您有兩種類型的數據,您是否可以重構爲兩個類,每個類都有計算和打印該類型數據的方法?也許你會發現一些「數據」真的是控制器的狀態,而這絕對屬於控制器代碼。

+0

雖然我從來沒有發現一個顯示*怎麼模塊化的網頁,同時在Costique的推薦以及'類別'例子上尋找樣本,我還發現蘋果(簡單)「SimpleCocoaApp」演示,它使用主控制器和另外兩個獨立由主控制器對象交給獨立任務的NSObject對象。你是這個意思嗎?有幾個單獨的自定義對象被認爲是浪費資源?沒有? (我在這裏要求新手無知)。嗯......現在看來,我的問題有幾個*解決方案!謝謝,abc。感謝您的幫助:-) – Bender 2010-01-24 02:03:17

+0

查了可可,我明白它推薦/強制MVC設計模式。 1)是的,如果控制器不靈活,可以將其分成一種層次結構。 2)如果每個代表一個獨特概念(如您所願理解「概念」),您可以擁有許多自定義對象。最後,MVC的重點在於模塊化數據,同時允許控制器輕鬆地交叉引用不同類型的數據。我的觀點是,只有*代碼這樣做應該在控制器中。只有一種數據類型(一個模型類)的代碼應該在該模型類中。希望有所幫助。 – abc 2010-01-25 00:02:36

+0

它確實有幫助,並感謝您的所有輸入。我想通過急於添加代碼而不是優先考慮正確計劃的結構*我首先(*你知道它是怎麼回事:-))讓自己進入了一個角落。我現在已經有了一個(測試)NSObject模型並與我的AppController一起運行,並且它的工作完美 - 儘管我明白你的意思:「......以其他方式對你的數據和功能進行分組,但它不那麼容易做得好。「有一些常見的對象(如主陣列)需要傳遞給不同的模型控制器,但總的來說,我現在已經掌握了基礎知識。再次感謝! – Bender 2010-01-25 04:13:50

2

如果你的類增長如此之大,你想怎麼砍他們到不同的源文件,你可能有一個設計問題。

的模型 - 視圖 - 控制器(更好,模型的控制器視圖)設計模式幾乎自動創建小模塊化的代碼。

該模型處理與數據相關的所有內容。該視圖管理實際的視覺用戶界面,控制器將兩者粘合在一起。每個模塊都是一個獨立的類,理想情況下,模型和視圖應該非常獨立,以便可以輕鬆插入其他應用。

關鍵是在分離功能上是完全無情的。將數據保存在控制器中總是很有吸引力。當你只是用很少的數據學習和編寫小程序時,情況尤其如此。但是,隨着數據複雜性的增長,您的控制器很快就會變得複雜起來。

所有優秀的設計都是從數據模型開始的。該模型應該處理數據中的所有邏輯關係,即創建,修改,驗證,保存等。設計正確的數據模型對於用戶界面來說是完全不可知的。理想情況下,數據模型應該可以與標準視圖,Web視圖,命令行一起工作或者拋出一個URL。

我總是通過在絕對最小接口的測試應用程序中創建數據模型來啓動項目。 (通常它只是一個啓動的空白應用程序,以編程方式操作數據模型,打印到控制檯並退出。)只有當數據模型獨立工作時,纔會轉向程序的其餘部分。

現在,我瞭解數據和數據操作,我可以爲每個要運行的環境設計一個UI。 UI僅瞭解如何創建UI元素以及如何響應事件。它不包含任何數據,甚至不包含將這些元素相互關聯的邏輯。

控制器將視圖和數據模型粘合在一起。控制器只知道向數據模型發送哪些消息以獲取特定UI元素中響應特定事件的數據。它不驗證數據或對其執行任何邏輯操作。它只是在數據模型和當前視圖之間路由信息。

任何創建其他接口的操作(如打印)都應該有自己的控制器對象。例如,在打印時,只有數據模型能夠理解所有數據如何在頁面上進行拼接。沒有理由爲什麼控制UI視圖的同一個控制器應該控制打印。相反,打印控制器只是要求數據模型打印數據。 UI控制器只需要調用打印控制器並將其指向用戶選擇的數據即可。

在您的具體示例中,計算方法將在數據模型中,打印控制器中的打印方法等。使用模型 - 視圖 - 控制器,最終會生成許多令人驚訝的小模塊類,這些類很容易管理,測試和移植。

+1

」如果你的類越來越大,你正在考慮如何把它們分成單獨的源文件,你可能會遇到設計問題「我同意100%作爲初學者,我傾向於跳過所有枯燥的'模型 - 視圖 - 控制器'概念,只編寫一些代碼 - 並且在我遇到其他(以前未發現的)代碼示例時,不斷爲我的應用程序添加更多整潔的東西,我將不得不花費一些時間來重新組織我的基本方法,感謝TechZen的聲音建議。 ) – Bender 2010-01-24 02:19:38

相關問題