1

これを説明する方法がよくわかりませんが、ここに行きます...

私は自分のデータ (Objective-C) のオブジェクト構造を次のように構築しています:

  • コレクションCompaniesクラス
    • 多くのCompanyオブジェクト を含む
      • これらのそれぞれにUsersコレクションクラス があります
        • 多くのUserオブジェクトを含む

目的は、オブジェクト (つまりcompanyIDcompanyName) にデータを保持し、コレクション クラス ( addCompany:deleteCompany:) にメソッドを保持することです。

私が本当にやりたいことは、次の呼び出しを行えるようにクラスを構造化することです。

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

addUserWithName:しかし、そのためには、会社のコレクション クラスに メソッドを配置する必要があります。

私には意味がありません-ユーザーを追加/修正/削除/取得するメソッドは、Usersコレクションクラスではなく、コレクションクラスにある必要がありますCompanies

これらの関数を関連するコレクション クラスに配置すると、同じステートメントを次のように記述する必要があります。

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

しかし、それではうまく読めません.users

私は本当に愚かで、明らかな何かを見逃していますか (私は専門学校に通ったことがないので、皆さんが知っている基本的な何かを見逃している可能性があります)。

どんな助けでも、大歓迎です。どうもありがとう。

4

1 に答える 1

1

あなたの懸念を誤解しているかもしれませんが、これは問題ではないと思います。ユーザー管理メソッドは onCompanyではなくon になりCompaniesます。これは一般的に許容されるパターンです。

Companies/CompanyUsers/の 4 つのクラスがあると仮定してみましょうUser。これでメソッドを定義できます:

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

これは、クラスがその IDCompaniesであなたを取得できることを示しています。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の外部クライアントに公開することを回避します。メッセージを転送するだけです。Companyadd...

この戦略をさらに進めて、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 に答える