我应该如何构建我的对象结构来平衡集合类和对象

时间:2012-12-14 17:26:17

标签: objective-c oop object collections

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

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

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

目标是获取对象的数据(即companyIDcompanyName)和集合类的方法(addCompany:deleteCompany:)。

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

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

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

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

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

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

但是它并没有很好地阅读 - 因为它中间有一个令人讨厌的.users潜伏着。

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

任何帮助,非常感谢大家。非常感谢。

1 个答案:

答案 0 :(得分:1)

我可能误解了你的担忧,但我不认为这是一个问题。您的用户管理方法位于Company,而不是Companies,这通常是可接受的模式。

我们假设你有四个课程:Companies / CompanyUsers / User。现在我们可以定义一个方法:

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

这表示Companies类可以通过其ID返回Company。 (旁注:在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集合类是一个实现细节,而 never 需要向Company类的客户端公开。相反,您可以根据更标准的系统集合对象为Users集合提供访问者:

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

这个思维过程的绝对极端会导致你完全摆脱你的Users类,只需使用系统类来直接管理Company类的用户集合。一方面,这将让Xcode推断并建议(通过自动完成)某些适合这种模式的方法 - 看一下这些方法的键值编码编程指南的KVC compliance部分。另一方面,您的问题可能会有更多复杂性,因此您的用例可能需要Users类。