Modèles de conception dans WordPress une introduction

Pour ceux qui ont une vaste expérience en génie logiciel, les modèles de conception doivent être un territoire familier; Cependant, il existe tout un groupe de développeurs - en particulier dans la communauté du développement Web - qui ne sont pas nécessairement familiarisés avec les modèles de conception (même s'ils les ont probablement utilisés!)..

Dans cette série, nous allons examiner les modèles de conception, en particulier dans le contexte de WordPress, leur utilité, et quelques exemples pratiques que nous pouvons utiliser dans nos thèmes et plugins..

Le but ultime de la série est de fournir une définition précise des modèles de conception, de leur utilité, de leur utilisation dans WordPress, puis de passer en revue deux exemples populaires que nous pouvons facilement utiliser dans notre propre travail..

Avant de passer en revue quelques exemples pratiques, définissons des modèles de conception et examinons un exemple de la façon dont ils sont utilisés dans WordPress Core..


Modèles de conception définis

Pour ceux d'entre vous qui n'ont jamais entendu parler ou qui n'ont jamais utilisé de modèles de conception, il est important de comprendre ce qu'ils sont avant de commencer à les utiliser dans notre travail..

Wikipedia fournit la définition suivante:

Un modèle de conception en architecture et en informatique est un moyen formel de documenter une solution à un problème de conception dans un domaine d’expertise particulier. Un ensemble organisé de modèles de conception se rapportant à un domaine particulier est appelé langage de modèle..

Peut-être une définition plus simplifiée serait:

Un motif est une conception qui peut être appliquée à un problème dans une situation spécifique.

Si c'est encore pas clair, pense de cette façon:

  • Chaque fois que vous construisez un logiciel, vous êtes susceptible de reconnaître que vous résolvez un problème que vous avez déjà résolu auparavant. En tant que tel, vous savoir comment le résoudre.
  • Naturellement, la solution au problème sera un formulaire légèrement plus général, applicable à la manière dont vous l'avez appliqué précédemment..
  • Cette forme généralisée de la solution peut être considérée comme le motif de conception.

L'implémentation générale et l'architecture seront exactement les mêmes. cependant, les détails de la mise en œuvre varieront naturellement d'un projet à l'autre, mais c'est simplement la nature de la bête.

Dans les sections à venir et les articles à venir, nous examinerons cela plus en détail..


Modèles de conception dans WordPress

Si vous avez réalisé un type de développement WordPress impliquant le système de hook, c’est-à-dire que vous avez écrit des plugins entiers, des thèmes, voire une simple fonction, et tiré parti des avantages add_action ou add_filter fonctions - alors vous avez utilisé des modèles de conception.

WordPress utilise ce qu'on appelle un modèle de conception piloté par les événements. Il existe plusieurs variantes de modèles de conception pilotés par les événements. Nous en examinerons un dans un instant, mais l'essentiel des modèles est le même:

  • Une partie du modèle implémente ce que l'on appelle un éditeur
  • Une partie du modèle implémente ce que l'on appelle un abonné

De manière générale, l'éditeur diffuse un message qui quelque chose est arrivé à tous les objets qui sont abonnés à cet éditeur particulier.

Une autre façon de voir les choses est que, dans le logiciel, chaque fois que quelque chose arrive, on dit qu'un événement est déclenché. L’endroit le plus courant dans le développement Web est peut-être le langage JavaScript, avec des éléments tels que le clic de la souris, l’appui sur une touche du clavier ou quelque chose de similaire..

Nous écrivons ensuite des fonctions qui gèrent ces fonctions, et ces fonctions sont appelées de manière appropriée des gestionnaires d’événements, car elles sont responsables du traitement du cas quand un événement se produit.

Pas terriblement compliqué, non? Honnêtement, je pense parfois que la terminologie peut être plus déroutante que la mise en œuvre réelle.

Quoi qu'il en soit, dans le contexte de WordPress - ou de toute application Web, les événements ne se limitent pas aux pressions sur les touches ou aux clics de souris. Cela peut se produire à différentes étapes du cycle de vie du chargement de la page, lorsque les données sont écrites dans la base de données, lorsque les données sont lues dans la base de données, etc..

En fin de compte, vous pouvez implémenter le modèle comme bon vous semble afin de pouvoir fournir des points d'ancrage dans lesquels les développeurs peuvent enregistrer des fonctions à déclencher dès que l'événement se produit.

Cela nous ramène à l’architecture de WordPress: des crochets sont placés dans le code de manière à ce que nous puissions enregistrer une fonction à déclencher à chaque fois. quelque chose se passe (c'est-à-dire chaque fois qu'un événement se produit).


Regard sur une architecture événementielle: le modèle Observer

Il existe un certain nombre de modèles de conception pilotés par les événements, dont l'un est appelé modèle d'observateur. Ce modèle particulier est également appelé modèle éditeur-abonné ou, plus précisément, Pub-Sub..

Dans la mise en œuvre la plus simple de ce modèle, il existe un seul éditeur responsable de la diffusion des messages vers un ou plusieurs abonnés. Les abonnés sont responsables de s'enregistrer auprès de l'éditeur, puis l'éditeur est responsable de l'envoi d'un message ou de la prise de mesures sur tous les abonnés..

Un diagramme de haut niveau ressemblerait à ceci:

Du point de vue du code, l'éditeur a besoin de trois choses:

  1. Un moyen de maintenir une liste des abonnés
  2. Un moyen pour les abonnés de s'inscrire eux-mêmes
  3. Un moyen de diffuser un message à tous les abonnés

De même, l'abonné doit pouvoir faire deux choses:

  1. S'enregistrer avec l'éditeur
  2. Prendre éventuellement des mesures lorsque l'éditeur lui envoie un message

Cela peut être mis en œuvre de différentes manières, mais pour que l'objectif soit relativement simple, supposons que les abonnés s'enregistrent auprès de l'éditeur avec l'observateur. registre méthode et la fonction accepte une référence à l'abonné et chaque abonné a une mettre à jour méthode que l'éditeur appelle lors de la diffusion du message.

Code de l'éditeur

 class MyPublisher / ** La liste des abonnés inscrits auprès de cet éditeur * / private $ abonnés; / ** * Responsable de l'initialisation de la classe et de l'établissement de la liste des abonnés. * / public function __construct () $ this-> subscribers = array ();  // end constructor / ** * Ajoute le sujet entrant à la liste des abonnés enregistrés * * @ @param array $ subject Le sujet à ajouter à la liste des abonnés * / public function register ($ subject) array_push ($ this- > abonnés, $ sujet);  // end register_subscriber / ** * Notifie à tous les abonnés qu'il s'est passé quelque chose en appelant leur méthode 'update' *. * / public function notify_subscribers () for ($ i = 0; $ l < count( $this->les abonnés ); $ i ++) $ current_subscriber = $ this-> abonnés [$ i]; $ current_subscriber-> update ();  // fin pour // fin notificateur_abonnés // fin de classe

Le code ci-dessus est à peu près aussi simple que possible:

Pour ceux qui sont plus expérimentés dans les techniques orientées objet, vous verrez probablement la nécessité de créer une interface de classe pour Publisher, mais cela sort du cadre de ce tutoriel..

Rappelez-vous que le but est simplement de donner un exemple de ce à quoi un simple observateur peut ressembler.

Code d'abonnement

Créer un éditeur ne représente en réalité que la moitié de la mise en œuvre. Rappelez-vous, nous devons avoir quelque chose qui, en réalité, vous savez, souscrit à l'éditeur pour prendre des mesures chaque fois que quelque chose se passe.

C’est là que l’abonné au nom bien choisi entre en jeu.

 class MySubscriber / ** L'éditeur auquel cette classe est inscrite * / private $ publisher; / ** * Responsable de l'initialisation de la classe et de la définition d'une référence à l'éditeur * / public function __construct () $ this-> publisher = new MyPublisher (); $ this-> publisher-> register ($ this);  // end constructor / ** * Il s'agit de la méthode que l'éditeur appelle lorsqu'il diffuse son message. * / public function update () / ** L'implémentation est basée uniquement sur ce que vous souhaitez. * / // fin de la mise à jour // fin de la classe

En bref, ça y est. Notez ci-dessus que cette mise en œuvre de la mettre à jour la fonction n'est pas réellement définie. C'est parce que cela nous donne la possibilité de fournir un comportement unique à cette instance spécifique.

Mais rappelez-vous, le noyau de WordPress contient beaucoup de code qui n’est pas orienté objet. Au lieu de cela, c'est procédural. En tant que tel, la mise en œuvre d’un modèle comme celui-ci varie un peu.

Par exemple, une analogie dans WordPress ressemblerait à ceci:

 function my_custom_subscriber ($ content) $ content = 'Ceci est mon contenu personnalisé.' . $ contenu; retourne $ contenu;  // end my_custom_subscriber add_action ('the_content', 'my_custom_subscriber');

Notez que la syntaxe est un peu différente, mais nous faisons essentiellement la même chose:

  • Nous avons une fonction subscribe - mon_abonné_personnel - et c'est enregistré avec le le contenu un événement
  • Quand le le contenu fonction déclenche, notre fonction personnalisée se déclenchera.

Rien de trop compliqué, j'espère.

L'un des objectifs de cette série est non seulement de fournir quelques exemples de modèles de conception et de leur mise en œuvre, mais ils sont déjà en place dans les systèmes existants..


Les modèles que nous examinerons

En plus du modèle événementiel que nous avons examiné ci-dessus, nous allons également examiner deux modèles communs, pratiques et très utiles dans notre travail quotidien..

Plus précisément, nous allons examiner les modèles suivants:

  1. Motif Singleton. Dans la conception orientée objet, le modèle unique garantit la création d'une seule instance d'une classe. Ceci est utile pour éviter de créer accidentellement plusieurs instances en conservant leurs propres ensembles de données, ce qui donnerait des résultats contradictoires au cours du cycle de vie d'un projet..
  2. Modèle d'usine simple. Si vous avez une collection de classes dont chacune est conçue pour gérer un type de données spécifique (au lieu d'une grande classe), le modèle d'usine simple est utile pour examiner les données entrantes puis renvoyer une instance de la classe appropriée pour le traitement des données.

Évidemment, parler de logiciel ne va jusqu'à présent pas parler de diagrammes et / ou de code, nous allons donc examiner ces deux articles dans les prochains articles..


Conclusion

Comme vous pouvez le constater, le concept de design patterns n’a rien de très compliqué et il ya beaucoup à gagner à les utiliser dans notre travail. Le principal défi des développeurs est peut-être d'utiliser des modèles de conception pour les utiliser..

Au lieu de cela, il est important de reconnaître qu'il existe certaines situations dans lesquelles les modèles de conception sont applicables. C'est-à-dire qu'il existe certains problèmes pour lesquels les modèles de conception sont la solution parfaite. L’expérience est sans doute le meilleur enseignant pour savoir quand utiliser un motif de conception et quand ne pas l’utiliser..

Dans les articles suivants, nous espérons pouvoir couvrir suffisamment de territoire pour fournir deux exemples concrets de modèles de conception, leur application, leur utilisation et la manière dont ils peuvent nous aider dans nos travaux futurs..