MFormations
Modern Mobile Engineering

Chapitre 25

25 - Annexes

25 - Annexes

25 - Annexes

Objectifs pédagogiques

À la fin de ce chapitre, vous serez capable de :

  1. Retrouver la définition de plus de 200 termes du vocabulaire mobile
  2. Consulter les cheat sheets Kotlin, Swift, Compose, SwiftUI, Dart, Flutter et React Native
  3. Reconnaître et appliquer les design patterns mobile
  4. Utiliser ces annexes comme référence rapide pendant le cours et en production

Plan du chapitre

SectionSujet
1Glossaire (200+ termes)
2Cheat sheet Kotlin
3Cheat sheet Swift
4Cheat sheet Jetpack Compose
5Cheat sheet SwiftUI
6Cheat sheet Dart
7Cheat sheet Flutter
8Cheat sheet React Native
9Design patterns mobile

Fichiers du chapitre

FichierContenu
course.mdGlossaire + cheat sheets + patterns (700+ lignes)
references/README.mdSources et approfondissements

Temps estimé

  • Lecture du glossaire : 1 h
  • Parcours des cheat sheets : 2 h
  • Exercices d'application : 3 h

Section 1 — Glossaire (200+ termes)

1.1 Langages et fondamentaux (25 termes)

TermeDéfinition
KotlinLangage JVM moderne, recommandé par Google pour Android (null-safety, coroutines).
SwiftLangage d'Apple, sûr, rapide, moderne (optionals, value types).
DartLangage de Flutter, compilé AOT pour le mobile, JIT en dev.
TypeScriptSuperset JavaScript typé, utilisé avec React Native.
Null-safetySystème empêchant l'usage d'une valeur potentiellement nulle sans contrôle.
OptionnelType qui peut être vide (nil / null) ; String? en Swift/Kotlin.
Data classClasse Kotlin générant equals/hashCode/copy/toString.
StructType valeur Swift (copie à l'assignation).
EnumType énuméré ; en Swift, peut porter des valeurs associées.
GenericsProgrammation paramétrée par types (List<T>).
ExtensionFonction/propriété ajoutée à un type sans le modifier (Kotlin/Swift).
ProtocolContrat d'interface en Swift, équivalent d'une interface Kotlin.
ClosureBloc de code capturant son contexte (Swift).
LambdaFonction anonyme (Kotlin/Java).
CollectionEnsemble de valeurs (List, Set, Map).
ImmutabilitéÉtat qui ne change jamais ; évite les bugs de concurrence.
Garbage CollectorLibération automatique de la mémoire non référencée (JVM/Dart).
ARCGestion de mémoire par comptage de références (Swift/Objective-C).
Compile-timeCe qui est vérifié par le compilateur avant exécution.
RuntimeCe qui se produit pendant l'exécution.
Debug/ReleaseModes de build : développement vs production optimisée.
BytecodeCode intermédiaire exécuté par la JVM ou Dart VM.
AOTAhead-Of-Time : compilation avant exécution (Dart en release).
JITJust-In-Time : compilation à l'exécution (Dart en dev, JVM).
Stack/HeapMémoire : pile (calls) et tas (objets).

1.2 Android (30 termes)

TermeDéfinition
ActivityÉcran/point d'entrée avec cycle de vie propre.
FragmentPortion d'UI réutilisable avec son propre cycle de vie.
ServiceComposant de fond sans UI.
BroadcastReceiverÉcoute d'événements système (batterie, boot…).
ContentProviderInterface de partage de données entre apps.
IntentMessage de demande d'action (explicite/implicite).
ManifestAndroidManifest.xml : déclare composants et permissions.
GradleSystème de build Android.
KTSScripts Gradle écrits en Kotlin (build.gradle.kts).
APKPaquet d'installation Android.
AABAndroid App Bundle : paquet optimisé pour le Play Store.
SDKSoftware Development Kit : outils et API.
minSdk/targetSdkVersions minimales/cibles d'Android.
JetpackSuite de bibliothèques Android (Compose, Room, Navigation…).
ViewModelClasse qui prépare et expose les données, survit à la rotation.
LiveDataConteneur de données observables lié au cycle de vie.
StateFlowFlux de données d'état (hot), recommandé avec Compose.
ComposeToolkit UI déclarative Android (Kotlin).
RecompositionRe-exécution d'un composable quand son état change.
LazyColumnListe paresseuse Compose.
RoomCouche d'abstraction SQLite typée.
DAOData Access Object : interface de requêtes.
EntityClasse mappée à une table (Room).
View BindingLiaison typée des vues XML.
RecyclerViewListe virtuelle de vues (legacy pré-Compose).
WorkManagerPlanification de travaux de fond garantis.
AlarmManagerAlarmes à heure précise.
Notification ChannelCatégorie de notifications (Android 8+).
Runtime permissionPermission demandée à l'exécution (dangerous).
Application classClasse racine de l'app (initialisations globales).

1.3 iOS (30 termes)

TermeDéfinition
UIKitFramework impératif d'UI iOS.
SwiftUIFramework déclaratif d'UI (2019).
ViewComposant d'UI SwiftUI / type de base UIKit.
AppDelegatePoint d'entrée gérant le cycle de vie de l'app.
SceneDelegateGestion des scènes (multi-fenêtres, iPad).
ViewControllerContrôleur UIKit d'un écran.
StoryboardFichier de description visuelle de l'UI (legacy).
Auto LayoutSystème de contraintes de layout UIKit.
NavigationStackPile de navigation SwiftUI.
NavigationControllerPile de navigation UIKit.
TabView / TabBarNavigation par onglets.
@StatePropriété d'état local SwiftUI.
@BindingRéférence à une valeur possédée ailleurs.
@EnvironmentValeur fournie par l'environnement (thème, modèles).
@ObservableMacro Swift de gestion d'état (5.9+).
ObservableObjectClasse observable Combine (legacy).
CombineFramework réactif d'Apple (Publishers/Subscribers).
async/awaitSyntaxe de concurrence moderne Swift.
async letLancement de tâches parallèles.
TaskGroupGroupe de tâches concurrentes avec agrégation.
ActorType protégeant son état mutable de la course.
@MainActorIsolateur exécutant sur le thread principal.
SendableType sûr à traverser les frontières de concurrence.
ProtocolContrat de conformité.
OptionalType pouvant être nil.
guard letDéballage conditionnel précoce (early exit).
if letDéballage conditionnel local.
Weak/UnownedRéférences faibles pour éviter les cycles ARC.
DeinitDestructeur de classe (nettoyage).
KeychainStockage sécurisé de secrets.

1.4 Cross-platform (25 termes)

TermeDéfinition
React NativeFramework RN : JS/TS + composants natifs.
FlutterFramework Google : Dart + moteur de rendu propre.
PWAApp web installable, offline, avec notifications.
BridgePont JS ↔ natif (RN legacy).
JSIInterface JavaScript pour accès natif synchrone (RN).
FabricNouveau renderer RN.
TurboModulesModules natifs chargés à la demande (RN).
HermesMoteur JS optimisé pour RN.
WidgetUnité d'UI Flutter.
StatelessWidgetWidget Flutter immuable.
StatefulWidgetWidget Flutter avec état (setState).
BuildContextPosition d'un widget dans l'arbre.
InheritedWidgetPartage de données dans l'arbre Flutter.
ValueNotifierConteneur de valeur observable Flutter.
ProviderPackage de gestion d'état Flutter.
RiverpodPackage d'état Flutter moderne.
BlocPattern état Flutter basé sur events.
Hot ReloadMise à jour de l'UI sans relance de l'app (dev).
HookFonction React de réutilisation d'état.
useStateHook d'état local.
useEffectHook d'effets (montage, mises à jour, cleanup).
useCallbackMémorisation d'une fonction.
useMemoMémorisation d'une valeur.
VirtualizedListListe RN virtualisée (FlatList/SectionList).
ExpoPlateforme et framework pour RN.

1.5 Architecture et données (30 termes)

TermeDéfinition
MVVMModel-View-ViewModel : séparation état/UI/logique.
MVIModel-View-Intent : flux unidirectionnel.
Clean ArchitectureCouches découplées (domain/data/presentation).
SOLIDPrincipes de conception orientée objet.
Single ResponsibilityUne classe, une responsabilité.
Dependency InversionDépendre des abstractions.
Use CaseRègle métier orchestrée (cas d'usage).
RepositoryAbstraction d'accès aux données (sources multiples).
Data SourceSource brute (API, base).
DI (Injection de dépendances)Fournir les dépendances de l'extérieur.
HiltFramework DI Android basé sur Dagger.
KoinDI Kotlin simple.
SingletonInstance unique d'un objet.
FactoryPattern de création d'objets.
ObserverPattern de notification de changements.
State MachineModèle d'états et transitions.
Sealed classHiérarchie de types fermée (Kotlin).
ADRArchitecture Decision Record : trace d'une décision.
SQLiteBase relationnelle embarquée.
RoomORM SQLite Android.
CoreDataPersistance Apple (relationnelle + graphique).
NSManagedObjectObjet persistant CoreData.
FetchRequestRequête CoreData.
MigrationÉvolution du schéma préservant les données.
ORMObject-Relational Mapping.
CacheStockage temporaire pour accélérer les accès.
TTLTime To Live : durée de validité d'un cache.
Offline-firstConception locale d'abord, synchronisation ensuite.
SharedPreferencesStockage clé/valeur Android (non sécurisé).
UserDefaultsStockage clé/valeur iOS (non sécurisé).

1.6 Networking et backend (20 termes)

TermeDéfinition
HTTPProtocole de transfert de documents.
HTTPSHTTP chiffré par TLS.
RESTStyle d'API basé sur les ressources.
JSONFormat de données texte structuré.
APIInterface de programmation applicative.
EndpointAdresse d'une ressource d'API.
RetrofitClient HTTP typé Android.
OkHttpClient HTTP de bas niveau (base de Retrofit).
InterceptorMiddleware sur requêtes/réponses OkHttp.
URLSessionFramework réseau iOS.
AlamofireBibliothèque réseau iOS (optionnelle).
WebSocketCanal bidirectionnel temps réel.
SSEServer-Sent Events : flux serveur→client.
PushNotification distante (FCM/APNs).
FCMFirebase Cloud Messaging (Android).
APNsApple Push Notification service.
WebViewVues web embarquées.
CORSPolitique d'accès cross-origin (web).
MockWebServerServeur de test local (OkHttp).
TLS/SSLProtocoles de chiffrement de transport.

1.7 Testing et DevOps (25 termes)

TermeDéfinition
Test unitaireTest isolé et rapide d'une unité de code.
Test d'intégrationTest de plusieurs composants ensemble.
Test UITest du comportement de l'interface.
Test E2ETest du parcours complet sur device.
AAAArrange – Act – Assert.
TDDTest-Driven Development : tests d'abord.
FakeImplémentation simulée d'une dépendance.
MockDoublure avec comportements programmés.
SpyDoublure qui enregistre les appels.
CoveragePart de code couverte par les tests.
JUnitFramework de tests unitaires JVM.
XCTestFramework de tests Apple.
EspressoTests UI Android (legacy).
MaestroOutil E2E mobile YAML.
Flaky testTest intermittent.
Snapshot testComparaison de rendu à une référence.
CI/CDIntégration et déploiement continus.
PipelineChaîne automatisée de build/test/déploiement.
FastlaneAutomatisation iOS/Android.
GitHub ActionsCI/CD intégré à GitHub.
TestFlightDistribution bêta iOS.
Firebase App DistributionDistribution bêta Android/iOS.
CrashlyticsAnalyse des crashs.
dSYMSymboles de crash iOS.
SonarQubeAnalyse statique de qualité.

1.8 Sécurité et divers (20 termes)

TermeDéfinition
OWASP MASVSStandard de sécurité mobile.
ChiffrementTransformation des données pour les rendre illisibles.
AESAlgorithme de chiffrement symétrique.
RSAChiffrement asymétrique (clés publique/privée).
TLSChiffrement en transit.
KeystoreStockage sécurisé de clés Android.
KeychainStockage sécurisé de secrets iOS.
Code signingSignature cryptographique de l'app.
Certificate pinningÉpinglage des certificats attendus.
SandboxIsolation d'une app par l'OS.
RGPDRèglement européen sur la protection des données.
ProGuard/R8Obfuscation et minification Android.
Root/JailbreakDébridage du device (risque de sécurité).
App StoreStore iOS.
Play StoreStore Android.
Material DesignDesign system Google.
HIGHuman Interface Guidelines (Apple).
AccessibilityAccessibilité (voix, contraste, tailles).
Dark modeThème sombre.
LocalisationTraduction et adaptation régionale.

Total : 25 + 30 + 30 + 25 + 30 + 20 + 25 + 20 = 205 termes.


Section 2 — Cheat sheet Kotlin

Variables et types

val name = "Ada"          // immuable (read-only)
var age = 36              // mutable
val email: String? = null // null-safe
val list = listOf(1, 2, 3)        // liste immuable
val map = mapOf("a" to 1, "b" to 2)
val set = setOf(1, 2, 2)          // {1, 2}

Fonctions et classes

fun add(a: Int, b: Int) = a + b        // expression body
data class User(val id: Int, val name: String)  // equals/hash/copy
fun User.displayName(): String = name   // extension function
val user = User(1, "Ada")
val copy = user.copy(name = "Grace")

Null-safety

val a: String? = null
a?.length          // null si a est null
a ?: "default"     // Elvis : valeur par défaut
a!!               // force (à éviter !)
val len: Int = a?.length ?: 0

Coroutines

viewModelScope.launch {
    val result = withContext(Dispatchers.IO) { fetch() }
    uiState.value = result
}
val deferred = async { fetchA() }        // parallèle
val b = async { fetchB() }
launch { doSomething() }                  // fire-and-forget
flow { emit(1); emit(2) }                 // Flow froid
flow.map { it * 2 }.filter { it > 1 }.collect { ... }

Collections (fonctionnelles)

list.filter { it > 1 }
list.map { it * 2 }
list.fold(0) { acc, x -> acc + x }
list.any { it > 5 }
list.groupBy { it % 2 }
list.sortedBy { it }

Section 3 — Cheat sheet Swift

Variables et types

let name = "Ada"              // constante
var age = 36                  // variable
var email: String? = nil      // optionnelle
let list = [1, 2, 3]          // Array
let dict = ["a": 1, "b": 2]   // Dictionary
let set: Set<Int> = [1, 2, 3]

Optionals

var name: String? = "Ada"
if let name = name { print(name) }   // if let
guard let name = name else { return } // guard (early exit)
let count = name?.count ?? 0         // ?? et chaînage

Struct / Enum / Protocol

struct User: Identifiable {
    let id: Int
    var name: String
}

enum Status {
    case pending, active, done
}

protocol Processable {
    func process() async throws
}
extension Processable {
    func log() { print("processing") }   // implémentation par défaut
}

Fonctions et closures

func add(_ a: Int, _ b: Int) -> Int { a + b }   // label omis
let multiply = { (a: Int, b: Int) -> Int in a * b }
let values = [1, 2, 3].map { $0 * 2 }

Concurrence

func load() async throws -> Data {
    let (data, response) = try await URLSession.shared.data(from: url)
    return data
}
async let a = fetchA()   // parallèle
async let b = fetchB()
let results = try await (a, b)

actor Counter {
    private var value = 0
    func increment() { value += 1 }
}

Erreurs

enum AppError: Error { case network, notFound }
func fetch() throws -> Data { ... }
do { try fetch() } catch { print(error) }

Section 4 — Cheat sheet Jetpack Compose

Composables et état

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ }) { Text("$count") }
}

