Guide du débutant pour les modèles de conception

Vous êtes-vous déjà demandé quels sont les modèles de conception? Dans cet article, j'expliquerai pourquoi les modèles de conception sont importants et donnerai quelques exemples, en PHP, de la date et de la raison de leur utilisation..


Quels sont les modèles de conception?

Les modèles de conception sont des solutions optimisées et réutilisables aux problèmes de programmation que nous rencontrons au quotidien. Un modèle de conception n'est pas une classe ou une bibliothèque que nous pouvons simplement connecter à notre système; c'est beaucoup plus que ça. C'est un modèle qui doit être implémenté dans la bonne situation. Ce n'est pas spécifique à la langue non plus. Un bon modèle de conception doit pouvoir être mis en œuvre dans la plupart des langues, voire dans toutes les langues, en fonction des capacités de la langue. Plus important encore, tout modèle de conception peut être une arme à double tranchant. Si elle est appliquée au mauvais endroit, elle peut être désastreuse et créer de nombreux problèmes pour vous. Cependant, mis en place au bon endroit, au bon moment, il peut être votre sauveur.

Il existe trois types de base de modèles de conception:

  • de construction
  • création
  • comportementale

De construction les schémas traitent généralement des relations entre entités, ce qui facilite leur collaboration.

Création les modèles fournissent des mécanismes d'instanciation, facilitant la création d'objets de manière adaptée à la situation.

Comportementale des modèles sont utilisés dans les communications entre entités et rendent la communication plus facile et plus flexible pour ces entités.

Pourquoi devrions-nous les utiliser?

Les modèles de conception sont, par principe, des solutions bien pensées aux problèmes de programmation. De nombreux programmeurs ont déjà rencontré ces problèmes et ont utilisé ces «solutions» pour y remédier. Si vous rencontrez ces problèmes, pourquoi recréer une solution lorsque vous pouvez utiliser une réponse déjà éprouvée?

Exemple

Imaginons que vous ayez la responsabilité de créer un moyen de fusionner deux classes qui font deux choses différentes en fonction de la situation. Ces deux classes sont fortement utilisées par le système existant à différents endroits, ce qui rend difficile la suppression de ces deux classes et la modification du code existant. Pour ajouter à cela, la modification du code existant nécessite également de tester tout code modifié, car ces types de modifications, dans un système reposant sur différents composants, introduisent presque toujours de nouveaux bogues. Au lieu de cela, vous pouvez implémenter une variante du modèle de stratégie et du modèle d'adaptateur, qui peut facilement gérer ces types de scénarios..

_context = $ context;  fonction publique operation1 () if ($ this -> _ context == "context_for_class_one") $ this -> _ class_one-> operation1_in_class_one_context ();  else ($ this -> _ context == "context_for_class_two") $ this -> _ class_two-> operation1_in_class_two_context (); 

Assez simple, non? Voyons maintenant de plus près le modèle de stratégie.


Modèle de stratégie


Image reproduite avec l'aimable autorisation de http://cioinnervoice.wordpress.com

le modèle de stratégie est un modèle de conception comportemental qui vous permet de décider de la ligne de conduite qu'un programme doit entreprendre, en fonction d'un contexte spécifique au cours de l'exécution. Vous encapsulez deux algorithmes différents dans deux classes et décidez au moment de l'exécution lequel stratégie tu veux aller avec.

Dans notre exemple ci-dessus, la stratégie est basée sur ce que le $ contexte variable était au moment où la classe a été instanciée. Si vous lui donnez le contexte pour class_one, il utilisera class_one, et vice versa.

Mignon, mais où puis-je l'utiliser?

Imaginez que vous développiez actuellement une classe pouvant mettre à jour ou créer un nouvel enregistrement d'utilisateur. Il a toujours besoin des mêmes entrées (nom, adresse, numéro de téléphone portable, etc.), mais, selon la situation, il doit utiliser des fonctions différentes lors de la mise à jour et de la création. Maintenant, vous pouvez probablement simplement utiliser un if-else pour accomplir cela, cependant, que se passe-t-il si vous devez utiliser cette classe dans un endroit différent? Dans ce cas, vous devrez réécrire la même instruction if-else. Ne serait-il pas plus simple de spécifier votre contexte??

 

Maintenant, le modèle de stratégie "habituel" implique d'encapsuler vos algorithmes dans une autre classe, mais dans ce cas, une autre classe serait une perte de temps. N'oubliez pas que vous n'avez pas à suivre le modèle à la lettre. Les variations fonctionnent tant que le concept reste le même et résout le problème.


Modèle d'adaptateur


Image reproduite avec l'aimable autorisation de http://www.uxcell.com

le modèle d'adaptateur est un modèle de conception structurel qui vous permet de réaffecter une classe avec une interface différente, ce qui lui permet d'être utilisée par un système utilisant différentes méthodes d'appel.

Cela vous permet également de modifier certaines des entrées reçues de la classe de client, ce qui en fait un élément compatible avec les fonctions de l'adapté..

Comment puis-je utiliser cela?

