コンポーズ (Compose)
概要
コンポーズ(Compose)は、ソフトウェア開発において複数の構成要素を宣言的に組み合わせて(compose)一つの成果物を作る技術群を総称する名前である。最も広く使われる例は、AndroidのネイティブUIツールキットであるJetpack Composeであり、コンテナオーケストレーションツールであるDocker Composeも同じ名前を共有している。両技術はいずれも「命令型で一つずつ制御する代わりに、望む最終状態を宣言して組み合わせる」という宣言型パラダイムを共有する点で、概念的関連が深い。
主な内容
Jetpack Compose
Jetpack Composeは、Googleが2019年のGoogle I/Oで初めて公開し、2021年に正式1.0版を発表したAndroid向け宣言型UIフレームワークである。従来のXMLレイアウト + findViewById方式と異なり、Kotlin関数に@Composableアノテーションを付けてUIをコードで直接記述する。
kotlin
@Composable
fun Greeting(name: String) {
Text(text = "Hello, $name!")
}
主な特徴は以下のとおりである。
- 宣言型UI: 状態(state)が変わると、フレームワークが自動的に画面を再描画する。開発者は「何を表示するか」だけを記述する。
- リコンポジション(Recomposition): 状態が変更されたコンポーザブル関数のみを選択的に再実行し、パフォーマンスを最適化する。
- State Hoisting: 状態を上位のコンポーザブルへ引き上げ、単方向データフローを実装する推奨パターンである。
- Material Design 3 サポート:
MaterialThemeを通じて色、タイポグラフィ、形状を一貫して管理する。 - プレビューとツール群: Android Studioの
@Previewアノテーションでリアルタイムプレビューが可能である。
Docker Compose
Docker Composeは、複数のコンテナを一つのYAMLファイル(docker-compose.yml)で定義し、まとめて実行・管理するツールである。Webサーバー、データベース、キャッシュなどを一度に立ち上げるローカル開発環境の構成に広く使われる。
yaml
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: example
その他のCompose系
- Compose Multiplatform: JetBrainsが主導し、同一のKotlin UIコードでAndroid、iOS、デスクトップ、Webをまとめてサポートする。
- Docker Compose Specification: 2021年以降、オープン標準として分離され、さまざまなランタイムが採用している。
最新動向
2024~2025年時点で、Jetpack ComposeはAndroidの新規プロジェクトにおける事実上の標準(de facto standard)として定着した。GoogleはComposeを基盤としたCompose for Wear OS、Compose for TV、Compose for Autoなどのフォームファクター拡張を続けており、Compose BOM(Bill of Materials)を通じてライブラリのバージョン管理を簡素化した。
特に注目すべき変化は、Compose Multiplatformの安定化である。2024年にiOSサポートが安定(stable)段階に入り、Kotlin一つでAndroid・iOS・デスクトップUIを共有しようとする試みが増えている。また、Kotlin Multiplatform(KMP)との組み合わせにより、ビジネスロジックまで共有するアーキテクチャが広がる傾向にある。
一方、Docker Composeは2023年以降、Compose V2(Go言語で書き直された)が既定となり、docker compose(ハイフンなし)コマンドに統合された。2024年にはDocker Desktopのライセンスポリシー変更に伴い、Podman Compose、Colimaなどの代替ランタイムの利用も増加した。生成AIと組み合わせてUIコードを自動生成したり、コンテナ構成を自動化したりする事例も増えつつある。
関連トピック
- [[Jetpack Compose]]
- [[Docker]]
- [[Kotlin]]
- [[Compose Multiplatform]]
- [[宣言型UI]]
- [[Android]]
- [[コンテナ]]