Mobile.Practices.Frameworkless
Best practices for Xamarin developpement post MVVM (without binding) (Xamarin.Android and iOS)
Install / Use
/learn @roubachof/Mobile.Practices.FrameworklessREADME
Coding Practices
Logging
Une stratégie de log systématique permet de mieux comprendre le comportement de son programme.
- Niveaux de logs:
Verbose, Normal, Warning, ... - Configuration de targets: fichiers, buffer, output, rest, ...
- Log du cycle de vie des os mobiles (
OnCreate, OnDestroy,etc...) - Log à l'entrée des méthodes
public - Catégoriser les logs
Renvoyer les x dernières lignes de log avec les crash reports (voir getDescription de HockeyApp)
Mocks
- Utilisation de mocks systématique pour valider toutes les hypothèses UI
- Injection des dépendances par constructeur
Maîtriser l'état (1/2)
- Notions de design by contract
precondition,postcondition, throw Exception en Debug => tests unitaires- Eviter les variables
Nullables - Toujours assigner les listes par défaut (dans constructeur par défaut par exemple)
- Contrôler la cohérence des données le plus tôt possible
- Eviter les variables
Maîtriser l'état (2/2)
- Les interfaces sont des modificateurs d'accès
- Si une collection ne peut être modifiée utiliser
IReadOnlyList
- Si une collection ne peut être modifiée utiliser
- Créer des Exceptions qui ont du sens (
MappingException,CommunicationException, etc...)
Partage de code
- Trop de centralisation ViewModel = perte de flexibilité UI
- DiffUtils
- MVVM (NPC, Command) a été pensé pour interagir avec WPF (dual binding)
- Approche pragmatique
View Models (1/3)
Proposition de migration vers un monde post MVVM où la View est maître et subit le
moins possible les callbacks du view model (minimiser/supprimer INotifyPropertyChanged).
- Simplification du workflow de la View (unidirectionnel)
- Ajout de la notion d'état UI du view model (
ViewModelState)
SRP-YAGNI-BLABLA-ETC (2/3)
CONSTAT: le view model est trop souvent un god object avec responsabilités multiples<br>
PROPOSITION: composition vs. héritage
- Sub view models (view models à section de type "Détail")
- Le ViewModel se concentre sur l'affichage des données et délègue le reste à des sous-composants
Paginatorpour les listes infiniesNotifyTasklancement des tâche async (suppression de async void)
NotifyTask (3/3)
- Adapté des wrappers de Task MVVM de Stephen Cleary
- Callbacks disponibles pour chaque état de la tâche (
IsNotCompleted,IsFaulted,IsSuccessfullyCompleted, etc..) - Relation forte entre
ViewModelStateet états de la tâche - Gère les exceptions pour nous
Views (Divide and Conquer)
- Ne pas hésiter à découper ses vues en sous-vues
- Mettre en relation sous-vues avec sub view models
- Maitriser le cycle de vie des objets
Contract.Require(() => ViewModel != null)
Unsubscribe (GC)
MUST READ Xamarin docs garbage_collection<br>
MUST SEE Advanced Memory Management Evolve 2013
- Attention au leak d'activité sur Android
- Problématique du ref count sur iOS
Related Skills
node-connect
349.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.5kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
349.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
349.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
