Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JetPackComposeは宣言型プログラミングパラダイムって実はよくわかってないんですが、別に使ってもいいんですよね、

 JetPackComposeは宣言型プログラミングパラダイムって実はよくわかってないんですが、別に使ってもいいんですよね、

cOnigashima

June 22, 2022
Tweet

More Decks by cOnigashima

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. xml JetPackCompose

    View full-size slide

  7. xml JetPackCompose

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. これの何が嬉しいん

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  20. 参考
    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/

    View full-size slide