Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JetPackComposeは宣言型プログラミングパラダイムって実はよくわかってないんですが、...
Search
cOnigashima
June 22, 2022
Programming
0
1.1k
JetPackComposeは宣言型プログラミングパラダイムって実はよくわかってないんですが、別に使ってもいいんですよね、
cOnigashima
June 22, 2022
Tweet
Share
More Decks by cOnigashima
See All by cOnigashima
技術ブログを執筆依頼するときに アウトプットによるメリット を考えたはなし
conigashima
0
28
Androidエンジニア少ない!どうしたらいい!
conigashima
0
1k
今更聞けない_Playアプリ署名.pdf
conigashima
0
710
Other Decks in Programming
See All in Programming
Trem on Rails - Prompt Engineering com Ruby
elainenaomi
1
100
TDD 実践ミニトーク
contour_gara
1
270
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
110
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
25
9.6k
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
1
290
CSC305 Summer Lecture 12
javiergs
PRO
0
130
TanStack DB ~状態管理の新しい考え方~
bmthd
2
370
未来を拓くAI技術〜エージェント開発とAI駆動開発〜
leveragestech
2
200
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
690
Laravel Boost 超入門
fire_arlo
2
170
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
740
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
290
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Speed Design
sergeychernyshev
32
1.1k
Agile that works and the tools we love
rasmusluckow
330
21k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
910
KATA
mclloyd
32
14k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
110
20k
Fireside Chat
paigeccino
39
3.6k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Code Review Best Practice
trishagee
70
19k
Designing Experiences People Love
moore
142
24k
Embracing the Ebb and Flow
colly
87
4.8k
Art, The Web, and Tiny UX
lynnandtonic
302
21k
Transcript
JetPackComposeは宣言型プログラミングパラダイ ムって実はよくわかってないんですが、別に使って もいいんですよね、 使ったらAndroid開発がいい方向に進むんでしょう か
自己紹介 • 大西泰司 • Andoridエンジニア5年生 • 株式会社FiNC Technologies所属
目的 下記項目をなんとなく理解する • 「Jetpack Compose は Android 向けの最新の宣言型 UI ツールキットです。」とい
う公式の文言 • それはJetPackComposeがいい感じの開発ってことを意味する? • 命令型と宣言型とか • オブジェクト指向とか関数型プログラミングとか • 厳密な話はしない🥺
命令型プログラミング ・宣言型プログラミング wiki調べ >命令型プログラミングは、プログラムの状態を変化させるステートメントを基本文に用 いる総称的なプログラミングパラダイムである。 >宣言型言語は、ドメイン知識における”what the program must accomplish”(何をなす
べきか)方針で、副作用を排除した式や純粋関数の実装に努める 🤔
命令型と宣言型を大雑把に考える • 命令型 ◦ これまでのxmlでのView • 宣言型 ◦ JetPackCompose
xml JetPackCompose
xml JetPackCompose
xml ビュー階層はウィジェットのツリーとして表現され、 インスタンス化する。各ウィジェットは自身の内部 状態(ステート)を維持し、アプリのロジックで操作 できるようにするsetter/getterを公開します。 ウィジェットはステートレスで、基本的にオブジェクト ではなく関数。setter/getterは公開されない。 JetPackCompose
xml ビュー階層はウィジェットのツリーとして表現され、 インスタンス化する。各ウィジェットは自身の内部 状態(ステート)を維持し、アプリのロジックで操作 できるようにするsetter/getterを公開します。 ウィジェットはステートレスで、基本的にオブジェクト ではなく関数。setter/getterは公開されない。 JetPackCompose オブジェクト指向プログラミング (OOP)的
関数型プログラミング(FP)的
オブジェクト指向プログラミング (OOP) 関数型プログラミング(FP) Viewオブジェクトにsetterで命令し、状態を変更して いる。 @Composable アノテーションによってこの関 数がデータを UI に変換するためのものである
ことをコンパイラに伝え UI を記述。
これの何が嬉しいん
これの何が嬉しいん キーワード • 不変と純粋関数 • ステートレスと状態ホイスティング
不変と純粋関数 CircleCIのブログから引用 • FP の原則ではすべての値を不変として扱います。 値を変更するには、作成済み の値を基本値やコピーとして使用するなどして、新しい値を作成するしかありませ ん。 • FP
では、不変データ型を導入することで、純粋関数を実現できます。 純粋関数と は、引数によってのみ定義される関数です。 引数は変更できないので、純粋関数 は予想どおりに動作することが保証されます。 つまり、引数が同じであれば、返さ れる結果も常に同じです。 他のプログラミング手法では、このような挙動の予測可 能性は保証されません。 https://circleci.com/ja/blog/functional-vs-object-oriented-programming/
不変と純粋関数 • Composable関数は高速な冪等であり副作用がない(であるべき)。 • 何回やっても同じ結果になる、違う値を入れると違うUI ◦ インテリジェントな再コンポーズの話
ステートレスと状態ホイスティング Android Developer 公式の説明 • ステートレスなコンポーザブルとは、一切の状態を保持しないコンポーザブルです。 ステートレスは、状態ホイスティングを使用すると簡単に実現できます。 ◦ オブジェクト指向と異なり、状態を持たない •
状態ホイスティングは、状態をコンポーザブルの呼び出し元に移動してコンポーザ ブルをステートレスにするプログラミング パターンです。 ◦ 関数に渡す引数によって UIを記述する ◦ 依存性注入(Dependency Injection)
ステートレスと状態ホイスティング • コンポーザブル関数から状態を巻き上げ、ロジックを適切なレイ ヤーまで押し上げを考慮させる • 単一データフロー
最終的に公式が考えるアーキテクチャ
これの何が嬉しいん JetPackComposeのコンポーザブル関数、UI記述パターンに従うことで • 関心の分離に則ったプログラミングパターンを実践させる • 状態をViewから引き剥がし、アーキテクチャ意識させる ことが可能
結論 • 「Jetpack Compose は Android 向けの最新の宣言型 UI ツールキットです。」とい うことが意味するのは
• JetPackComposeはより安全なAndroid開発を行うUIツールである その背景として • オブジェクト指向プログラミング・関数型プログラミングのエッセンス、プログラミング のベストプラクティスや原則に基づいている
参考 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/