Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如果类名很长,是否委托方法命名约定?_Objective C_Methods_Delegates_Naming Conventions - Fatal编程技术网

Objective c 如果类名很长,是否委托方法命名约定?

Objective c 如果类名很长,是否委托方法命名约定?,objective-c,methods,delegates,naming-conventions,Objective C,Methods,Delegates,Naming Conventions,我对方法命名有问题。我希望遵循UITableViewDataSource中所示的方法命名格式: - (int)numberOfSectionsInTableView:(UITableView *)tableView; 但是我的类名比“UITableView”长得多——它是XYPagedContentScrollView其中XY是项目的类前缀。我有一个代理协议: @protocol XYPagedContentScrollViewDelegate <NSObject> - (CGFl

我对方法命名有问题。我希望遵循
UITableViewDataSource
中所示的方法命名格式:

- (int)numberOfSectionsInTableView:(UITableView *)tableView;
但是我的类名比“UITableView”长得多——它是
XYPagedContentScrollView
其中
XY
是项目的类前缀。我有一个代理协议:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPagedContentScrollView:(XYPagedContentScrollView *)pagedContentScrollView;
@end
@protocol XYPagedContentScrollViewDelegate
-(CGFloat)pagedContentScrollView的默认页面高度:(XYPagedContentScrollView*)pagedContentScrollView;
@结束
这个方法名称看起来长得可笑。我知道这不是一个严格的规则,但我只是想知道有没有办法处理这个长名称,并且仍然符合苹果的命名惯例?比如:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPagedContentScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end
@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end
@protocol XYPagedContentScrollViewDelegate
-(CGFloat)PagedContentScrollView的默认页面高度:(XYPagedContentScrollView*)pagedContentSV;
@结束
甚至:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPCScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end
@protocol XYPagedContentScrollViewDelegate
-(CGFloat)PCScrollView的默认页面高度:(XYPagedContentScrollView*)pagedContentSV;
@结束

有人能帮忙吗?

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

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

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

话虽如此,不要让名字长得离谱,这样它们的长度就有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
 */

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

就我个人而言,我会使用长格式:这就是autocomplete的用途。话虽如此,如果你想缩短它,我会删除形容词。比如:

@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForPagedContentScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end
@protocol XYPagedContentScrollViewDelegate <NSObject>
- (CGFloat)defaultPageHeightForScrollView:(XYPagedContentScrollView *)pagedContentSV;
@end
@protocol XYPagedContentScrollViewDelegate
-(CGFloat)CrollView的默认页面高度:(XYPagedContentScrollView*)pagedContentSV;
@结束

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

删除形容词,如果我有一个自定义的表视图,如XYTableView,并且我需要一个代理方法,如numberOfSectionsInTableView:(XYTableView*)tableView?这很好。使用与标准方法同名的方法不会造成任何问题,因为如果对象是视图和UITableView的委托,它可以使用传递的视图来确定调用它的对象。是的,但是如果您使用methodA:(UIView*)视图和methodA:(NSPredicate)pred,并将id someObj传递给methodA,该怎么办?它是如何区分的呢?好吧,在类中有一个
methodA:
的实现,在方法中,你可能会说类似于
if(sender==self.someView){…}或者if(sender==self.somePredicate){…}
的话,就像你是两个滚动视图的委托一样,比如,在这里,您可以使用
if(sender==self.scrollView1){…}或者if(sender==self.scrollView2){…}实现一个
scrollViewDidScroll:
方法。这是一个很好的建议,但在大多数情况下,我仍然倾向于使用具有大量[可选]参数的长得离谱的方法。无论如何,您必须测试字典中的项目,因此测试参数的存在并不是什么大问题。再加上始终拥有带有所有选项的完整原型和Xcode自动完成功能,这将导致8个月后阅读代码时更流畅的代码创作和更多的信号。这似乎是合理的,但为什么不为此使用事件类,而不是字典呢?@JesseRusak无论哪种方式都有效,这只是编程风格的问题。