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)
- Utilisation de mocks systématique pour valider toutes les hypothèses UI
- Injection des dépendances par constructeur
- 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
- 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...)
- Trop de centralisation ViewModel = perte de flexibilité UI
- DiffUtils
- MVVM (NPC, Command) a été pensé pour interagir avec WPF (dual binding)
- Approche pragmatique
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
)
CONSTAT:
le view model est trop souvent un god object avec responsabilités multiples
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
Paginator
pour les listes infiniesNotifyTask
lancement des tâche async (suppression de async void)
- 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
ViewModelState
et états de la tâche - Gère les exceptions pour nous
- 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)
MUST READ
Xamarin docs garbage_collection
MUST SEE
Advanced Memory Management Evolve 2013
- Attention au leak d'activité sur Android
- Problématique du ref count sur iOS