+ (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实践(更具可读性)来单独列出所有参数?
答案 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
}