你有一些技巧或技巧可以将Cocoa控制器类分解成更小的块吗?我发现无论我做什么,控制器最终都是我设计中更复杂的类之一。基本的东西很简单,但是一旦我有几个弹出窗口或动作表运行,事情会变得非常复杂。它不是 坏,但我仍然希望将代码重构为几个独立的部分。
我考虑过类别,但代码并不是那么独立(例如,很多时候需要点击viewWillAppear),我发现我花了很长时间来对抗编译器。我还考虑过使用继承在图层中添加功能,但这感觉就像是黑客。
答案 0 :(得分:4)
问题不在于规模,而在于责任。你的控制器是不是戴着一顶帽子?如果是这样的话,那就把它吹成多个,每班一个控制器。
类别有助于规模,但不是责任。如果你仍在一个(合并)课程中做多件事,那么你仍然有问题;将它们移动到单独的文件中并没有解决它。
在单个类上有许多类别会带来方法冲突的风险:在多个类别中实现相同的方法,可能通过在类别B中实现它,同时忘记类别A已经有一个类别。当对象向自己发送消息时,这将导致问题,期望一个类别对该消息的响应并获得另一个消息。
在主类标题中声明所有类别可以减轻这种风险,因为您可以看到另一个类别已经有了您要输入的名称的方法。但是,您添加的每个方法,从而延长了头文件,减轻了缓解。
如果您的控制器佩戴了多个帽子,请将其分成多个类别。
我推荐Martin Fowler的书“Refactoring”。重构你的代码正在清理它,并且炸掉太大的类(以及方法和函数)是这种清理的一个子集。
当然,曾经是一个类的多个类需要替换之前在类中内部的通信。 Cocoa提供了许多解决方案:
您不需要选择一个,也不需要全部使用它们。哪种解决方案适合取决于您的新课程彼此之间的确切沟通需求。
答案 1 :(得分:3)
分类是要走的路。诀窍(对于你的“不那么独立”的东西)是在你的主控制器.h文件(不是一个单独的控制器+ category.h文件,没有)中声明类别方法,然后在你的控制器+类别中实现它们。 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”,你把“@synthesize”的内容和主控制器需要的其他内容/唤醒来自nib /的东西。无论如何,这样做可以让您的控制器方法访问类别方法,反之亦然,类别方法可以访问所有属性。
答案 2 :(得分:2)
在常规Cocoa中,NSViewController可以通过允许窗口中的“组件”拥有自己的整体控制器来管理控制器的复杂性。
您可以使用UIViewController执行类似操作,或者您可能希望在视图/视图控制器层次结构外部创建“协调控制器”以分别管理模型对象的行为。