1

不太清楚如何解释这个,但这里有......

我正在为我的数据(在 Objective-C 中)构建一个对象结构,使其具有以下内容:

  • 一个Companies集合类
    • 其中包含许多Company对象
      • 每一个都有一个Users集合类
        • 其中包含许多User对象

目的是获得关于对象(即companyID, companyName)的数据,以及关于集合类(addCompany:, deleteCompany:)的方法。

我真正想做的是构建类,以便我可以进行以下调用:

[[companies getCompanyWithID:1] addUserWithName:@"Duncan"];

但要做到这一点,我需要将该方法addUserWithName:放在公司集合类上。

对我来说这没有意义 - 添加/修改/删除/获取用户的方法应该在Users集合类上,而不是在Companies集合类上。

如果我将这些函数放在它们相关的集合类上,那么我必须编写相同的语句,如下所示:

[[companies getCompanyWithID:1].users addUserWithName:@"Duncan"];

但它读起来并不那么好——因为它.users在中间潜伏着一个令人讨厌的东西。

我是不是真的很愚蠢并且错过了一些明显的东西(我从未上过技术学校,所以很可能我错过了你们都知道的一些基本知识)。

任何帮助,非常感谢你们。非常感谢。

4

1 回答 1

1

我可能误解了您的担忧,但我认为这不是问题。您的用户管理方法将是 on Company, not Companies,这通常是可接受的模式。

让我们假设您有四个类:Companies/CompanyUsers/ User。现在我们可以定义一个方法:

@interface Companies
- (Company *)companyWithID:(NSUInteger)id;
@end

这表示Companies该类可以Company通过其 ID 将您返回。(旁注:在 Objective-C 中,我们很少使用get...访问器方法的前缀 - 在这种情况下,只需使用您想要的东西开始方法company...。)

从这里开始的传统做法是让您的Company类公开大量公共 API 来管理用户。您可能会执行以下操作:

@interface Company
- (void)addUserWithName:(NSString *)name;
@end

反过来,Company该类将负责了解Users集合的内部工作原理,包括根据需要对其进行修改。考虑到这一点,您可以编写:

@implementation Company
- (void)addUserWithName:(NSString *)name {
    [self.users addObject:name]; // self.users is of type `Users *`
}
@end

这样,您就可以避免向类的.users外部客户端公开Company- 您只需将add...消息转发。

您甚至可以进一步采用这种策略,并说Users集合类是一个实现细节,永远不需要向Company该类的客户公开。相反,您可以Users根据更标准的系统集合对象为您的集合提供访问器:

@interface Company
- (NSSet *)users;
- (void)addUserWithName:(NSString *)name;
- (void)removeUserWithName:(NSString *)name;
// and so on...
@end

这种思维过程的绝对极端会导致你完全摆脱你的Users类,而只使用系统类来直接在你的Company类上管理用户集合。一方面,这将让 Xcode 推断和建议(通过自动完成)某些非常适合此模式的方法 - 请查看 Key-Value Coding Programming Guide 的KVC 合规性部分以了解此类方法。另一方面,您可能有更多的复杂性没有出现在您的问题中,因此Users您的用例可能需要该类。

于 2012-12-14T17:58:00.987 回答