Affichage des articles dont le libellé est Design Patterns. Afficher tous les articles
Affichage des articles dont le libellé est Design Patterns. Afficher tous les articles

Créer des projets et des diagrammes de modélisation UML avec Visual Studio

Je m'intéresse au Design Patterns et c'est toujours une bonne chose pour mieux mémoriser que de faire un diagramme, UML en l'occurrence. Vous verrez sur ce site nombre de Design Patterns décrits en diagramme UML.

Dans les archives du CodePlex, il y a une excellente page sur les DesingPatterns :

CSharpDesignPatterns non c'est fini !

Si vous récupérez l'archive, vous verrez qu'à l'intérieur il y a une partie modélisation UML dans CsharpDesignPatterns\sourceCode\DesignPatterns\UMLModel avec un projet UMLModel.modelproj

C'est pour cette raison que je suis étonné de lire dans la doc Crocrosoft à la page suivante :

https://docs.microsoft.com/fr-fr/visualstudio/modeling/create-uml-modeling-projects-and-diagrams?view=vs-2017
Créer des projets et des diagrammes de modélisation UML

À partir de Visual Studio 2017, les concepteurs UML ont été supprimés à partir de Visual Studio. Pour plus d’informations, consultez ce billet de blog.

Tout simplement ! Bon ailleurs on lit que les concepteurs UML sont uniquement réservés à la version Ultimate mais cela c'est pour Visual Studio 2013 ...

Et dans le blog de cette page, un gars vous explique avec plein de blablas pour finalement nous dire que si vous utilisez encore UML vous pouvez toujours l'utiliser avec Visual Studio 2015 ... C'est assez irresponsable comme réponse à ce besoin d'UML.

Enterprise Architect ou (EA) que j'ai utilisé mais il y a longtemps et la licence était d'un prix fou. Je retrouve la trace dans :

https://www.sparxsystems.fr/resources/tutorial_home/index.html
SparxSystems Tutoriel

En continuant à chercher un peu à la page suivante :

What's new for design in Visual Studio

Prise en charge des versions pour les outils d'architecture et de modélisation

Je nous ai fait une petite copie du tableau car c'est intéressant :

Prise en charge des versions pour les outils d'architecture et de modélisation
Prise en charge des versions pour les outils d'architecture et de modélisation

On ne parle que de Visual Studio 2015 ! Autres versions :

Prise en charge des versions pour les outils d'architecture et de modélisation - Autres versions
Prise en charge des versions pour les outils d'architecture et de modélisation - Autres versions

Il n'y a que 2012 et 2013 autrement dit si j'ai acquis la Version Visual Studio 2017 Entreprise je devrais avoir le droit à la modélisation UML ... En fait NON je peux aller me brosser ...

La Modélisation UML s'est arrêtée avec Visual Studio 2015 !

Dommage !

Design Pattern d'injection des dépendances en C# .NET

Au début des Design Patterns nous avions vu l'injection des dépendances avec Angular2. Mais ça, c'était au début. Maintenant s'il y a bien un pattern qu'il faut absolument connaitre sur le bout des doigts et utiliser dans ses projets c'est bien l'injection des dépendances car on l'a vu à la fin de l'article précédent, il permet de "Mocker" les objets à des fins de testabilité mais pas seulement.

Le concept d'injection des dépendances s'entre mêle avec celui de l'inversion des contrôles et là, cela se complique. Tout ceci pour maintenir autant que possible un couplage faible entre les composants du logiciel et de pouvoir les interchanger en cas de besoin.

Ce Design Pattern est utiliser au maximum dans le framework ASP.NET C# Core pour permettre à des tierces partie de fournir des éléments essentiels de l'application ainsi on peut choisir d'utiliser autre chose que les briques de bases proposées par Microsoft.

Ici : Thibault Herviou nous dit que : Pour éviter au mieux les dépendances,

il y a trois types d'injections :

  • Injection par mutateur/champs
  • Injection par constructeur
  • Injection par interface

