Les frameworks sont déclaratifs, ce qui signifie qu'ils permettent au développeur « d’écrire ce qu'ils veulent au lieu de la façon dont ils le veulent », a noté Marcu. Codegen fonctionne avec Hack, un langage de programmation qui ressemble à PHP que Facebook a conçu pour accélérer le développement de son site Web et a publié par la suite en open source afin que les développeurs puissent en profiter.
Avant de se servir de Codegen, les ingénieurs Facebook ont utilisé un patchwork de scripts et des modèles pour générer les morceaux de code qui effectuent des tâches simples mais souvent exécutées, comme aller chercher la date d’anniversaire d'un utilisateur.
Facebook avait des classes pour tous les types d’objet, comme :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | class UserNode extends Node { public function getName(): string { return $this->data['name']; } public function getBirthdate(): ?int{ return $this->data['birthdate'] === 0 ? null : $this->data['birthdate']; } } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | class UserMutator extends NodeMutator { public function getFields(): array { return array( 'Name' => string_field('name'), 'Birthdate' => timestamp_field('birthdate')->optional(), ); } } |
Code : | Sélectionner tout |
1 2 3 4 | UserMutator::create() ->setName('Jack Smith') ->setBirthday($day) ->save(); |
« La solution à laquelle nous sommes parvenus était un plus haut niveau d’abstraction, un schéma, qui garderait une description détaillée d’un type d’objet. Alors nous pouvions écrire un script qui pourrait générer le nœud, le mutateur, le chargeur, les tests, etc., directement depuis ce schéma ainsi que définir le stockage (par exemple MySQL db) », a avancé Marcu.
En clair la bibliothèque Codegen simplifie les opérations en permettant à un développeur de créer un schéma qui va contenir un échantillon de code qui pourrait être réutilisé plusieurs fois en plus de générer toutes les fonctionnalités connexes nécessaires comme un chargeur de données et une connexion à la base de données. L’utilisateur fournit des détails sur une mise en œuvre particulière et le logiciel va s’occuper du reste. Il pourra générer des classes, des méthodes, des variables, des fonctions, des fichiers et autres. Par exemple, ceci pourrait être un schéma utilisateur.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | class UserSchema extends NodeSchema { protected function getFields(): Map<string, INodeField> { return Map{ 'Name' => string_field('name') ->description('Full name of the user') ->example('John Smith'), 'Birthdate' => timestamp_field('birthdate')->optional(), 'Gender' => int_enum_field('gender', UserGender::class), }; } } |
Concernant les fichiers signés, Marcu explique « nous voulions nous assurer que les ingénieurs n’apportent pas de modifications aux fichiers signés afin que nous puissions régénérer automatiquement un code une fois qu’il change un schéma. Nous aurions pu ajouter des commentaires précisant que le code ne doit pas être modifié mais nous étions inquiets à l’idée qu’ils puissent juste être survolés ». Aussi, Facebook a décidé de faire appel à une bibliothèque déjà fonctionnelle sur Facebook ; elle va faire un hachage des contenus des fichiers et préciser en en-tête que le contenu ne devrait pas être modifié manuellement. Par la suite il pourrait vérifier si les hash correspondent au contenu pour savoir si le fichier a été modifié et des outils vont arrêter de telles tentatives.
Cependant se posait le problème de flexibilité dans certaines sections du code généré, par exemple un champ qui pourrait nécessiter une modification post-génération automatique dans le getter. Facebook a opté pour laisser des sections dans le fichier qui puissent être modifiées manuellement. Le code de génération a été mis à jour afin qu’il puisse tenir compte de ces modifications manuelles.
Essayer CodeGen (dépôt GitHub)
Source : Facebook
Et vous ?
Qu'en pensez-vous ?
forum Libre & Open Source