-3

所以我一直在构建一个应用程序一段时间,随着时间的推移,我的一个类(一个 UIViewController)已经变得非常大,用一个视图做了很多事情。因此,我必须使其符合许多协议(现在有 12 个)。我现在开始担心我是否遵守了太多。

在一个类中遵守很多协议有问题吗?会不会有性能影响或类似的事情?我不是在寻找个人意见,而是在寻找可能的性能问题,或者它是否违反最佳实践/样式指南文档(例如 Apple 分发的文档)。

我的班级遵守的一些协议(不包括一些自定义协议):

UIAlertViewDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate, 
UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate, 
UIPopoverControllerDelegate, UIBarPositioningDelegate, 
ABPeoplePickerNavigationControllerDelegate

编辑: 正如一些答案所指出的,大多数协议都与 UI 相关 - 并且视图本身并不混乱。 UIAlertViewDelegate,UIActionSheetDelegate,MFMailComposeViewControllerDelegate, 和ABPeoplePickerNavigationControllerDelegate都单独显示(在最后两种情况下模态显示)。 UITableViewDataSource并且UITableViewDelegate只是处理一张桌子。 UITextFieldDelegate用于管理对字段的搜索(以便我检查输入的文本是否“有效”)。 UIBarPositioningDelegateiOS7 需要外观。这个类不是太大,只处理自己,没有太多的耦合(至少,在我看来)。

4

5 回答 5

1

来自苹果官方文档:

提示:如果您发现自己在一个类中采用了大量协议,这可能表明您需要通过将必要的行为拆分为多个较小的类来重构一个过于复杂的类,每个类都有明确定义的职责。对于新的 OS X 和 iOS 开发人员来说,一个相对常见的陷阱是使用单个应用程序委托类来包含应用程序的大部分功能(管理底层数据结构、为多个用户界面元素提供数据以及响应手势和其他功能)用户交互)。随着复杂性的增加,类变得更加难以维护。

所以答案是这样做在性能方面还不错,但不是一个好的做法。

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html

于 2013-10-31T18:25:49.957 回答
1

让一个符合多种协议的类没有任何损失——除了可以忽略不计的更高编译时间/空间(由于该类有更大的编译表,但这真的没有意义,IMO)和可能的类可读性问题。

实际上,当您指定一个类符合协议时,您只是告诉编译器将该协议内声明的所有方法添加到类接口中。这实际上对性能或内存占用没有影响。

IMO,您遇到的主要问题是关于类的可读性。通常,当您的类提供太多公共方法时,您会遇到问题。这使得很难理解该类的用途。强烈建议进行重构,但同样,这与性能无关。

从您粘贴的内容来看,您添加到类中的协议似乎与您在该类中管理的 UI 元素有关。然后,要么你类管理的视图过于复杂,要么你需要那些委托。

于 2013-10-31T18:25:53.663 回答
1

一般来说,编程的最佳实践是尽可能地分离关注点和功能。在我看来,您的应用程序似乎由一个拥挤的控制器组成。这是为什么?一个类或文件中的代码过多会使调试和维护变得更加困难,而且如果您的界面中包含所有这些元素,那么您的界面必须非常混乱。如果没有看到更多代码,我无法给出具体建议,但总的来说,一个控制器中有太多东西。

于 2013-10-31T18:25:57.540 回答
0

我不认为这会导致任何性能惩罚或错误。

但是看起来你的类是非常耦合的,这是一种不好的设计习惯,但这不是必须的,你的类有多少行代码?

如果这很多并且您认为您的班级正在做一些不应该做的工作,那么您可以重构您的代码。

于 2013-10-31T18:27:34.750 回答
-1

如果没有实际看到代码,我无法告诉您有关性能的信息,但是如果两个或多个协议以某种方式声明了相同名称的方法(这发生在我身上),那么您可能会遇到意想不到的行为,其中可能包括性能下降。假设两个协议定义了一个基本方法,例如- (void)update,现在您只实现一个更新方法,但是两个协议都想使用它,所以充其量您会收到太多更新调用(性能下降)。如果其中一个协议将方法定义为@optional,那么它并不总是很明显正在发生一些不好的事情。

我可以告诉你的是,这种单体设计被普遍认为是糟糕的。听起来你有一个大泥球

于 2013-10-31T18:25:19.250 回答