你如何让Cocoa控制器变得太大?

时间:2010-05-18 18:45:32

标签: cocoa model-view-controller

你有一些技巧或技巧可以将Cocoa控制器类分解成更小的块吗?我发现无论我做什么,控制器最终都是我设计中更复杂的类之一。基本的东西很简单,但是一旦我有几个弹出窗口或动作表运行,事情会变得非常复杂。它不是 坏,但我仍然希望将代码重构为几个独立的部分。

我考虑过类别,但代码并不是那么独立(例如,很多时候需要点击viewWillAppear),我发现我花了很长时间来对抗编译器。我还考虑过使用继承在图层中添加功能,但这感觉就像是黑客。

3 个答案:

答案 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执行类似操作,或者您可能希望在视图/视图控制器层次结构外部创建“协调控制器”以分别管理模型对象的行为。