Même si notre code est lisible, l’architecture ne permet de réutiliser ce code.
C’est une bonne chose de vouloir séparer le code métier du code des entrées et sorties,
comme les fichiers, les bases de données et les API.
Dans notre cas, on travail avec l’API de Revit en entrée comme en sortie.
On aimerai pouvoir remplacer facilement Revit par AutoCad ou un écran Windows par exemple.
On veux donc créer un code métier qui n’accède pas directement à des classes Revit.
Voici la description du code métier :
- Sélectionner un cercle a l’écran
- Récupérer le rayon de ce cercle
- définir un cercle de rayon supérieur de 1 unité au cercle récupéré.
- Tracer ce cercle.
Il nous faut dans un premier temps instancier une classe qui sera un adaptateur en entrée pour des éléments géométriques :
class InputGeometryAdaptator : IinputGeometry{}
Cette classe implémente une interface qui contient l’ensemble des méthodes utiles pour des entrées.
Cette classe prendra la classe adaptateur Revit en paramètre dans son constructeur.
Dans ce constructeur, on va initialiser l’instance de l’entrée (L’application et le document en cours dans le cas de Revit)
InputGeometryAdaptator iga = new InputGeometryAdaptator(RevitAdaptator);
Cette classe a une méthode permettant de récupérer la géométrie d’un élément géométrique par sélection à l’écran :
Geometry geo = iga.GetOneGeometryByClick("Selectionner un cercle");
La class Circle est une classe qui hérite de la classe Geometry
Circle circle = geo as Circle;
On peut donc maintenant coder le cœur du code métier, qui est très réduit dans notre exemple :
if (circle != null) { circle.Radius = circle.Radius + 1.0 ; }
Enfin, on instance la sortie et on renvoi le code de sortie
if (circle != null) { circle.Radius = circle.Radius + 1.0 ; OutputGeometryAdaptator oga = new OutputGeometryAdaptator(RevitAdaptator); oga.SetContext(iga.GetContext()); oga.DrawCircle(circle); }
Je vous ai présenté un concept de clean architecture, très proche de l’Hexagonal Architecture, comme on aime le nommer en France.