不太清楚如何解释这个,但是这里......
我为我的数据构建一个对象结构(在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
潜伏着。
我是否真的愚蠢而且缺少一些明显的东西(我从未去过技术学校,所以我很可能错过了一些你们都知道的基本知识)。
任何帮助,非常感谢大家。非常感谢。
答案 0 :(得分:1)
我可能误解了你的担忧,但我不认为这是一个问题。您的用户管理方法位于Company
,而不是Companies
,这通常是可接受的模式。
我们假设你有四个课程:Companies
/ Company
和Users
/ 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
类。