L'injection de dépendance permet de ne pas se soucier de l'instanciation.

Design Pattern d'injection par champ

public class CalculateurService
{
private ParamètresMonteur _paramètresMonteur;

public ParamètresMonteur ParamètresMonteur
{
set { this._paramètresMonteur = value; }
}

public ParamètresUtilisateur ObtenirParamètres( int utilisateurId )
{
_paramètresMonteur.SetUtilisateur( utilisateurId );
return _paramètresMonteur.MonterParamètres();
}
}

Injection par constructeur

public class CalculateurService
{
private ParametresMonteur _parametresMonteur;

public CalculateurService( ParametresMonteur parametresMonteur )
{
this._parametresMonteur = parametresMonteur;
}

public ParametresUtilisateur ObtenirParametres( int utilisateurId )
{
_parametresMonteur.SetUtilisateur( utilisateurId );
return _parametresMonteur.MonterParametres();
}
}

Injection par interface

S'utilise en parallèle de l'injection par constructeur.

public class CalculateurService
{
private IParametresMonteur _parametresMonteur;

public CalculateurService( IParametresMonteur parametresMonteur )
{
this._parametresMonteur = parametresMonteur;
}

public IParametresUtilisateur ObtenirParametres( int utilisateurId )
{
_parametresMonteur.SetUtilisateur( utilisateurId );
return _parametresMonteur.MonterParametres();
}
}

Même, si cette on respecte à la lettre les principe de l'injection de dépendance, il y aura toujours des classes qui devront se charger de l'instanciation des interfaces. Il y a donc encore un faible couplage.

Conteneurs IoC

Une fois maîtrisé le Design Pattern d'injection des dépendances on peut s'attaquer au concept d'inversion des contrôles.

Si l'on a quelques classes faisant appel au service CalculateurService nous auront autant d'instances de IParametresMonteur ce qui rendra l'application difficilement maintenable. Une mauvaise maîtrise du concept et l'on rend la classe ce qui est une très mauvaise idée cela entraîne nombre de problèmes de multi-threading ... Singleton ? mauvaise idée à cause des fuites mémoire. Factory + singleton ? Il reste du couplage faible.

Une seule vraie solution le Design Pattern IoC, l'inversion de contrôle :

public Programe()
{
conteneur = new ConteneurIoc();
var param = new ParamètresMonteur() ;
conteneur.Enregistrer<IParamètresMonteur>( param );
conteneur.Enregistrer<ICalculateurService>(new CalculateurService( param ));
}

Et au moment de vouloir utiliser la classe on fait appel au conteneur :

private void UneMéthode()
{
var service = conteneur.Résoudre<ICalculateurService>();
var paramUtilisateur = service.ObtenirParamètres( 1 );

// la suite
}

Il existe les Frameworks de Conteneurs suivants :

Uniy de Microsoft, Spring.Net, Ninject, Google Guice et bien d’autres encore. .NET Core dispose d'une infra de structure IoC.

L'Adapter le Common Service Locator

Ici Philippe Vialatte nous démontre les différents conteneurs IoC, Spring.NET issu de Java, Unity, Ninject .. Et il introduit le CommonServiceLocator pour permettre de réduire encore le couplage et permettre de laisser l'utilisateur choisir son framework d'IoC ...

Le CommonServiceLocator agit comme un pattern Adpater .NET, petit rappel de l'adapter sur le site de la Dofactory.

Pattern Adpater
Design Pattern Adpater

CommonServiceLocator sur GitHub

Effets pervers de l'utilisation des Design Patterns

Ces techniques ne servent à rien si :

  • on n'aura jamais besoin d'une autre implémentation.
  • on n'aura jamais besoin d'une configuration différente
  • on n'aura jamais besoin d'isoler un ou plusieurs composants (et pas de test unitaires)

C'est bien de le rappeler car les jeunes développeurs fougueux ont une tendance à se jeter sur ce genre de trucs en utilisant tous les Design Patterns possibles qu'ils connaissent et en perdant de vu l'essentiel : à quoi ça sert ?