Disposition

Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
    Row(horizontalArrangement = Arrangement.SpaceBetween) { ... }
    Box(modifier = Modifier.fillMaxSize()) { ... }          // empilement
}

Listes

LazyColumn {
    items(items = list, key = { it.id }) { item -> ... }
}

Thème

MaterialTheme(
    colorScheme = if (darkTheme) darkColorScheme() else lightColorScheme(),
    typography = Typography()
) { ... }

Navigation

NavHost(navController, startDestination = "home") {
    composable("home") { HomeScreen(onClick = { navController.navigate("detail/1") }) }
    composable("detail/{id}") { backStackEntry -> DetailScreen(backStackEntry.arguments?.getString("id")) }
}

Modificateurs utiles

Modifier
    .fillMaxWidth().padding(16.dp)
    .clickable { ... }
    .clip(RoundedCornerShape(8.dp))
    .background(color)
    .size(48.dp)

Section 5 — Cheat sheet SwiftUI

Vues et état

struct CounterView: View {
    @State private var count = 0
    var body: some View {
        Button("\(count)") { count += 1 }
    }
}

Disposition

VStack(spacing: 8) {
    HStack { Text("A"); Spacer(); Text("B") }
    ZStack { Circle(); Text("badge").offset(...) }
    ScrollView { ForEach(items) { item in Text(item.title) } }
}

