4

今日はちょっと意地悪なことをしてしまいました。

すべてのビュー コントローラーは、2 つの異なる親ビュー コントローラー (XXXViewController と YYYViewController としましょう) から継承します。XXXViewController はTrackedUIViewController、Google アナリティクス SDK で提供されているクラスである を継承しているため、すべてのビュー コントローラーはそれを継承して簡単に追跡できます。

ただし、YYYViewController は別の種類のビュー コントローラーから継承します。ああ、それは私が本当に変更したくないオープンソースのコードです。

ここで何が問題なのですか?TrackedViewController で提供されているメソッドはプライベートであるためアクセスできないため、YYYViewController の子を追跡することはできません。

Google アナリティクス SDK で提供されているソースを変更したくありません。それで、私は何をしましたか?コンパイル エラーを回避するためだけに、これらのメソッドを公開するカテゴリを作成します。

これの明らかな欠点は、GA のソース コードが変更されると破損する可能性があることですが、それを検出するのはかなり簡単です。

これを行うことで他にどのような問題に直面する可能性があるのか​​ 、そして皆さんがより良いアプローチを考えることができるかどうか疑問に思っていました.

ありがとうございました

4

3 に答える 3

3

YYYViewController の継承チェーンを上に行くことができ、継承元のクラスを順番に確認できます。UIViewController の場合は、ソースでその特定のスーパークラスを TrackedUIViewController に変更するだけで問題ありません。

理解を深めるための例: がYYYViewControllerを継承しZZZViewController、さらに が を継承するとしUIViewControllerます。のスーパークラスをZZZViewControllerからUIViewControllerに変更できるようにTrackedUIViewControllerなりました。TrackedUIViewControllerUIViewControllerYYYViewController

お役に立てれば :-)

于 2012-09-18T15:10:37.283 に答える
0

文書化されていないAPIを使用する最大のリスクについてはすでに説明しました。APIへの変更は制御不能であり、たとえばメソッドが削除/名前変更された場合や、メソッドの動作が期待どおりに機能しなくなった場合など、ロジックが破損する可能性があります。

純粋に技術的な観点からは、Objective-Cではすべてのメソッドが公開されているため、これ以上の問題は見られません。それらが存在し続ける限り、あなたはそれらを呼び続けることができます。

于 2012-09-18T14:58:10.753 に答える
0

根本的な問題は過度のサブクラス化だと思います。ビュー コントローラーの階層を浅く保ちます。サブクラス化の代わりにコンポジションを使用します。サブクラス化する必要がある場合は、クラスが提供する機能をそのサブクラスでオン/オフできることを確認してください。

于 2012-09-18T15:14:00.100 に答える