Quiz 2 — État & données (P6-P8)
20 questions · ~15 min
1. La règle de répartition de l’état du cours, en une phrase ?
Réponse
Le plus local possible : useState pour l’UI locale, Zustand pour le partagé éphémère (session), AsyncStorage/persist pour les préférences, SQLite pour les données requêtables.
2. Où la mémoïsation (memo/useCallback) est-elle rentable en RN ?
Réponse
Autour des FlatList (items memo, handlers stables) et des composants mémoïsés — partout ailleurs, c’est du bruit (profiler d’abord).
3. Pourquoi un setInterval n’est-il pas fiable pour un timer de jeu ?
Réponse
Le JS est gelé/throttlé en arrière-plan : les ticks se perdent. La vérité = endsAt comparé à Date.now() (+ resync au retour AppState).
4. useFocusEffect vs useEffect : quand le premier est-il indispensable ?
Réponse
Pour réagir à chaque visite d’un écran (les écrans restent montés sous pile/tabs — useEffect([]) ne joue qu’au montage initial).
5. La discipline n°1 de consommation d’un store Zustand ?
Réponse
Les sélecteurs fins (useSession(s => s.score)) — jamais le store entier, qui abonne
le composant à tout changement.
6. Comment un listener non-React (notification, BackHandler) lit-il le store ?
Réponse
useStore.getState() / setState() — l’accès hors composants, sans hook ni abonnement.
7. Pourquoi modéliser la partie en union discriminée plutôt qu’en booléens ?
Réponse
Chaque phase porte SES données (endsAt qu’en playing), les combinaisons absurdes sont irreprésentables, TS force l’exhaustivité — et les gardes refusent les transitions illégales.
8. Que fait le middleware persist de Zustand, et ses deux options structurantes ?
Réponse
Sérialise le store dans AsyncStorage à chaque set et le réhydrate au démarrage — name
(la clé) et version+migrate (les évolutions sans casser les données).
9. Trois choses qu’on ne met JAMAIS dans AsyncStorage ?
Réponse
Les secrets (→ expo-secure-store), les données de masse/requêtables (→ SQLite), et tout objet non-JSON-sérialisable.
10. Pourquoi n’y a-t-il pas de CORS en React Native, et le revers de sécurité ?
Réponse
Pas de navigateur → pas de same-origin. Revers : tout ce qui est dans l’app est PUBLIC (décompilable) — aucune clé secrète embarquée, jamais.
11. staleTime et gcTime : les définitions exactes ?
Réponse
staleTime = fraîcheur (frais → servi du cache sans réseau ; stale → servi + refetch en fond). gcTime = rétention mémoire d’une donnée inutilisée avant éviction.
12. Les deux branchements RN de TanStack Query au démarrage ?
Réponse
onlineManager ← NetInfo et focusManager ← AppState — les remplaçants des événements window du web (reconnexion, retour au premier plan).
13. L’architecture des questions de Drill (ADR 0001) en une phrase ?
Réponse
JSON par thème dans un repo GitHub public servi par raw.githubusercontent, fetch + zod + cache offline — mise à jour par git push, zéro serveur, scores locaux.
14. Parse strict vs safeParse dans le pipeline de questions : la doctrine ?
Réponse
Strict sur l’ENVELOPPE du fichier (corrompu = erreur franche), safeParse PAR QUESTION (une invalide = ignorée + warning, le jeu continue) — tolérance proportionnée au dégât.
15. À quoi sert z.infer dans l’architecture ?
Réponse
Les types TS dérivent du schéma zod (une seule source de vérité) : validation runtime et types compilés ne peuvent plus diverger.
16. La matrice offline : que voit l’utilisateur hors ligne avec cache ? sans cache ?
Réponse
Avec : les données + bandeau (un MODE, pas une erreur). Sans : ErrorState + retry + la banque de secours bundlée (jouable même à la première ouverture en avion).
17. Pourquoi gcTime doit-il couvrir maxAge dans la persistance du cache Query ?
Réponse
On ne persiste que ce qui est en mémoire : une donnée garbage-collectée avant maxAge n’existe plus au moment de sauvegarder.
18. Écrivez (de tête) la requête du taux de réussite d’un thème, pièges compris.
Réponse
SELECT CAST(SUM(correct_count) AS REAL) / NULLIF(SUM(total), 0) FROM sessions WHERE theme = ? — CAST contre la division entière, NULLIF contre la division par zéro, paramètre
contre l’injection.
19. Le pattern de migrations SQLite du cours ?
Réponse
PRAGMA user_version + tableau ordonné de migrations + une transaction chacune — on
n’édite JAMAIS une migration livrée, on en ajoute. (Et foreign_keys = ON à chaque
ouverture !)
20. staleTime: Infinity sur les stats locales : la logique ?
Réponse
Elles ne changent que par NOS écritures : l’invalidation explicite (onSuccess de la mutation) est le seul rafraîchissement nécessaire — zéro re-requête spontanée.