Listes et navigation

NavigationStack {
    List(users) { user in
        NavigationLink(value: user) { Text(user.name) }
    }
    .navigationDestination(for: User.self) { user in UserDetail(user: user) }
}

Concurrence dans la vue

.task { await viewModel.load() }          // annulé automatiquement

Préviews

#Preview {
    ContentView()
        .environment(\.colorScheme, .dark)
}

Modificateurs clés

Text("Hello")
    .font(.title)
    .foregroundStyle(.blue)
    .padding()
    .background(RoundedRectangle(cornerRadius: 8))
    .frame(maxWidth: .infinity)
    .onTapGesture { ... }

Section 6 — Cheat sheet Dart

Variables et types

final name = 'Ada';        // read-only
var age = 36;              // mutable
String? email;             // nullable
final list = [1, 2, 3];
final map = {'a': 1, 'b': 2};
final set = {1, 2, 3};

Fonctions et classes

int add(int a, int b) => a + b;
class User {
  final int id;
  final String name;
  const User(this.id, this.name);
}

Contrôle de flux

if (email == null) { ... } else { ... }
switch (status) {
  case Status.active: ...
  default: ...
}
for (final item in list) { ... }
list.where((e) => e > 1).map((e) => e * 2).toList();

Async

Future<int> fetch() async {
  final data = await api.get('/data');
  return data.length;
}
final value = await fetch();
try { await fetch(); } catch (e) { print(e); }
Stream<int> counter() async* { for (var i = 0; i < 3; i++) { yield i; } }