Un autre terme pour faire référence à une classe d’adaptateur est un emballage, ce qui vous permet fondamentalement de "boucler" des actions dans une classe et de les réutiliser dans les bonnes situations. Un exemple classique pourrait être lorsque vous créez une classe de domaine pour des classes de table. Au lieu d’appeler les différentes classes de table et d’appeler leurs fonctions une par une, vous pouvez encapsuler toutes ces méthodes dans une méthode à l’aide d’une classe d’adaptateur. Cela vous permettrait non seulement de réutiliser l'action de votre choix, mais vous évite également de devoir réécrire le code si vous devez utiliser la même action à un endroit différent..

Comparez ces deux implémentations.

Approche non-adaptatrice

CreateOrUpdate (// entrées); $ profile = new Profile (); $ profile-> CreateOrUpdate (// entrées);

Si nous devions le refaire dans un endroit différent, ou même réutiliser ce code dans un projet différent, nous devions tout recopier.

Meilleur

C'est opposé à faire quelque chose comme ça:

NewAccount (// input);

Dans cette situation, nous avons une classe wrapper, qui serait notre classe de domaine de compte:

CreateOrUpdate (// sous-ensemble d'entrées); $ profile = new Profile (); $ profile-> CreateOrUpdate (// sous-ensemble d'entrées); 

De cette façon, vous pouvez utiliser votre domaine de compte à chaque fois que vous en avez besoin. De plus, vous pourrez également envelopper d'autres classes dans votre classe de domaine..


Modèle de méthode d'usine


Image reproduite avec l'aimable autorisation de http://www.lankanewspappers.com

le méthode d'usine motif est un motif de création qui fait exactement ce qu'il semble: c'est une classe qui agit comme une fabrique d'instances d'objets.

L'objectif principal de ce modèle est d'encapsuler la procédure de création pouvant couvrir différentes classes en une seule fonction. En fournissant le contexte correct à la méthode factory, il sera capable de retourner le bon objet.

Quand puis-je utiliser ceci?

Le meilleur moment pour utiliser le modèle de méthode d'usine est lorsque vous avez plusieurs variantes différentes d'une même entité. Disons que vous avez une classe de boutons; cette classe a différentes variantes, telles que ImageButton, InputButton et FlashButton. En fonction de l'endroit, vous devrez peut-être créer différents boutons. C'est ici que vous pouvez utiliser une usine pour créer les boutons à votre place.!

Commençons par créer nos trois classes:

_html;  class ImageButton étend Button protected $ _html = "…"; // Cela devrait être le code HTML que vous voulez pour votre bouton basé sur une image classe InputButton extend Button protected $ _html = "…"; // Cela devrait être le HTML que vous voulez pour votre bouton normal ()  la classe FlashButton étend Button protected $ _html = "…"; // Cela devrait être le code HTML que vous voulez pour votre bouton Flash

Maintenant, nous pouvons créer notre classe d’usine:

 

Nous pouvons utiliser ce code comme suit:

$ buttons = array ('image', 'input', 'flash'); foreach ($ boutons en tant que $ b) echo ButtonFactory :: createButton ($ b) -> getHtml ()

La sortie devrait être le code HTML de tous vos types de boutons. De cette façon, vous seriez en mesure de spécifier le bouton à créer en fonction de la situation et de réutiliser également la condition..


Motif Décorateur


Image reproduite avec l'aimable autorisation de http://www.decoratorsdarlington.co.uk

le décorateur motif est un motif de conception structurelle qui nous permet d'ajouter un comportement nouveau ou supplémentaire à un objet pendant l'exécution, selon la situation..

L'objectif est de faire en sorte que les fonctions étendues puissent être appliquées à une instance spécifique, tout en permettant de créer une instance originale ne contenant pas les nouvelles fonctions. Cela permet également de combiner plusieurs décorateurs pour une instance, de sorte que vous ne soyez pas coincé avec un décorateur pour chaque instance. Ce modèle est une alternative au sous-classement, qui fait référence à la création d'une classe qui hérite des fonctionnalités d'une classe parente. Contrairement à la sous-classification, qui ajoute le comportement au moment de la compilation, la "décoration" vous permet d'ajouter un nouveau comportement pendant l'exécution, si la situation l'exige..

Pour implémenter le motif de décorateur, nous pouvons suivre ces étapes:

  1. Sous-classer la classe "Composant" d'origine dans une classe "Décorateur"
  2. Dans la classe Decorator, ajoutez un pointeur de composant en tant que champ.
  3. Passez un composant au constructeur de Decorator pour initialiser le pointeur de composant
  4. Dans la classe Decorator, redirigez toutes les méthodes "Component" vers le pointeur "Component", puis
  5. Dans la classe Decorator, remplacez les méthodes Component dont le comportement doit être modifié.

Étapes courtoisie de http://en.wikipedia.org/wiki/Decorator_pattern

Quand puis-je utiliser ceci?

Le meilleur endroit pour utiliser le modèle de décorateur est lorsque vous avez une entité qui doit avoir un nouveau comportement uniquement si la situation l'exige. Supposons que vous ayez un élément de lien HTML, un lien de déconnexion, pour lequel vous souhaitez effectuer des opérations légèrement différentes en fonction de la page en cours. Pour cela, on peut utiliser le motif décorateur.

D'abord, établissons les différentes "décorations" dont nous aurons besoin.

  • Si nous sommes sur la page d'accueil et que nous sommes connectés, ce lien doit être entouré de balises h2.
  • Si nous sommes sur une autre page et que nous sommes connectés, ce lien doit être entouré de balises soulignées.
  • Si nous sommes connectés, placez ce lien dans des tags forts.

Une fois que nous avons établi nos décorations, nous pouvons commencer à les programmer.

_html = "Déconnexion";  fonction publique setHtml ($ html) $ this -> _ html = $ html;  fonction publique render () echo $ this -> _ html;  class LogoutLinkH2Decorator étend HtmlLinks protected $ _logout_link; fonction publique __construct ($ logout_link) $ this -> _ logout_link = $ logout_link; $ this-> setHtml ("

". $ this -> _ html."

"); public function __call ($ name, $ args) $ this -> _ logout_link -> $ name ($ args [0]); class LogoutLinkUnderlineDecorator étend HtmlLinks protected $ _logout_link; public function __construct ($ logout_link) $ this -> _ logout_link = $ logout_link; $ this-> setHtml ("". $ this -> _ html.""); public function __call ($ name, $ args) $ this -> _ logout_link -> $ name ($ args [0]); class LogoutLinkStrongDecorator étend HtmlLinks protected $ _logout_link; public function __construct ($ logout_link) $ this -> _ logout_link = $ logout_link; $ this-> setHtml ("". $ this -> _ html.""); public function __call ($ name, $ args) $ this -> _ logout_link -> $ name ($ args [0]);

Nous devrions alors pouvoir l'utiliser comme ceci:

$ logout_link = new LogoutLink (); if ($ is_logged_in) $ logout_link = new LogoutLinkStrongDecorator ($ logout_link);  if ($ in_home_page) $ logout_link = new LogoutLinkH2Decorator ($ logout_link);  else $ logout_link = new LogoutLinkUnderlineDecorator ($ logout_link);  $ logout_link-> render ();

Nous pouvons voir ici comment nous pouvons combiner plusieurs décorateurs si nous en avons besoin. Comme tous les décorateurs utilisent le __appel fonction magique, nous pouvons toujours appeler les méthodes de la fonction d'origine. Si nous supposons que nous sommes actuellement dans la page d'accueil et que nous sommes connectés, la sortie HTML devrait être:

Connectez - Out


Motif Singleton


Image reproduite avec l'aimable autorisation de http://intoxicologist.wordpress.com

le singleton modèle de conception est un modèle de conception qui garantit que vous ne possédez qu'une seule instance d'une classe particulière pendant la durée de votre exécution, et fournit un point d'accès global à l'instance unique.

Cela facilite la configuration d'un point de "coordination" pour d'autres objets qui utilisent l'instance singleton également, car les variables du singleton seront toujours les mêmes pour tout ce qui l'appelle..

Quand puis-je utiliser ceci?

Si vous devez passer une instance spécifique d'une classe à une autre, vous pouvez utiliser le modèle singleton pour éviter de devoir passer l'instance via un constructeur ou un argument. Imaginez que vous ayez créé une classe Session, qui simule le tableau global $ _SESSION. Comme cette classe n'a besoin d'être instanciée qu'une seule fois, nous pouvons implémenter un motif singleton comme ceci:

 

En faisant cela, nous pouvons accéder à notre instance de session à partir de différentes parties de notre code, même dans différentes classes. Ces données vont persister pendant tous les appels à getInstance.


Conclusion

Il y a beaucoup plus de modèles de conception à étudier; Dans cet article, je n’ai mis en avant que certains des plus importants que j’utilise lors de la programmation. Si vous souhaitez en savoir plus sur les autres modèles, la page Modèles de design de Wikipedia contient une pléthore d'informations. Si cela ne vous suffit pas, vous pouvez toujours consulter Design Patterns: éléments d’un logiciel orienté objet réutilisable, considéré comme l’un des meilleurs livres de modèles de conception disponibles..

Une dernière chose: quand vous utilisez ces motifs, toujoursays assurez-vous que vous essayez de résoudre le problème correct. Comme je l'ai mentionné précédemment, ces modèles de conception constituent une épée à double tranchant: s'ils sont utilisés dans un mauvais contexte, ils peuvent potentiellement aggraver les choses; mais s'ils sont utilisés correctement, ils deviennent indispensables.

Si vous avez trouvé ce tutoriel utile, pourquoi ne pas consulter la gamme de scripts PHP sur Envato Market. Il existe des milliers de scripts utiles qui peuvent accélérer votre développement et vous aider à obtenir de meilleurs résultats finaux. Vous pouvez trouver des systèmes de réservation, des formulaires de contact AJAX, des systèmes de newsletter, et bien plus encore. 

Scripts PHP sur Envato Market