Objective c 使用多个参数设计API

Objective c 使用多个参数设计API,objective-c,api,Objective C,Api,我正在为iPhone设计一个API。设计包含多个参数(最多20个变量)的API函数的最佳方法是什么。传入一个定义了必要字段的自定义对象、一个通用键值字典(Obj-C中的NSDictionary)还是将它们全部列出?还有什么其他建议 我倾向于为每个API声明一个对象,但由于有许多API需要定义,我对使用这种方法持谨慎态度。这取决于您创建的API类型 如果是针对具有一般理解的信息模型的服务,那么拥有自定义模型对象可能是一个好主意,因为它们倾向于简化对整个API的理解 OTOH,如果它更像是一个通用A

我正在为iPhone设计一个API。设计包含多个参数(最多20个变量)的API函数的最佳方法是什么。传入一个定义了必要字段的自定义对象、一个通用键值字典(Obj-C中的NSDictionary)还是将它们全部列出?还有什么其他建议


我倾向于为每个API声明一个对象,但由于有许多API需要定义,我对使用这种方法持谨慎态度。

这取决于您创建的API类型

如果是针对具有一般理解的信息模型的服务,那么拥有自定义模型对象可能是一个好主意,因为它们倾向于简化对整个API的理解

OTOH,如果它更像是一个通用API,许多参数是可选的,或者每个方法的模型对象都是唯一的,那么使用NSDictionary可能会更好,它清楚地记录了所需的键(以及在函数开始时进行适当的检查)

互联网站上也有关于该主题的广泛信息,请参阅,以获取好的想法、好的示例和十大建议


祝你好运

我现在能想到的最复杂的方法是将NSDictionary作为参数。我会这样做。

您需要20个参数来初始化对象?您需要一些参数将对象初始化为默认状态。然后使用属性更改其状态


在内部,您可以将20个参数/状态存储在NSDictionary中,以便于维护

大多数API设计师都同意,如果可能的话,应该避免长参数列表,例如Joshua Bloch(高效Java)认为5个或更多参数太多了。避免这种情况的一些方法包括:

  • 创建一个结构来保存参数,并将该结构传递给函数。这通常称为普通旧数据(POD)类型。您可能希望添加一个helper函数来创建设置默认值的结构(或者,如果您使用的是Objective-C++,则可以为该结构定义一个构造函数来执行相同的操作)。如果您认为参数列表可能会随着时间的推移而改变,并且二进制兼容性对您很重要,那么可以添加一个版本字段,并让构造函数对其进行适当的设置。这样,您的代码可以检查版本号以了解哪些字段可用

  • 传递一本价值字典。这实际上是一个数据驱动的API,其中参数及其值在支持具有任意类型值的键的结构中传递。在C/C++中,您必须自己创建这个结构,或者使用类似boost::any或Qt的QVariant之类的东西。但是,正如您所注意到的,NSDictionary允许您保存id类型的对象,以便您可以使用它。这样做的好处是,更改参数列表并不会破坏您的接口—只需由实现检测新键并支持旧键即可。虽然这意味着编译器不会为您捕获错误的键,但这取决于您的代码。主要的缺点是,仅仅查看API并不能告诉用户支持哪些键,因此这种方法必须有良好的文档支持

  • 创建一个对象并将参数转换为方法调用。这样做的好处是可以按任何顺序指定参数,基本上命名参数,并且仍然可以处理可选参数(只需不调用给定的方法)。添加新参数也是向后兼容的,因为它解决了向对象添加新函数的问题

  • 在3.的基础上,您可以使用命名参数惯用法(NPI),其中每个函数返回一个指向对象的指针或引用,从而允许您将调用链接在一起。此选项具有3的所有优点。但也允许更简洁的语法,例如MyObject().setValue(100).setName(“Hello”).setEnabled(true)


  • 听起来你已经考虑过这些选项中的大多数了,所以我可能不会告诉你任何新的东西。对于我自己的偏好,我更倾向于NPI样式,因为它避免了长参数列表、强类型、命名每个参数、向后兼容,并且仍然提供了相对紧凑的语法。与NSDictionary方法相比,它(对您而言)更易于键入,但更重要的是,它便于您的用户使用,并且与NSDictionary解决方案不同,它通过您的头文件使受支持的“参数集”变得明显(并且总是正确的)。如果您的API确实需要20个参数,请使用20个参数。如果将部分或所有这些参数聚合到自定义对象中是有意义的,那么一定要这样做,但不要仅仅为了使参数列表变小而创建自定义对象。举个简单的例子,如果一个方法采用一个点(x,y,z)的坐标,那么创建一个对象来建模一个点并将其作为单个参数传递是合法的。您不应该创建仅用于对API参数列表建模的对象

    我只会在我确实有一组可扩展的键值对的情况下使用NSDictionary方法,所有这些键值对都是可选的。在其他情况下不使用它的原因是,如果使用API的程序员忽略了一个强制参数,那么直到运行时才能检测到错误。明确命名每个参数的参数列表允许编译器检测遗漏

    API的参数数量必须限制在任意小值的想法是完全错误的。API应该根据需要使用尽可能多的参数