Null-safety

String? name;
final len = name?.length ?? 0;   // chaînage + fallback
name!;                           // force (à éviter)

Section 7 — Cheat sheet Flutter

Widgets de base

Text('Bonjour', style: TextStyle(fontSize: 18)),
Icon(Icons.favorite, color: Colors.red),
Image.network('https://...'),
ElevatedButton(onPressed: () {}, child: Text('OK')),
TextField(controller: controller),

Layouts

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: [ Text('A'), const SizedBox(height: 8), Text('B') ],
),
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [...]),
Stack(children: [ base, Positioned(right: 0, top: 0, child: badge) ]),

Listes

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) => ListTile(title: Text(items[index])),
)
GridView.count(crossAxisCount: 2, children: [...])

État

class MyWidget extends StatefulWidget { ... }
class _MyWidgetState extends State<MyWidget> {
  int count = 0;
  void _inc() => setState(() => count++);
  @override
  Widget build(BuildContext context) { return ...; }
}

Thème

MaterialApp(
  theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal)),
  darkTheme: ThemeData(...brightness: Brightness.dark),
  home: const HomeScreen(),
)

Navigation

Navigator.push(context, MaterialPageRoute(builder: (_) => const Detail()));
Navigator.pop(context);

Section 8 — Cheat sheet React Native

