Showing 2 Result(s)

ActivityとFragmentの違い

前略: Activity と Fragment の使い分けがわからん! 「Androidのプロジェクトを作るとActivityもFragmentもセットで出来上がったりするけど、お互い似たような性質はあるし、結局どのような切り分けで使い分けたら良いかわからない!」という方向けに、それぞれの簡単な仕様や歴史を説明して、それぞれの役割を明確にするための参考情報なればいいなと。 Activity is ライフサイクルを持ったUI兼UIコントローラー。setContentViewで設定したレイアウトをUIとして使うことができる。画面単位で使うのが一般的。画面履歴をスタックで管理でき、バックで前のActivityに戻ることができる。この仕様は、Androidのタスク、起動モード、Activityバックスタックの仕様に密接に関係している。 Fragment is ライフサイクルを持ったUI兼UIコントローラー。onCreateViewで生成したViewをUIとして使うことができる。今は画面単位で使うことが一般的。画面の一部分を表現したり、Fragment同士で親子関係を持つこともできたり、ライフサイクルに合わせたロジックだけを持つこともできるため、幅広い用途で使える。スタック管理ができ、バックで前のFragmentに戻ることができ、このスタックはActivity(または親Fragment)が管理し、Androidのタスク、起動モード、Activityバックスタックの仕様とは関係ない。 Fragment誕生の経緯と有用性 Fragmentは、Tablet用に作られたAndroid3.0から、よりフレキシブルなUI実現のためにActivity上のUIの断片化を目的として生まれた。そのためレイアウト内にどのように配置するかという点でも、Viewのように扱えるように設計されている。これにより、ActivityだけではやりづらかったTab機能やActionBarなど、実際にさまざまなUIを実現しやすくなった。ライフサイクル管理の難しさや、クラスも3種類(※)もあって紛らわしかったりプログラマを躓かせる要素は多く、Fragment反対論もあったが、今は Android Architecture Components (NavigationConmponentやLifeCycleなど)の登場や kotlin-android-extentions(2020以降は非推奨) によって使いやすくなっている。※Fragment3兄弟:長男 android.app.Fragment次男 android.support.v4.app.Fragment年の離れた三男 androidx.fragment.app.Fragment ViewはFragmentの代わりにならないのか? 単純に、ViewをFragmentの代わりにできないのか?という話です。ViewはActivityと連動するようなライフサイクルを持たないため、Activityのライフサイクルと連動する必要のある処理を作ろうとすると、ActivityからViewにライフサイクル完了と終了を通知する仕組みを考えなければならず、相当しんどいです。代わりにならないことはないですが、相当しんどいですので、代わりにならないといっても過言ではないです。 タスクとActivityバックスタックの呪縛からの解放 Fragmentができる前までは、Activityのスタック管理が Android の「タスクとバックスタック」管理の仕様と密接に関係しているため、設定を間違えるとバックで戻ったときなどに意図しない画面遷移をしてしまうというような、アプリ間遷移を考慮したアプリ内画面遷移の設計の難しさの問題がありました。Android は、タスクにActivityを積む仕組みで履歴を管理しているが、このタスクというのはアプリに閉じているわけではありません。別のアプリのActivityも同じタスクに積んだり、同じアプリでも別のタスクとして積むことができます。これは、インストールされたapkのActivity(公開されている)というのは Android からみればただのパッケージ名を持ったActivityの集合でしかなく、どのアプリかという厳密な枠組みは持たずに、設定値に準じてスタック管理する仕様だからです。(どういう意図かはわかりませんが。)基本的には同一パッケージ名のActivityがスタックされていく仕様ですが、UIUX検討の中で細かい設定を入れざるを得ない場合があり、そういったときにはどうしてもこの問題にぶつかります。(例えばとあるサービスを利用するためのライブラリが提供するそのサービスのログインUIのActivityが、アプリのActivtiyの起動モードの方針と違う設定で、ライブラリを使う部分だけアプリの意図しない遷移を実現できてしまい、バグの要因になる、とか。抽象的でわかりにくい例かもしれないですが。。。)しかし、FragmentスタックはActivity(または親Fragment)が管理しておりアプリに閉じているため、アプリ内でOSのタスク仕様に依存しないスタック管理がしやすくなりました。 Activity神格化からの解放 プレゼンテーションロジックがActivityに集約されがちで、神オブジェクト化し人間が手を出せなくなることは珍しくありませんでしたが、Fragmentができてから処理が分散され軽減されました。また、今では、MVPアーキテクチャ、MVVMアーキテクチャ、クリーンアーキテクチャなどのアーキテクチャパターンをアプリに適用することで、プレゼンテーションロジックを持つクラスはFragmentとは別に管理しようとすることが主流です。 まとめ こういった理由から(他にもあると思うけど)、ActivityもFragmentの似たような性質はあるけど、Fragmentを使うことで以下の利点が出てきます。 Activityが神オブジェクトから開放され、コードの可読性があがる フレキシブルなUIUXを提供しやすくなる Activityのスタック仕様を意識しなくてよくなる ただし、似たような性質があるので役割を明確にしないとチーム開発では混乱を招きますので役割を明確にするのがよいと思います。個人的には↓のように切り分けるのが好みです。 Activity は Fragment をコントロールする Fragment がUIをコントロールする Activity はアプリ全般(アプリのフォアグラウンド・バックグラウンド)のライフサイクルを管理する Fragmentには画面単位のライフサイクルを管理する 以上です! 参考 Activity起動モード仕様参考- **激参考になる**: https://itnext.io/the-android-launchmode-animated-cheatsheet-6657e5dd9b0f https://developer.android.com/guide/components/activities/tasks-and-back-stack?hl=ja …

