您是否有一些技巧或技巧將Cocoa控制器類拆分爲更小的塊?我發現無論我做什麼,控制器都會成爲我設計中更復雜的類之一。基本的東西很簡單,但是一旦我有幾個彈出窗口或動作表運行,事情會變得非常複雜。這不是,不好,但我仍然想重構代碼到幾個獨立的部分。如何讓Cocoa控制器變得太大?
我想過類,但代碼是不是獨立的(很多時候,它需要進軍viewWillAppear中,例如),我發現,我花了很長時間的戰鬥編譯器。我也想過使用繼承在圖層中添加功能,但那感覺像是一種黑客。
您是否有一些技巧或技巧將Cocoa控制器類拆分爲更小的塊?我發現無論我做什麼,控制器都會成爲我設計中更復雜的類之一。基本的東西很簡單,但是一旦我有幾個彈出窗口或動作表運行,事情會變得非常複雜。這不是,不好,但我仍然想重構代碼到幾個獨立的部分。如何讓Cocoa控制器變得太大?
我想過類,但代碼是不是獨立的(很多時候,它需要進軍viewWillAppear中,例如),我發現,我花了很長時間的戰鬥編譯器。我也想過使用繼承在圖層中添加功能,但那感覺像是一種黑客。
問題不是規模,而是責任。你的控制器是否戴着多個帽子?如果是這樣,把它分成多個單一職位的每班控制員。
類別幫助與大小,但不是責任。如果你仍然在一個(合併)課上做多件事,那麼你仍然有問題;將它們移動到單獨的文件中並不能解決問題。
有許多類別上一個類的方法帶來了碰撞的風險:實現在多個類別相同的方法,可能是由B類實現它,而忘記了A類已經有一個。當對象自己發送消息時,這會造成問題,期望一個類別對該消息的響應並獲取其他消息。
聲明所有的主類中的類別標題減輕了風險,因爲您可以看到另一個類別已經有一個您要輸入的名稱的方法。但是,您添加的每個方法都會延長頭文件,從而減輕緩解。
如果您的控制器佩戴多個帽子,請將其分成多個班級。
我推薦Martin Fowler的書「Refactoring」。重構你的代碼正在清理它,並且炸燬太大的類(以及方法和函數)是這種清理的一個子集。
當然,曾經是一個類的多個類需要替換之前在類中內部的通信。可可提供了一些解決方案:
你不需要選擇一個,也不需要全部使用它們。適合哪種解決方案將取決於你的新課程相互之間需要什麼溝通。
塊使我的生活變得更加容易,因爲我可以刪除彈出窗口和動作表所需的委託方法(例如使用http://github.com/zoul/Lambda-警報)。不能等待iPad出現在屏幕上,我不會說他們有這樣的區別。 – zoul 2010-08-29 14:16:10
類別是要走的路。技巧(對於你的「不那麼獨立」的東西)是在你的主控制器的.h文件中聲明類別方法(不是一個單獨的controller + category.h文件,不會有),然後在你的controller +類別中實現它們。 m文件。就像這樣:
//******************
// MyController.h
//******************
#import <Cocoa/Cocoa.h>
@interface MyContoller : NSObject
{
NSWindow *window;
// stuff to implement in the category
NSComboBox *someCombo;
NSButton *someButton;
}
@property IBOutlet NSWindow *window;
@property IBOutlet NSComboBox *someCombo;
@property IBOutlet NSButton *someButton;
@end
@interface MyController (MyCategory)
- (IBAction)someComboSelected:(id)sender;
- (IBAction)someButtonPressed:(id)sender;
@end
//**************************
// MyController+MyCategory.m
//**************************
#import <Cocoa/Cocoa.h>
#import "MyController.h"
@implementation MyContoller (MyCategory)
- (IBAction)someComboSelected:(id)sender
{
....
}
- (IBAction)someButtonPressed:(id)sender
{
....
}
很顯然,我並沒有包括「MyController.m」,在這裏你把「@合成」的東西,是需要任何其他主控制器/醒 - 從 - 筆尖/不管。無論如何,這樣做可以讓你的控制器方法訪問類別方法,反之亦然,類別方法可以訪問所有的屬性。
在常規的Cocoa中,NSViewController可以用來管理控制器的複雜性,允許窗口中的「組件」擁有自己的總體控制器。
你也許能夠用UIViewController做類似的事情,或者你可能想在你的視圖/視圖控制器層次結構之外創建「協調控制器」來分別管理你的模型對象的行爲。
我對Cocoa並不熟悉,但是我在PHP中使用MVC設置時遇到了同樣的問題,所以我想它也適用於不同的語言。我一直在考慮不同部分的子控制器,但這隻會讓整體變得更加複雜。那樣的話,你基本上可以繼續深入研究,直到你有一個子子控制器,當你寫一些很大的東西時,只會變得很難維護。好奇看看有什麼解決方案:) – Alec 2010-05-18 22:44:37