Hooks

const [count, setCount] = useState(0);
useEffect(() => {
  fetchData();
  return () => cleanup();   // cleanup au démontage
}, [deps]);

const memoized = useMemo(() => compute(a, b), [a, b]);
const handler = useCallback(() => doThing(), [deps]);

Composants

<View style={{ flex: 1, justifyContent: 'center' }}>
  <Text style={styles.title}>Bonjour</Text>
  <Pressable onPress={() => setCount(c => c + 1)}>
    <Text>+</Text>
  </Pressable>
</View>

Listes

<FlatList
  data={items}
  keyExtractor={(item) => item.id}
  renderItem={({ item }) => <Item item={item} />}
  getItemLayout={...}
/>

Style

const styles = StyleSheet.create({
  title: { fontSize: 20, fontWeight: 'bold', color: '#333' },
});

Navigation (React Navigation)

<NavigationContainer>
  <Stack.Navigator>
    <Stack.Screen name="Home" component={HomeScreen} />
  </Stack.Navigator>
</NavigationContainer>
navigation.navigate('Detail', { id });

Réseau

const res = await fetch(url, { method: 'GET' });
const data = await res.json();

Section 9 — Design patterns mobile

9.1 Patterns de création

PatternUsage mobile
SingletonAccès global à un service (logger, repository partagé) — avec prudence
FactoryCréation de vues/widgets selon un type (ex. renderers)
BuilderConstruction d'objets complexes (requêtes, configurations)
Dependency InjectionFournir les dépendances (Hilt, Koin, manual)

