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..
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:
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..
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:
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).
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:
De même, l'abonné doit pouvoir faire deux choses:
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.
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.
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:
mon_abonné_personnel
- et c'est enregistré avec le le contenu
un événementle 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..
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:
É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..
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..