Have fun!

Denpendency Injection with Angular2

Vous aimeriez en savoir un peu plus au sujet d'Angular2 et comment se passe le design pattern d'injection des dépendances avec Angular2. Il me semble que c'est le sujet du moment celui que tous les web développeur aimeraient connaître. Je viens de lire plusieurs posts concernant ce sujet sur d'autres sites.

Le truc le plus marrant que j'ai lu ou vu c'est ça :

ADependency Injection in Angular2

https://pascalprecht.github.io/slides/di-in-angular-2/#/ non n'existe plus !

Claire net précis, ce n'est pas une vidéo, plutôt une présentation animée, rapide ; et c'est Fun, très Fun ! C'est pourquoi j'en prend note ici.

https://angular.io/guide/dependency-injection

Pourquoi faut-il un "framework" d'Injection des dépendances ?

Pour la testabilité. En prod on construira le système avec les "vrais objets" en test on utilisera des Mock Objets c'est à dire des objets avec un comportement spécial de test. Il se trouve que ce Design Patterns d'injection des dépendances est mieux fait en "Angular2", ce que montre cette présentation.

This To Be Continued !

Je viens d'avoir une démonstration de ce design pattern dans une présentation de ASP.NET Core ...

C# Design Patterns

Les 23 patterns du GoF (Gang of Four) sont décrites sur le Site de  Do Factory.

Les trois grands types de patternes

Création - Creational

   Abstract Factory
Abstract Factory
Création de famille d'objets sans être obligé de spécifier leurs classes concrètement
  Singleton

Structure - Structural

  Adapter
Adapter
Adapter les interfaces pour faire travailler des composants ensemble
  Facade
  Proxy
Proxy
Gestion du contrôle d'accès

Comportement - Behavioral

  Observer

DP - Comportementale - l'Observer
On To Many dependances pour notifier une mise à jour.

Au sein du CodePlex : Tutorial: Common Design Patterns in C# 4.0 non c'est fini !


Exemple très intéressant avec du code C# et des modèle UML
Il manque malheureusement bon nombre de patterns

Cela ne va pas sans un peu de conception UML.

Et concernant le pattern, à lire : Singleton Design Pattern

Et si l'on compare avec la solution du Singleton décrite par Do Factory
Et bien on est pas sorti d'affaire ...

Singleton Design Pattern

Le pattern singleton est l'un des pattern les mieux connu en ingénierie informatique. Une singleton est une classe qui ne permet qu'une seule instance d'elle même. Et pourtant, en lisant cet article, vous pourriez être surpris ...

Singleton design pattern
UML Class diagram Singleton

Avec un article général sur ce pattern :

http://csharpindepth.com/Articles/General/Singleton.aspx

Article traduit par Jérôme Lambert sur développez.com :

http://jlambert.developpez.com/tutoriels/dotnet/implementation-pattern-singleton-csharp/

Ce sujet permet d'aborder un certain nombre de problématiques pointues comme le "thread-safe", l'initialisation des variables statiques ... Qui sont des problématiques systèmes, à résoudre absolument si l'on veut développer une application.

Finalement, la solution 4 est :

"Sealed" c'est pour sceller la Class qu'une autre Class ne puisse pas en hériter...

C'est la seule écriture qui résout la problématique du Singleton en C# : 

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();
    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }
  // This constructor to tell C# compiler to do not
  // create default public constructor
  private Singleton()
  {
  }
   public static Singleton Instance
   {
       get
       {
           return instance;
       }
   }
}

Et voici un exemple de ce qu'il ne faut pas écrire :

// Bad code! Do not use!
public sealed class Singleton
{
    private static Singleton instance=null;

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            if (instance==null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

C'est assez aberrant de constater combien d'encre à fait couler cette simple spécification de déclarer une variable unique pour tout le programme... mais les affres du C# sont impénétrables et insondables. C'est en pratiquant que l'on acquiert l'expérience nécessaire à l'écriture de "bons programmes".

N'hésitez pas à commenter, à liker...