4

私は、約 50,000 の LoC を持つ Objective-C コードベースを紹介されましたが、25% 程度が重複コードであると見積もっています。残念ながら、オブジェクト指向の原則は、コピーと貼り付けのロジックを支持して、コードベースのこの時点までほとんど無視されてきました。わーい!

私はJavaのバックグラウンドから来ており、この重複の多くは古き良き目的指向プログラミングで修正できます。共有ロジックを基本クラスに抽出することは、多くの場合、正しい解決策のように思えます。

ただし、一連の基底クラスを作成して派生クラス間で共通のロジックを共有する前に、立ち止まって、他に利用できるオプションがないかどうかを確認する必要があると考えました。2011 年の Ken Kocienda の「Writing Easy-To-Change Code」WWDC セッションを見た後、彼はオブジェクト階層をできるだけ浅く保つようにアドバイスしています。なぜ彼がこの意見を持っているのかについて、彼は確固たる統計を提供していないので、私は何かを見落としているのではないかと思っています.

私はどう考えても Objective-C の専門家ではないので、オブジェクト階層を決定する際のベスト プラクティスがあるかどうか疑問に思っています。基本的に、基本クラスの作成をやめて、クラス間でコードを共有する方法として継承の代わりに構成を使用することを決定した時期について、意見を求めたいと思います。

また、実行時のパフォーマンスの観点から、オブジェクト階層の作成から私を遠ざけるものはありますか?

4

2 に答える 2

2

Java を含む他のバックグラウンドから iOS に移行することについて、しばらく前にいくつかの考えを書きました。ARCにより、いくつかのことが変更されました。特に、メモリ管理はもはや最前線ではありません。とはいえ、メモリ管理を容易にするためにこれまで行ってきたこと (アクセサーの使用、アクセサーの使用、アクセサーの使用) はすべて ARC でも同様に有効です。

@Raduは、クラス階層をかなり単純で浅いものに保つ必要があることは完全に正しいです(読んだように)。多くの場合、Cocoa では、大規模なサブクラス化よりも構成の方がはるかに優れたアプローチです (これは Java にも当てはまりますが、ObjC では一般的な方法です)。また、ObjC には抽象メソッドやクラスの概念がないため、特定の種類のサブクラス化が少し厄介になります。共有ロジックを基本クラス (特に抽象基本クラス) に抽出するよりも、別の戦略オブジェクトに抽出する方がよい場合がよくあります。

UITableViewデリゲートとデータソースの使用を見てください。IS-A ではなくNSAttributedStringHAS-A のようなものを見てください。NSStringそれは一般的であり、多くの場合、物事をきれいに保ちます。すべての大きなオブジェクト階層と同様に、常にLSPを念頭に置いてください。正方形が長方形ではないことを誰かが忘れると、多くの ObjC デザインが横向きになります。繰り返しますが、これはすべての言語に当てはまりますが、設計するときに覚えておく価値があります。

不変 (値) オブジェクトは、使用できるときはいつでも本当に有利です。

すぐにわかるもう 1 つの点は、「final」や「protected」などの「安全装飾」がほとんどないことです ( はありますが、@protected実際にはそれほど有用ではなく、めったに使用されません)。Java および C++ のバックグラウンドを持つ人々は、さまざまなアクセス ルールをコンパイラが適用することについて心配する傾向があります。ObjC には、ほとんどの保護に対するコンパイラの強制がありません (実行時に任意のオブジェクトに任意のメッセージをいつでも送信できます)。一貫した命名規則を使用するだけで、プライベート メソッドをいじったりしないでください。プログラマーの規律は、コンパイラーの強制に取って代わります。実際には、ほとんどの場合、この方法で問題なく動作します。

とはいえ、ObjC には多くの警告があり、すべての警告を絶対に排除する必要があります。ほとんどの ObjC 警告は、実際にはエラーです。

オブジェクト階層の具体的な質問からは少し外れましたが、役に立てば幸いです。

于 2012-10-13T03:50:30.053 に答える
0

Objective-C の深い階層に関する大きな問題の 1 つは、Xcode がそれらを理解/管理するのにまったく役立たないことです。もう 1 つの理由は、単純に、Objective-C のほぼすべてのものが Java の同等のものよりも約 2 倍複雑になるため、物事をシンプルに保つためにもっと努力する必要があるということです。

しかし、Objective-C での構成は扱いにくいと思います (正確な理由はわかりませんが)。そのため、「完璧な」答えはありません。

Objective-C と Java では小さなサブルーチンがはるかにまれであり、ほぼ同一のビュー コントローラーなどの間でコードが重複している可能性が高いことがわかりました。これの大きな部分は、単に開発ツールと、新しいクラスを作成する際の相対的な扱いにくさだと思います。

PS: 約 55,000 行を含むアプリを作り直さなければなりませんでした。お気づきのように、約 25% の重複があった可能性がありますが、さらに 25% 程度の完全にデッド コードもありました。(ありがたいことに、そのアプリはそれ以来ほとんど放棄されています。)

于 2012-10-13T04:33:03.177 に答える