8

通知の問題はうまく機能する解決策がありますが、悪い考えかもしれません。

クラスの各インスタンスとクラス自体で処理する必要がある通知があります。これを処理するために、クラスとクラスのインスタンスの両方による通知を登録しています。まったく同じ通知なので、クラスとインスタンスのメソッドに同じ名前を付けました。これは、通知ハンドラーの命名方法について設定した標準に従います。

これは悪い考えですか?私が行方不明になっている隠されたものはありますか?私は将来の開発者を混乱させるでしょうか?

+ (void)initialize
{
    if (self == [SICOHTTPClient class]) {
        [[self notificationCenter] addObserver:self
                                      selector:@selector(authorizationDidChangeNotification:)
                                          name:SICOJSONRequestOperationAuthorizationDidChangeNotification
                                        object:nil];
    }
}

- (id)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];

    if (self) {
        self.parameterEncoding = AFJSONParameterEncoding;
        [self registerHTTPOperationClass:[SICOJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];

        if ([[self class] defaultAuthorization])
            [self setDefaultHeader:@"Authorization" value:[[self class] defaultAuthorization]];

        [[[self class] notificationCenter] addObserver:self
                                              selector:@selector(authorizationDidChangeNotification:)
                                                  name:SICOJSONRequestOperationAuthorizationDidChangeNotification
                                                object:nil];
    }

    return self;
}

- (void)dealloc
{
    [[[self class] notificationCenter] removeObserver:self
                                                 name:SICOJSONRequestOperationAuthorizationDidChangeNotification
                                               object:nil];
}

#pragma mark Notifications

- (void)authorizationDidChangeNotification:(NSNotification *)notification
{
    NSString *authorization = notification.userInfo[SICOJSONRequestOperationAuthorizationKey];

    if ([authorization isKindOfClass:[NSString class]]) {
        [self setDefaultHeader:@"Authorization" value:authorization];
    } else {
        [self clearAuthorizationHeader];
    }
}

+ (void)authorizationDidChangeNotification:(NSNotification *)notification
{
    NSString *authorization = notification.userInfo[SICOJSONRequestOperationAuthorizationKey];

    if ([authorization isKindOfClass:[NSString class]]) {
        [self setDefaultAuthorization:authorization];
    } else {
        [self setDefaultAuthorization:nil];
    }
}
4

2 に答える 2

4

これがコードコメントの目的です:)

同じ名前のクラスメソッドとインスタンスメソッドを使用するObjectiveCでは問題はありません。

私はどちらかを提案します:

  • これを処理するように通知メソッド名の仕様を修正する(次に、適切な名前の別のメソッドでクラス通知を処理する)、または

  • 将来の潜在的に混乱している開発者の利益のために何が起こっているかを説明するために適切なコメントを追加する

于 2012-12-06T16:28:01.667 に答える
1

言語自体とランタイムは、あなたがしていることに曖昧さを感じません。だからあなたはその面で安全です。

将来のメンテナを混乱させるという点では、手動で呼び出す方法ではないため、愚かなオートコンプリートの間違いについてあまり心配する必要はないと思います。

そうは言っても、私はクラスのものを人工的なカテゴリーに移したくなるでしょう。これにより、ページが分離されるだけでなく、クラスがインスタンスの応答とは別の機能のトランシェとして応答することを明示することができます。

于 2012-12-06T16:31:00.520 に答える