9.2 Patterns de structure

PatternUsage mobile
AdapterRecyclerView.Adapter / listes RN — adapter données → vues
FacadeEncapsuler plusieurs services derrière une API simple (ex. AnalyticsManager)
DecoratorEnvelopper des composants (modifiers, ViewModifiers)
CompositeL'arbre de widgets/views (parent-enfant)

9.3 Patterns de comportement

PatternUsage mobile
ObserverObservables : LiveData, StateFlow, Publisher, ValueNotifier
StateGestion d'état UI (state machine de chargement)
StrategyÉchanger des algorithmes (différents paiements, formats)
CommandEncapsuler des actions (undo, redo, file de synchronisation)
Template MethodSquelette d'algorithme avec hooks de sous-classe
Chain of ResponsibilityIntercepteurs OkHttp, middleware
IteratorParcours de collections

9.4 Patterns d'architecture mobile

PatternDescription
MVVMViewModel expose l'état ; l'UI observe
MVIFlux unidirectionnel : Intent → State → View
Clean ArchitectureCouches domain/data/presentation découplées
RepositorySource unique d'accès aux données
Use CaseUne règle métier par classe
ReduxStore global + reducers (inspiration de MVI)
Coordinator (iOS)Navigation découplée des écrans
VIPER (iOS)View-Interactor-Presenter-Entity-Router

9.5 Patterns de performance

PatternUsage
ViewHolderRéutiliser des vues (RecyclerView)
VirtualizationFlatList/ListView.builder — items paresseux
CacheMémoire + disque pour images, requêtes
Lazy LoadingChargement différé des données
DebounceLimiter les événements fréquents (recherche)
ThrottleLimiter le taux d'exécution
Page CacheMise en cache des écrans navigués

9.6 Anti-patterns à éviter

Anti-patternProblème
God ObjectUne classe qui fait tout
Business logic dans l'UIImpossible à tester, duplication
Spaghetti codeFlux illisible
Premature optimizationOptimiser sans mesure
Copy-pasteDuplication → bug propagation
Singleton partoutCouplage global, tests difficiles
Mutable global stateIncohérences, courses

Synthèse

  1. Glossaire : 205 termes couvrant langages, plateformes, architecture, data, réseau, tests, DevOps, sécurité.
  2. Cheat sheets : 7 références rapides pour Kotlin, Swift, Compose, SwiftUI, Dart, Flutter, RN.
  3. Patterns : création, structure, comportement, architecture, performance — avec leurs usages mobiles.

Pour aller plus loin

  1. Imprimez ou gardez les cheat sheets ouvertes pendant vos exercices du chapitre 19.
  2. Pour chaque pattern, trouvez un exemple réel dans vos projets (ou dans Now in Android).
  3. Complétez le glossaire avec vos propres termes rencontrés en production.