封装多个方法参数的最简单方法是什么?

时间:2012-01-17 14:45:12

标签: iphone objective-c xcode cocoa-touch

+ (Planet *)createPlanetInContext:(NSManagedObjectContext *)context 
                         withName:(NSString *)name 
                             type:(NSString *)type 
                            group:(NSString *)group 
                      andDiameter:(NSNumber *)diameter {

如果我想将参数“name”,“type”,“group”和“diameter”封装到单个实体中以传递给上面的方法,那么用于封装的最佳类型是什么?上面的方法只是一个简单的例子,你可以认为它就像所呈现的一样好,但是如果还有更多的参数需要通过怎么办呢。我需要在调用方法之前打包数据,因此解决方案需要快速简单的设置。

+ (Planet *)createPlanetWithData:(Data *)data inContext:(NSManagedObjectContext *)context {

或者它是否更符合Objective-c实践(更具可读性)来单独列出所有参数?

4 个答案:

答案 0 :(得分:2)

为了清楚起见,我通常会说你想单独列出你的论点。在Objective-C的上下文中,您在上面发布的示例方法并不长。

这与可读性和文档有关。当您列出所有参数时,开发人员可以清楚地了解在项目中传递的内容以及浮动的对象类型。自动生成文档(例如,Doxygen)也可以很好地处理参数列表。

但有一点,正如你所说,它变得有点笨拙。要传入的20个参数和方法调用将非常非常长!所以还有其他选项可供使用 - 最简单的选项可能是使用NSDictionary或类似的,已经在iOS中使用它来传送某些数据(特别是通知,你有userInfo字典)。

答案 1 :(得分:2)

阅读代码比编写代码更难,因此优化可读性。选择者的短缺不应该是一个因素;清晰度应该是。

问问自己哪个版本更具可读性,并坚持使用该版本。我认为具有直接参数的版本更具可读性是相对明显的。

Objective-C对于具有多个参数的方法具有很好的语法,因此请使用此优势。在使用类似c语法的语言中,我也会犹豫使用很多参数。

答案 2 :(得分:1)

您可以在NSManagedObject上为每个属性填充一个键/值对的字典。

答案 3 :(得分:0)

如果您想要超级灵活,可以使用@ Novarg的评论并传递字典作为您的论点。这样,您可以在不影响方法签名的情况下向其添加参数。

我特别喜欢创建自定义 args 对象以传递给我的方法。这不仅具有字典的灵活性,而且还可能具有一些内置实用程序或附加逻辑。此外,与字典不同,您不需要对键名称和/或常量进行硬编码,如果您需要更改名称,则 MUCH 更容易重构使用Xcode的重构功能的属性:

+ (Planet *)createPlanet:(PlanetArgs *)args
{
           //args.context
           //args.name
           //args.type
           //args.group
           //args.diameter   

           //Args can even have some built-in logic
           //planet.color = [args generateRandomColor]; <<-Just a rough idea
}