【问题标题】:How can I combine methods with different arguments?如何将方法与不同的参数结合起来?
【发布时间】:2011-03-15 20:57:14
【问题描述】:

我有四种主要方法:

+ (NSArray *)findAll;
+ (NSArray *)findAllWithOrder:(NSArray *)order;
+ (NSArray *)findAllWithConditions:(NSDictionary *)conditions;
+ (NSArray *)findAllWithLimit:(NSRange)limit;

另外,我想组合这些方法(例如,我可以通过顺序和条件find all)。目前我正在做(即使参数顺序不同,这里也没有显示所有可能性):

+ (NSArray *)findAll;
+ (NSArray *)findAllWithOrder:(NSArray *)order;
+ (NSArray *)findAllWithConditions:(NSDictionary *)conditions;
+ (NSArray *)findAllWithLimit:(NSRange)limit;
+ (NSArray *)findAllWithOrder:(NSArray *)order conditions:(NSDictionary *)conditions;
+ (NSArray *)findAllWithOrder:(NSArray *)order limit:(NSRange)limit;
+ (NSArray *)findAllWithConditions:(NSDictionary *)conditions limit:(NSRange)limit;
+ (NSArray *)findAllWithOrder:(NSArray *)order conditions:(NSDictionary *)conditions limit:(NSRange)limit;

但是有没有比为此创建几十个方法更简单的方法呢?那肯定很不错。谢谢。

【问题讨论】:

  • 是的——不要那样做。这不是跨框架的标准模式,并且有充分的理由。事实证明,维护所有这些变体是一件非常痛苦的事情。更改往往是全面的,您需要测试每个变体的每个变体。最好有少量的综合方法。
  • 参见 NSFetchRequest。甚至不清楚您是否需要一个新类,或者使用 NSFetchRequest 的子类是否会更好。考虑到输入的复杂性,最好使用 Finder 类,其实例可以根据需要进行配置。

标签: objective-c class methods


【解决方案1】:

使用具有所有参数的那个 (findAllWithOrder:conditions:limit:) 并使用 nil 来标识未使用的参数(或者,对于 NSRange,{ NSNotFound, 0 }

【讨论】:

  • 其实我在写一个框架,对于它的用户来说,它需要简洁明了,当然要易于使用。你的想法会奏效,但它不适合我和我的框架的用户编码风格。还是谢谢。
  • 嗯,Apple 使用了这个解决方案。通常使用较少的参数添加最常用的便捷方法。例如,请参阅NSNotificationCenter
【解决方案2】:

在我看来,Apple 实现这一点的方式是在 Obj-C 中实现它的最佳方式之一:

定义一个包含options 字典或位掩码的包罗万象的方法,然后在该方法中包含基于字典或位掩码的逻辑,将执行相应的代码。

【讨论】:

  • 你能举个例子或(链接到)教程吗?
  • 很好的答案,不过我不喜欢这种方法。对于选项字典,合适的对象/键是什么从来都不是很明显。长方法名称是自记录的,选项字典不是。
【解决方案3】:

不,你就是这样做的。我敢肯定,有人可以找到方法来绕过创建许多类似的方法,但它们很少使用。 Obj-C(尤其是 Cocoa)对象拥有大量的方法,这些方法彼此之间仅略有不同,这是很常见的。

【讨论】:

  • :( 好的,那将是一个很大的源代码甚至更大的文档:')
  • 我已经做到了,我现在有超过 50 种方法。谢谢=D。感谢复制和粘贴。
【解决方案4】:

对我来说,它看起来像是 Builder 设计模式的候选者 (http://en.wikipedia.org/wiki/Builder_pattern)

您使用方法创建即 Finder 类:

-(void)searchOrder:(NSArray *)order;

-(void)searchCondition(NSDictionary *)conditions;

等等...这些方法将对象的成员设置为您在这些方法中传递的值。

这些方法是可选的,因此您可以(在 Finder 类的对象上)不调用它们(最终效果如 + (NSArray *)findAll; 在您的情况下)或其中的一些。

最后你调用 Finder 的对象方法,即-(NSArray *)find;,你就有了结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多