2013-10-31 28 views
-3

所以我一直在建立一个应用程序一段时间,随着时间的推移,我的一个类(一个UIViewController)已经变得相当大,做了很多东西与一个视图。因此,我必须使其符合很多协议(现在有12个)。我现在开始担心我符合一些太多。符合太多协议的类?

遵守一个类中的很多协议是否存在问题?会有性能问题或类似的情况吗?我不是在寻找个人意见,而是在于可能出现的性能问题,或者是否违背了最佳实践/风格指南文档(例如Apple发布的文档)。

我的一些类符合协议(不包括一些自定义的协议)的:

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

编辑: 正如一些答案指出,大部分协议都是UI相关 - 而且观点本身并不混乱。 UIAlertViewDelegate,UIActionSheetDelegateMFMailComposeViewControllerDelegateABPeoplePickerNavigationControllerDelegate都单独显示(模态地在最后两种情况下)。 UITableViewDataSourceUITableViewDelegate只是处理表格。 UITextFieldDelegate用于管理字段的搜索(以便让我检查输入的文本是否“有效”)。外观上,iOS7需要使用UIBarPositioningDelegate。 该类不是太大,只处理自己,没有太多的耦合(至少在我看来)。

回答

-1

我不能告诉你关于性能,而无需实际看到的代码,但它可能是,如果以某种方式在两个或两个以上的协议声明同名方法(它发生在我身上),那么你会得到意想不到的行为,其中可能包括性能下降。假设两个协议定义了一个基本方法,例如- (void)update,现在你只实现了一个更新方法,但是这两个协议都希望使用它,所以充其量你需要调用更多的调用(性能下降)。如果其中一个协议将该方法定义为@optional,那么它并不总是立即显而易见的。

我可以告诉你的是,这种单一设计被普遍认为是差的。这听起来像你有一个大的ball of mud正在进行。

+0

哇一个downvote说几乎完全是什么其他答案说:) –

+0

(我没有downvote,但)我不认为如果一个类声明“意外行为”或“多线程”将是一个问题符合许多协议。 –

+0

@MartinR感谢,这是有道理的,我想我不够清楚,我的意思是如果两个协议定义相同的方法,你可以看到问题。 –

1

从苹果官方文档:

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

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

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

1

没有罚中有一类符合的改变许多协议 - 除了微不足道的更高的编译时间/空间(由于有该类更大编译表,但是这的确是没有意义的,国际海事组织)和可能的类可读性问题。

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

您遇到的主要问题是IMO有关班级可读性。一般来说,如果你的班级提供了太多的公共方法,你就会遇到问题。这使得难以理解该课程是什么。重构将被强烈建议,但是这与性能无关。

从粘贴的内容看来,您添加到类中的协议似乎与您在该类内部管理的UI元素相关。然后,您班级的视图管理过于复杂,或者您需要这些代表。

1

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

0

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

但是看起来你的班级非常耦合,这是一个糟糕的设计实践,但这并非必须如此,你班级的代码行数是多少?

如果这很多,你认为你班上做了一些工作,你不应该折腾你的代码。