私はObjective-Cで作成された適切なデリゲートプロトコルを持っており、それを更新しています。更新の1つでは、メソッドを非推奨にする必要がありますが、技術的には当面は有効です。
これが元のデリゲートメソッドです。これはオプションであるため、必須の方法ではないことに注意してください。これは、機能を維持する必要があるかどうかについての私の判断を曇らせます。
@protocol MyDelegate <NSObject>
@optional
- (void)requestFailedWithError:(NSError *)error;
@end
それはクラスで明白にそして単純に2つの場所で使われました。そのようです:
if ([self.delegate respondsToSelector:@selector(requestFailedWithError:)]) {
[self.delegate requestFailedWithError:error];
}
今、私は更新しました。アップデートでは、エラーが発生した時期に基づいて関数を一意のエラーリターンに分割する方が適切なオプションのように見えました。これは、このメソッドの使用が2か所以上に増え、応答が大きく異なる可能性があるためです。これにより、コンシューマーは特定のタイプのエラーを無視するか、少なくとも巨大なif
ステートメントなしで各エラーを異なる方法で処理できます。これらは新しいデリゲートメソッドです。
@protocol MyDelegate <NSObject>
@optional
- (void)aRequestFailedWithError:(NSError *)error;
- (void)bRequestFailedWithError:(NSError *)error;
- (void)requestFailedWithError:(NSError *)error DEPRECATED_ATTRIBUTE;
@end
クラスでは期待どおりに呼び出していますが、クラスが新しいメソッドを実装していない場合は、非推奨のメソッドにフェイルオーバーしています。もちろん、どちらの方法もない場合は何もしません。
if ([self.delegate respondsToSelector:@selector(aRequestFailedWithError:)]) {
[self.delegate aRequestFailedWithError:error];
} else {
if ([self.delegate respondsToSelector:@selector(requestFailedWithError:)]) {
[self.delegate requestFailedWithError:error];
}
}
当時は良い考えのように思えましたが、非推奨になっている間も機能を維持することで、メソッドを必要以上に長くひもでつなぐだけですか?非推奨のメソッドは機能するはずですが、お勧めできません。次に、時が来たら、メソッド全体をヤンクします。
これは一般的な慣習、良い考えなどのように見えますか?すべてのコメントを歓迎します。このタイプのAPIの変更に対処するときは、最適なパターンを探すだけです。