mobile-best-practice/chapters/MBP_019_fr.md

75 lines
2.8 KiB
Markdown
Raw Permalink Normal View History

2024-02-07 15:07:29 +00:00
## Jetpack Compose : Améliorer la "skipabilité" d'une fonction pour réduire le nombre de recomposition inutile
### Identifiants
//TODO
### Catégories
| Cycle de vie | Tiers | Responsable |
|:---------:|:----:|:----:|
| 3. Réalisation (fabrication / développement) | Utilisateur/Terminal | Architecte Logiciel/Développeur |
### Indications
| Degré de priorité | Mise en oeuvre | Impact écologique |
|:-------------------:|:-------------------------:|:---------------------:|
| 4 | 4 | 4 |
|Ressources Economisées |
|:----------------------------------------------------------:|
| Processeur |
### Description
L'une des optimisations faites par Jetpack Compose :
* Éviter le plus possible de recomposer un composant qui nest pas impacté par un changement détat.
Pour cela, Jetpack Compose calcule la "skipabilité" d'une fonction, en évaluant d'abord la **stabilité de ses paramètres**.
Stabilité des paramètres :
* **Immutable**
* **Stable** : Type mutable mais pour lequel Jetpack Compose sera notifié en cas de changement de l'une de ses propriétés publiques.
* **Unstable**
3 situations typiques où Jetpack Compose ne peut pas définir une fonction comme `skippable` :
1. La propriété est mutable à cause d'une variable mutable déclarée avec `var`
2. La propriété est de type `List`, `Set` ou `Map`. En effet, ces types sont considérés comme unstable par Compose.
3. La propriété utilise un type provenant d'une dépendance externe.
L'outil [Compose Compiler Report](https://developer.android.com/jetpack/compose/performance/stability/diagnose#compose-compiler) permet d'obtenir facilement un rapport analysant la stabilité des fonctions Composable d'un projet Android.
2024-02-09 09:24:42 +00:00
Il peut être intéressant de mener ce genre d'analyse sur les fonctions Composable les plus riches d'une application.
2024-02-07 15:07:29 +00:00
### Exemple
Pour améliorer la "skipabilité" d'une fonction Composable et ainsi ne pas trop sollicité le processeur, il faut :
1. Utiliser `val` plutôt que `var`.
2. Utiliser `ImmutableList` (KotlinX) :
```shell
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:${version}")
}
```
3. Marquer une data classe comme `@Immutable` si elle utilise un type provenant d'une dépendance externe
```kotlin
@Immutable
data class LogEntry {
val timestamp: LocalDateTime,
val log: String
)
```
### Principe de validation
2024-02-09 09:24:42 +00:00
| Le nombre ... | est inférieur ou égal à |
|-------------------------------------------------------------------------------------------|:-----------------------:|
| Fonctions Composables riches dans l'application dont la skipabilité n'a pas été optimisée | 40% |