Les êtres humains ont du mal à avoir une vue d'ensemble d'un problème sans y consacrer beaucoup de temps et d'efforts. C'est particulièrement vrai lorsqu'il s'agit d'applications complexes et de grande envergure. Quels sont les effets secondaires de mes modifications ? Pourquoi cette ligne affecte-t-elle les tests d'une partie éloignée de la base de code ? Il n'existe pas de solution parfaite ou complète, mais Shopify a mis au point un outil qui vous aidera probablement, vous et votre équipe.
Introduction
Pour parler de PackwerkIl faut d'abord introduire quelques concepts.
- Cohésion: il s'agit de la mesure du degré d'appartenance des éléments d'un module ou d'une classe.
- Accouplement: il s'agit du niveau de dépendance entre les modules ou les classes.
- FrontièresLe terme "barrière" fait référence aux barrières entre les code. Dans ce cas, une limite de code fait référence à différents domaines de préoccupation au sein de la même base de code.
- ModularisationLe système de gestion de la qualité est un système de gestion de la qualité qui permet d'améliorer la qualité de l'information et de la communication.
Problèmes
Comme nous le savons, Rubis ne fournit pas une bonne solution pour faire respecter les limites du code. Nous pouvons spécifier la visibilité mais toutes les dépendances seront chargées dans l'espace de noms global. Dans les applications de grande taille ou monolithiques, cette absence de limites produit les problèmes suivants.
- Faible cohésion,
- Couplage élevé,
- Code spaghetti.
Pour tenter de modulariser le monolithe de Shopify et d'imposer des limites, ils ont essayé différentes solutions sans obtenir les résultats escomptés :
- Définition de constantes privées,
- Établir des limites à l'aide de pierres précieuses,
- Utiliser des tests pour éviter les associations entre composants,
- Utilisation de la gemme de modulation de Ruby,
- Créer des microservices.
Forts des connaissances acquises lors des tentatives précédentes, ils ont décidé de créer leur propre outil : Packwerk.
Packwerk
Qu'est-ce que Packwerk ?
Packwerk est un outil d'analyse statique utilisé pour imposer des limites entre des groupes de données. Rubis fichiers appelés paquets.
Qu'est-ce qu'un paquet ?
A paquet est un dossier contenant du code chargé automatiquement. Le dossier équipe encourage à utiliser les meilleures pratiques de conception lors de la création de paquets.
- Nous devrions emballer ensemble les choses qui ont une grande fonctionnalité. cohésion,
- Les paquets doivent être relativement peu liés les uns aux autres.
Types de contrôles aux frontières
Nous pouvons faire respecter les limites de confidentialité et de dépendance, vérifier les violations des limites et les dépendances cycliques.
Packwerk en pratique
Il n'existe pas de méthode unique pour structurer ou restructurer votre application lors de la création de paquets. Dans cet article, nous allons suivre l'approche suggérée par
Stephan Hagemann dans Modularisation progressive pour Ruby on Rails.
Choisir le projet
Vous pouvez créer un nouveau projet ou choisissez l'un de vos projets. J'ai décidé d'utiliser un projet open-source appelé CodeTriage. Il est important de mentionner que nous avons besoin d'une application Rails 6 puisque Packwerk utilise Zeitwerk.
Initialiser Packwerk
Tout d'abord, nous devons ajouter la gem à notre Gemfile comme suit gem 'packwerk'
puis exécutez liasse
dans la console. Nous sommes alors prêts à initialiser la gem en exécutant packwerk init
.
Ensuite, nous constatons que Packwerk a généré trois fichiers pour nous :
-
packwerk.yml
-
package.yml
-
inflexions.yml
packwerk.yml est le fichier de configuration de Packwerk où nous définirons les fichiers inclus et exclus, énumérerons les chemins de chargement, définirons le fichier d'inflexions, entre autres choses ;
package.yml est le fichier de configuration d'un paquet. Dans ce fichier, nous ajouterons la configuration des limites de notre paquet. Tout dossier contenant package.yml sera reconnu comme un paquet par Packwerk. C'est tout, Packwerk a créé notre première
et nous l'appelons racine l'emballage.
inflexions.yml est l'endroit où nous placerons nos inflexions et acronymes personnalisés au cas où nous les utiliserions.
Pour en savoir plus sur les fichiers et leur configuration, voir
Packwerk.
Propriétés de Packwerk
Pour que la modularisation fonctionne, nous avons besoin de trois propriétés fondamentales : un conteneur nommé, son contenuet explicite dépendances sur d'autres conteneurs. Définissons donc ces propriétés dans Packwerk:
-
Nom: Le nom d'un paquet est son chemin d'accès relatif à partir de la racine du fichier
l'application.
-
Contenu: Lorsque nous plaçons un package.yml dans un dossier, tous les fichiers de ce dossier sont désormais le contenu du package.
-
Dépendances: Nous pouvons définir des dépendances sur d'autres paquets en ajoutant la clé de dépendances à l'élément package.yml.
Un autre fichier qui n'est pas inclus par défaut mais qui est recommandé est README. Il est important de fournir des informations sur l'utilisation du paquet.
Fin de l'épisode I
Lire la suite
GraphQL Ruby. Qu'en est-il des performances ?
Rails et autres moyens de transport
Développement Rails avec TMUX, Vim, Fzf + Ripgrep