レガシーコードからの脱却 10.1 – 10.1.3

10.1 テストと呼ばれるもの 内容 テスト駆動開発の話の前に、一般的なテストの種類と目的を理解しようという前置き。 10.1.1 受け入れテスト=顧客テスト 受け入れテスト、あるいは顧客テストはストーリーのふるまいを明確にするもの。受け入れ基準を定義することで、受け入れテストがどうなったら終わりになるか明確になる。それにより、 開発者が特定のエッジケースや例外のシナリオの理解に役立つ 開発者がどうなれば正解か理解しきれずに進めてしまい、作り過ぎてしまうことを防止する などの効果がある。これにより開発者は安心して進む事が出来る。受け入れテストツールにGherkinという自動化ツールがあることの紹介。受け入れテスト駆動開発に関する書籍2冊紹介。 Lean-Agile Acceptance Test-Driven-Development Specification by Example 10.1.2 ユニットテスト=開発者によるテスト ユニットテストの概要が書いてある。 ストーリーよりも小さいテスト 開発者がテスト駆動開発で作るテストコードによるテスト ドキュメントとしても機能する 将来の変更時のミスを見つけるための回帰テストにもなる 10.1.3 それ以外のテスト=QAテスト ワークフロー中のコンポーネント間の相互作用をテストする結合テストのように、QAプロセスの「一部」になる。結合テストは、モックではない実際の依存関係を使用してコンポーネント間の相互作用をテストする。そのためユニットテストより多くの依存関係をビルドするのでビルド時間がかかる。 機能をテストするために、ユーザーの入力をシミュレーションするツールを使うこともあるが、これがテストの唯一の方法なら、考慮すべき設計上の制約があるかもしれない。できるかどうかはさておき、簡単に検証できるようにテスト可能なコードを書くことを追求すべき。 テストを2つのカテゴリに分類するとする。 リリース候補を検証するために必要なテスト そのほかすべて これらはできるだけ多く自動化することが重要だが、リリース候補のテストをすべて自動化することはさらに重要。人間を介入させると、外部への依存性が生まれ、うまくいかないことがあるからだ。問題が起きる可能性を最小限にするために、できるだけ依存関係を少なくなるようにするが、ソフトウェア開発プロセスも依存関係を少なくすることが必要だ。GPSなどの機能は人間によるテストが必要なケースだが、そういう場合はコンポーネントを切り分けて必要なところだけを人間に任せる。 学び 受け入れテストはストーリーの振る舞いを明確にするものであり、これが要件である。 これを基準にテストの増えすぎや実装の増えすぎを抑えることができる。 テストスイートの意味。テストの集合。 上記「内容」 結合テストの定義について明確になった。モックではなく実際の依存関係を使い、コンポーネント間の相互作用をテストする。 問題を減らすためにソフトウェア開発プロセスにおける依存関係も減らす。 人間を介入させると外部への依存関係が増える。 学びを活かすアイディア・行動 テストコードの目的の前提知識整理 受け入れテスト自動化の学習 現場のテストコードのコーディング規約づくり