グループで相続の代わりにActivityに何を持ってきますか?

2797 ワード

グループで相続の代わりにActivityに何を持ってきますか?
  • 原文リンク:Compsition over Inherityance、What it means for your Activities
  • 原作者:Josh Brown
  • 訳文:開発技術前線www.devtf.cn
  • 訳者:chaossss
  • 校正者:Mr.Simple
  • 状態:完了
  • 実際に多くのJava進級書で「開発する時は、継承ではなく組み合わせを選ぶべきだ」という提案を見たことがありますが、なぜ私達は完全に代替するのではなく、A類が他の種類のB(BをAの親にしたいです)に完全に代わることができる時、継承を使うべきです。AがBと何らかの共通の行為をしているだけであれば、継承を使うべきではない。しかし、他の人のソースコードを読む時、継承の濫用は多すぎます。何人かの人がBaseActivityを作成した後、すべてのActivityにそれを継承させて、サブActivityで業務ロジックを実現します。
    そして、このようにして問題が大きくあります。一番生きている例としては、Joe Newguyが私たちのグループに加入し、ShinnyFeature Activityを実現しました。そのグループには何の規定もありません。彼にShinyFeature ActivityをBaseActivityに引き継がなければならないように強制しましたが、彼はやはりこのようにしました。また、各ActivityがBaseActivityに継承されている場合、他のActivity(例えば、PreferenceActivity、ListActivity)が継承される場合があります。ほとんどのActivityのサブクラスは対応するフラジャイティがありますが、フラジャイティに対応していない部分があります。いくつかのライブラリはまだ対応するActivityサブクラスが必要です。
    いくつかの潜在的な問題は:いくつかのActivityはこれらの行為を必要とし、他のActivityは他の行動を必要としますが、Javaは多くの継承をサポートしていません。これは私たちが行動を交差させるActivityのすべての行為を独立したクラスに入れなければなりません。しかし、このようにすると維持性が低下し、性能にも影響が出ます。
    実は、私たちはこのようにする動機は簡単です。コード多重です。確かに、コード多重は重要です。私達の大部分の公共のロジックはActivityライフサイクルのある一環で実現する必要があります。しかし、Apple.ActivityLifecycleCallbacksは非常に卵の痛みを伴う遊びであり、Apple.onCreate()の方法で登録する必要があるかもしれません。最も皮肉なことに、Apple.onCreate()の方法で登録しないように工夫しています。
    これもViewをバインディングしていないFragmentの由来です。無数のAndroid開発者がFragmentをUIコンポーネントとして見ている時、実はFragmentはライフサイクルのようなものです。なぜこれらのFragmentはViewと紐付けされていないと言いますか?これらの開発者の手には、FragmentのonCreateView()方法が書き換えられていないし、nullに戻ってきていないからです。本質的には、Fragmentはイベントを処理または操作できるコンポーネントであり、それ自体に対応するViewがない。
    Viewと結びつけられていないFragmentとViewに向けたFrangeを区別するために、名前をつける時はViewと結びつけられていないFrangeをXXXXHelper*と命名します。他はXFragmentと名づけます。例えば、AnalyticsHelperは関連分析ロジックのFragmentを表し、HeaderFragmentはタイトルバーを示しています。もちろん、このようにやってみてもいいです。私の提案を無視してもいいです。私自身は役に立つと思います。
    これらのバインディングされていないViewのFragmentにはUIコンポーネントがないということは、これらのFragmentの中で初期化のレイアウトに必要なLayout-IDやViewに必要なアニメーションを考慮する必要がないということです。工場モードでこれらのFragmentを開発し、工厂法の使いやすさを向上させることができます。この点については、彼らはFragment自身を追加する操作ができます。Gistを作って皆さんにどうやってできるかを紹介します。興味があれば、ポイントを入れてみてください。Android-Studioを使って開発すれば、設定されたFile and Code Templatesオプションに追加して、新しいクラスを作成するときにKindドロップダウンオプションで選択できます。
    FooHelperをその親類に追加するのはとても簡単です。FooHelper.atach(this)を呼び出すだけでいいです。しかし、対応する親の種類がFooHelperのフィードバックインターフェースを実現していないとコンパイルエラーが発生します。また、atch()メソッドが呼び出された場合、この方法の戻り値は以前のFragmentとなります。このGistは、FragmentとActivityの重み付けを含み、それを使用サポートのFragementとFragment Activityに変換する意味が非常に大きい。また、FragmentUtils.get Partent()の簡略版、getPartent()の方法も含まれています。
    明らかに、ViewをバインディングしていないFragmentはBaseActivityよりずっと使いやすいです。それらはよくカプセル化されています。ライフサイクルのフィードバックが必要です。一番いいのは、Activity共通のいくつかのロジックを職責単一のモジュールコンポーネントに分解できます。Activityにはどんなロジックが必要ですか?モジュールを選んで使います。もしあなたのActivityのほとんどが同じモジュールを必要としているなら、Common ComponentsHelperがこれらの共通論理を処理するために使用されない理由はありません。そしてActivityのすべての共通依存性をベースクラスに置く必要はありません。