Slide 1

Slide 1 text

JetPackComposeは宣言型プログラミングパラダイ ムって実はよくわかってないんですが、別に使って もいいんですよね、 使ったらAndroid開発がいい方向に進むんでしょう か

Slide 2

Slide 2 text

自己紹介 ● 大西泰司 ● Andoridエンジニア5年生 ● 株式会社FiNC Technologies所属

Slide 3

Slide 3 text

目的 下記項目をなんとなく理解する ● 「Jetpack Compose は Android 向けの最新の宣言型 UI ツールキットです。」とい う公式の文言 ● それはJetPackComposeがいい感じの開発ってことを意味する? ● 命令型と宣言型とか ● オブジェクト指向とか関数型プログラミングとか ● 厳密な話はしない🥺

Slide 4

Slide 4 text

命令型プログラミング ・宣言型プログラミング wiki調べ >命令型プログラミングは、プログラムの状態を変化させるステートメントを基本文に用 いる総称的なプログラミングパラダイムである。 >宣言型言語は、ドメイン知識における”what the program must accomplish”(何をなす べきか)方針で、副作用を排除した式や純粋関数の実装に努める 🤔

Slide 5

Slide 5 text

命令型と宣言型を大雑把に考える ● 命令型 ○ これまでのxmlでのView ● 宣言型 ○ JetPackCompose

Slide 6

Slide 6 text

xml JetPackCompose

Slide 7

Slide 7 text

xml JetPackCompose

Slide 8

Slide 8 text

xml ビュー階層はウィジェットのツリーとして表現され、 インスタンス化する。各ウィジェットは自身の内部 状態(ステート)を維持し、アプリのロジックで操作 できるようにするsetter/getterを公開します。 ウィジェットはステートレスで、基本的にオブジェクト ではなく関数。setter/getterは公開されない。 JetPackCompose

Slide 9

Slide 9 text

xml ビュー階層はウィジェットのツリーとして表現され、 インスタンス化する。各ウィジェットは自身の内部 状態(ステート)を維持し、アプリのロジックで操作 できるようにするsetter/getterを公開します。 ウィジェットはステートレスで、基本的にオブジェクト ではなく関数。setter/getterは公開されない。 JetPackCompose オブジェクト指向プログラミング (OOP)的 関数型プログラミング(FP)的

Slide 10

Slide 10 text

オブジェクト指向プログラミング (OOP) 関数型プログラミング(FP) Viewオブジェクトにsetterで命令し、状態を変更して いる。 @Composable アノテーションによってこの関 数がデータを UI に変換するためのものである ことをコンパイラに伝え UI を記述。

Slide 11

Slide 11 text

これの何が嬉しいん

Slide 12

Slide 12 text

これの何が嬉しいん キーワード ● 不変と純粋関数 ● ステートレスと状態ホイスティング

Slide 13

Slide 13 text

不変と純粋関数 CircleCIのブログから引用 ● FP の原則ではすべての値を不変として扱います。 値を変更するには、作成済み の値を基本値やコピーとして使用するなどして、新しい値を作成するしかありませ ん。 ● FP では、不変データ型を導入することで、純粋関数を実現できます。 純粋関数と は、引数によってのみ定義される関数です。 引数は変更できないので、純粋関数 は予想どおりに動作することが保証されます。 つまり、引数が同じであれば、返さ れる結果も常に同じです。 他のプログラミング手法では、このような挙動の予測可 能性は保証されません。 https://circleci.com/ja/blog/functional-vs-object-oriented-programming/

Slide 14

Slide 14 text

不変と純粋関数 ● Composable関数は高速な冪等であり副作用がない(であるべき)。 ● 何回やっても同じ結果になる、違う値を入れると違うUI ○ インテリジェントな再コンポーズの話

Slide 15

Slide 15 text

ステートレスと状態ホイスティング Android Developer 公式の説明 ● ステートレスなコンポーザブルとは、一切の状態を保持しないコンポーザブルです。 ステートレスは、状態ホイスティングを使用すると簡単に実現できます。 ○ オブジェクト指向と異なり、状態を持たない ● 状態ホイスティングは、状態をコンポーザブルの呼び出し元に移動してコンポーザ ブルをステートレスにするプログラミング パターンです。 ○ 関数に渡す引数によって UIを記述する ○ 依存性注入(Dependency Injection)

Slide 16

Slide 16 text

ステートレスと状態ホイスティング ● コンポーザブル関数から状態を巻き上げ、ロジックを適切なレイ ヤーまで押し上げを考慮させる ● 単一データフロー

Slide 17

Slide 17 text

最終的に公式が考えるアーキテクチャ

Slide 18

Slide 18 text

これの何が嬉しいん JetPackComposeのコンポーザブル関数、UI記述パターンに従うことで ● 関心の分離に則ったプログラミングパターンを実践させる ● 状態をViewから引き剥がし、アーキテクチャ意識させる ことが可能

Slide 19

Slide 19 text

結論 ● 「Jetpack Compose は Android 向けの最新の宣言型 UI ツールキットです。」とい うことが意味するのは ● JetPackComposeはより安全なAndroid開発を行うUIツールである その背景として ● オブジェクト指向プログラミング・関数型プログラミングのエッセンス、プログラミング のベストプラクティスや原則に基づいている

Slide 20

Slide 20 text

参考 Android Developer公式 https://developer.android.com/jetpack/compose/mental-model?hl=ja https://developer.android.com/jetpack/compose/lifecycle?hl=ja どちらを選ぶ?関数型プログラミングとオブジェクト指向プログラミング(OOP) https://circleci.com/ja/blog/functional-vs-object-oriented-programming/