【问题标题】:Delegate method naming convention if class name is long?如果类名很长,则委托方法命名约定?
【发布时间】:2012-08-05 01:48:23
【问题描述】:

我的方法命名有问题。我想遵循UITableViewDataSource中看到的方法命名格式:

- (int)numberOfSectionsInTableView:(UITableView *)tableView;

但我的类名比“UITableView”长得多——它是XYPagedContentScrollView,其中XY 是项目的类前缀。我有一个委托协议:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPagedContentScrollView:(XYPagedContentScrollView *)pagedContentScrollView;
@end

而且这个方法名看起来长得离谱。我知道这不是一个严格的规则,但我只是想知道有什么办法可以处理长名称并且仍然符合 Apple 的命名约定?比如:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPagedContentScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end

甚至:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPCScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end

谁能帮忙?

【问题讨论】:

    标签: objective-c methods delegates naming-conventions


    【解决方案1】:

    方法的长度不受语言的任何限制,因此可以随意延长。

    一开始可能看起来很糟糕,但越详细,以后发生冲突的可能性就越小。

    我的规则是,如果它看起来可能与另一个方法冲突(特别是如果它是委托方法),它需要一个更长的名称。

    现在,话虽如此,不要把名字写得太长,这样它们就有 100 个字符的长度,像这样:

    -(void) fooBarViewController:(FooBarViewController *) controller didTapRightMarginAtPoint:(CGPoint point) ofPage:(NSUInteger) page lengthHeld:(NSTimeInterval) tapLength fingers:(NSUInteger) fingerCount;
    

    相反,请考虑将其包装在事件详细信息的字典中:

    -(void fooBarViewController:(FooBarViewController *) controller didTapMargin:(NSDictionary *) eventDetails; 
    
    /* eventDetails should contain the following information:
        which margin?
        touch location
        page index
        touch length
        finger count
     */
    

    这简化了方法签名,并允许接收者只提取他们需要的变量。

    【讨论】:

    • 好建议,但在大多数情况下,我仍然倾向于使用带有大量 [可选] 参数的可笑的长方法。无论如何,您必须测试字典中的项目,因此测试参数是否存在没什么大不了的。结合始终拥有带有所有选项的完整原型 Xcode 自动完成,它可以在 8 个月后读取代码时带来更流畅的代码创作和更多信号。
    • 这似乎是合理的,但为什么不为此使用事件class 而不是字典呢?
    • @JesseRusak 无论哪种方式都可以,这只是编程风格的问题。
    【解决方案2】:

    就我个人而言,我会选择长格式:这就是自动完成功能的用途。话虽如此,如果您确实想缩短它,我会放弃形容词。比如:

    @protocol XYPagedContentScrollViewDelegate <NSObject>
    - (CGFloat)defaultPageHeightForScrollView:(XYPagedContentScrollView *)pagedContentSV;
    @end
    

    我不会担心与委托方法的名称冲突,因为如果一个对象曾经是具有相同委托方法的两个不同对象的委托,那么它将使用传递的(即调用)对象来区分它们。 (例如,如果您是两个滚动视图的代表,您只需测试传递的视图以找出它正在谈论的滚动视图。)

    【讨论】:

    • 放下形容词,如果我有一个像 XYTableView 这样的自定义表格视图并且我需要一个像 numberOfSectionsInTableView:(XYTableView *)tableView 这样的委托方法怎么办?
    • 没关系。拥有一个与标准方法同名的方法不会造成任何问题,因为如果一个对象是你的视图的委托和一个 UITableView,它可以使用传递的视图来确定是哪个视图调用它。跨度>
    • 是的,但是如果你有 methodA:(UIView *)view 和 methodA:(NSPredicate)pred 并且你将 id someObj 传递给 methodA 怎么办?它是如何区分的?
    • 好吧,你将在你的类中拥有一个 methodA: 的实现,在你的方法中,你可能会说类似 if (sender == self.someView) { ... } else if (sender == self.somePredicate) { ... } 的内容,就像你是两个人的代表一样例如,滚动视图,您将在其中使用 if (sender == self.scrollView1) { ... } else if (sender == self.scrollView2) { ... } 实现 scrollViewDidScroll: 方法。
    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多