Expériences de programmation Android durement gagnées

Ce post, comme le dit Kent Beck dans son livre Implementation Patterns, «… est basé sur une prémisse plutôt fragile selon laquelle un bon code compte…». Mais nous savons tous que le code propre est important car nous avons dû faire face pendant si longtemps à son manque. Et Kent aussi.

Kent Beck

Le coût total de possession d'un mess

Il y a quelques années, comme tous les développeurs Android naïfs travaillant dans une start-up en Inde, j'ai essayé de "pirater" des problèmes du monde réel, de "perturber l'industrie" et de mettre un "trou dans l'univers". Sans se soucier au monde de la bonne conception ou architecture de logiciels, j'ai commencé à écrire du code pour créer une application Android qui deviendrait un jour l'une des plus grandes applications de soins de santé grand public en Inde.

Sprint après sprint, hack après hack, les fonctionnalités ont été construites dans une course folle. Construire. Mesure. Apprendre. Le délai de mise sur le marché était important et comptait chaque jour. Le temps passait, nous grandissions au rythme d'un membre de l'équipe tous les 6 mois et l'application avait atteint le million de téléchargements.

Téléchargements et évaluation de la boutique Google Play de notre application.

À ce moment-là, l'application avait cessé d'être triviale et elle était devenue un client multi-locataire, si c'est même une chose. Les fonctionnalités qui prenaient des heures lorsque nous commencions prenaient maintenant des jours, parfois des semaines. Chaque activité comptait plus de 1000 lignes de code spaghetti, car Android ne s'inquiète pas trop de la séparation des préoccupations. Le coût total de possession d'un mess nous avait considérablement ralenti.

L'énigme Android

Le code avait l'air moche, les activités géraient tout:

  • Enfiler
  • E / S
  • Calcul
  • Disposition
  • Changements de configuration
  • Quoi non

Après tout, les activités sont des contrôleurs, non? Ou s'agit-il de vues? Je ne savais plus.

MVC

La grande refonte dans le ciel

Nous devions concevoir l'application de manière à ce que la modification d'une ligne de code quelque part ne brise pas quelque chose ailleurs. L'application devait être, comme le dit l'oncle Bob, «robuste mais pas rigide, flexible mais pas fragile».

Robert «oncle Bob» Martin

C'est à ce moment que mon mentor et ami Kashif Razzaqui a rejoint l'équipe pour nous aider à atténuer le désordre. La grande refonte n'a jamais eu lieu, mais nous avons refactorisé l'enfer de notre code:

  • Nous avons ajouté une couche «service» et y avons déplacé tout le code non UI, un service à la fois.
  • Nous avons jeté AsyncTasks et sommes passés à ListenableFutures en utilisant Guava.
  • Nous avons vidé AsyncHttpClient pour OkHttp.
  • Mais plus important encore, nous avons commencé à lire beaucoup: Clean Code, Clean Architecture, SOLID, DRY, The Pragmatic Programmer, Java Concurrency In Practice, Domain Driven Design, etc.

Bientôt, nous avons commencé à voir les avantages de nos efforts. La productivité a augmenté, nous écrivions plus vite, tout le monde était content.

C'était jusqu'à ce que nous unifiions nos applications et que tout l'enfer se perde. Le simple fait d'avoir une couche de service supplémentaire ne l'a pas coupé.

L'art du code propre

Après avoir regardé plusieurs fois les vidéos d'oncle Bob sur l'architecture propre et lu beaucoup sur l'architecture des applications Android, j'ai décidé d'expérimenter avec le modèle de conception MVP et RxJava.

Quelques jours après l'expérimentation, nous avons décidé de passer à RxJava et d'implémenter MVP en utilisant une architecture propre. Nous nous sommes assurés d'encapsuler toutes les couches derrière les interfaces et de bien séparer les préoccupations.

  • La vue, généralement implémentée par un fragment, contient une référence au présentateur. La seule chose que la vue fera est d'appeler une méthode à partir du présentateur chaque fois qu'il y a une action d'interface.
  • Le présentateur est chargé d'agir en tant qu'intermédiaire entre la vue et le modèle. Il récupère les données du modèle et les renvoie formatées dans la vue. Mais contrairement au MVC typique, il décide également de ce qui se passe lorsque vous interagissez avec la vue.
  • Le modèle n'est que la passerelle vers la couche de domaine ou la logique métier.
  • L'interacteur traite les E / S et est le fournisseur de données à afficher dans la vue.

Maintenant, il est beaucoup plus facile de changer une couche avec une toute nouvelle implémentation. La refonte de l'interface utilisateur, partie intégrante du développement d'applications Android, est devenue beaucoup plus facile. Les choses peuvent enfin bouger rapidement sans se casser.

La règle du boy-scout

Il ne suffit pas de bien écrire le code, le code doit être maintenu propre au fil du temps. Le fait est que le logiciel a tendance à l'entropie. Nous avons tous vu le code pourrir et se dégrader avec le temps, alors nous avons emprunté la règle simple des scouts: «Laissez le terrain de camping plus propre que vous ne l'avez trouvé.»

Si nous avons tous enregistré notre code un peu plus propre que lorsque nous l'avons vérifié, le code ne pourrait tout simplement pas pourrir. Le nettoyage ne doit pas être quelque chose de grand. Modifiez un nom de variable pour le mieux, divisez une fonction un peu trop grande, éliminez un petit peu de duplication, nettoyez une instruction if composite.

Conclusion

Notre façon de créer une application évolutive n'est peut-être pas «correcte» et vous pourriez ne pas être d'accord avec cet article. Après tout, tous les artistes martiaux ne s'entendent pas sur le meilleur art martial ou la meilleure technique en son sein;)

Il existe de nombreuses approches différentes du MVP et de nombreuses solutions intéressantes pour l'adapter à Android. Le seul fait que nous ne pouvons pas nier, c'est que le code propre est important et que vous ne pouvez pas le balayer sous un tapis.

Ce message emprunte beaucoup au code propre de l'oncle Bob et vole le titre de la conférence Droidcon de Kashif de 2011.

Si le code propre vous importe, discutons :) Twitter: @_arunsasi LinkedIn: https://www.linkedin.com/in/arunsasidharan

Si vous avez aimé cet article, veuillez toucher le petit cœur! ❤