方法 Swizzling 以保持更清晰的 Class 实现

Method Swizzling to keep a cleaner Class implementation

我的应用程序的其中一个 viewController 变得非常大,特别是因为我添加了一个 "Tutorial state",它为这个 [=17= 的许多方法添加了不同的实现] 我通过检查

来控制
_tutorialEnabled?

所以,我的问题是,如果这是方法调配的一个很好的用例,我可以将这些方法的不同实现放在一个单独的类别中,并在需要时调配它们,这可能会帮助我减少代码量默认实现。对其他技术的任何意见或建议表示赞赏。

不,这不是 method swizzling 的设计目的。

就我个人而言,我会创建一个视图控制器的子类来管理与教程相关的内容。然后,根据教程是否启用,您可以实例化教程控制器或其超类。这就是多态性的设计目的:避免无穷无尽的 if/else/switches.

你为什么不子类化?使用所有需要的逻辑创建视图控制器的教程子类。使用没有动画的全屏模式在真实视图控制器 -viewDidAppear: 中展示教程。当教程结束时,关闭没有动画的模型。

if _tutorialEnabled != nil && _tutorialEnabled {
    tutorialViewController = …
    tutorialViewController.modalPresentationStyle = .FullScreen
    presentViewController(tutorialViewController, animated: NO) {}
}

不,我不会为此使用方法调配。这有点像用大锤敲图钉。

与其他人不同,我也不会子类化视图控制器,当您想稍后添加其他功能时,围绕视图生命周期事件保持可理解的流程非常重要。

相反,我会为此使用 strategy pattern。在你的 init 中你可以做这样的事情:

if (tutorialEnabled) {
    self.behaviour = [TutorialBehaviour new];
} else {
    self.behaviour = [NormalBehaviour new];
}

然后,当您需要做一些改变时,您只需对您的行为调用一个方法,例如。

- (void)viewDidLoad
{
    ...
    [self.behaviour load]
    ...
}