Conception de la mise en oeuvre des demandes de recherche interchangeables – révision du Code partie 4
Dans l’article précédent, nous avons constaté que la tâche de générer des messages était arbitraire, mais qu’elle n’était qu’une implémentation possible du contenu de la requête de recherche. Par conséquent, nous avons divisé les activités « obtenir du contenu » et « générer des messages » en différentes approches. Ce projet nous prépare à discuter de la conception de la mise en oeuvre des demandes de recherche échangeables. Avant de commencer, je tiens à vous rappeler que Josh a conçu ce plug – in à des fins éducatives pour vous enseigner l’oop avancé et les tests. Lorsque vous et moi travaillons ensemble à travers la revue de code, la tâche get content devient une excellente occasion d’approfondir oop en explorant comment concevoir pour la réutilisation.
Commençons par les exigences et passons au concept de conception. Explorer les besoins – penser aux applications de traitement de la recherche dans le monde réel. Chaque projet peut nécessiter des exigences différentes pour obtenir le contenu de la recherche. Un projet peut nécessiter une certaine récupération et un certain traitement avant de revenir. Un autre projet peut nécessiter des tâches de tri et d’assemblage. Selon le projet, les spécifications sur la façon de gérer la saisie du contenu peuvent varier en fonction de la cartographie du contenu du site et des exigences opérationnelles.
Comment rendre la classe filterwpquery plus flexible pour répondre à ces différentes exigences du projet sans augmenter les coûts ou les risques? Nous analysons nos objectifs de conception pour répondre à nos besoins: Nous voulons créer filterwpquery une fois et l’utiliser à plusieurs reprises sur chaque projet. Nous voulons trouver un moyen d’isoler les besoins opérationnels d’un projet afin d’obtenir du contenu pour la recherche. Nous voulons que ces « Exigences » soient des implémentations interchangeables. Nous voulons réduire les coûts et les risques. Explorer les concepts architecturaux je veux que vous imaginiez Q
C’est le concept architectural dans votre esprit. Supposons que filterwpquery:: getposts () puisse invoquer une méthode normalisée sur un objet $contentgetter générique. Supposons que cet objet générique représente l’implémentation du projet, ce qui signifie que nous pouvons échanger l’implémentation entre les projets.
Pensez au pouvoir de ce concept. La méthode filterwpquery:: getposts () filterwpquery:: getposts () est indépendante de l’implémentation; Au lieu de cela, dites simplement à ce sujet général, \
Attends, il y a un autre avantage. Il offre un mécanisme de réduction des coûts et des risques. Je pense qu’on devrait parler de pourquoi c’est important. Pourquoi la réutilisation est – elle importante? Il est temps d’avoir une discussion de bord sur la raison pour laquelle la réutilisabilité est importante pour votre équipe et votre entreprise. Imaginez si vous deviez coder chaque implémentation dans filterwpquery:: getposts (). Que se passe – t – il ensuite? Vous devez modifier l’implémentation. Cela signifie que vous éditez manuellement filterwpquery:: getposts (). Ça a l’air innocent. Mais derrière cela se cachent les coûts et les risques. Pourquoi?
Cette classe dispose également d’autres fonctionnalités de base intégrées, telles que suspendre et déposer dans WordPress et décider de filtrer ou non les demandes de recherche. Laissez – moi vous poser une question. Que se passe – t – il lorsque vous trouvez un bogue ou des changements qui nécessitent des modifications à ce code de base?
Pensez aux projets que vous avez déjà envoyés avec le même code. En cas de changement, tous les autres éléments doivent être mis à jour. Cependant, si chaque classe est différente, vous ne pouvez pas résoudre tous les problèmes en changeant. C’est pas vrai. Cela signifie que vous devez mettre à jour chaque élément manuellement. Ça prendra du temps.
Mais cette approche manuelle pose un problème plus coûteux. La correction manuelle d’erreurs sur plusieurs éléments augmente la probabilité d’erreurs d’entrée et d’introduction d’une autre erreur. Le codage dur de la mise en oeuvre de chaque projet pour obtenir du contenu est une mauvaise stratégie. À long terme, le soutien et l’entretien de tous vos projets coûteront de l’argent à votre entreprise. Une meilleure stratégie consiste à isoler les personnalisations entre les projets, à concevoir des bibliothèques de code pour les rendre flexibles et réutilisables, tout en fournissant la possibilité d’échanger différentes implémentations.
Comment faire pour que filterwpquery:: getposts () appelle un objet générique? Nous pouvons profiter de la puissance et de la flexibilité du polymorphisme. Restez avec moi pendant que je vous guide dans vos expériences psychologiques. Supposons qu’il existe un moyen d’établir une norme stricte définissant comment interagir avec plusieurs implémentations. Pour les rendre réutilisables, nous avons besoin d’un moyen de définir rigoureusement chaque méthode interactive, puis de forcer chaque implémentation à les mettre en œuvre. Tu es toujours avec moi? Je pense que pour vous aider à visualiser votre conception, nous devons retourner à notre Code.
Supposons que nous voulions que notre filterwpquery:: getposts () appelle toujours la même méthode, quelle que soit l’implémentation qui y est liée. Nous appelons cette méthode standard getcontent (). Par conséquent, chaque implémentation de chaque projet a une méthode getcontent (). À l’interne, chaque implémentation gère son propre travail personnalisé pour obtenir du contenu.
Une interface est une convention qui définit comment interagir avec chaque objet qui l’implémente en définissant des normes strictes. Conceptuellement, les interfaces sont des adhésifs qui lient le Code ensemble, nous permettant d’isoler les implémentations personnalisées spécifiques au projet tout en réutilisant la classe filterwpquery à plusieurs reprises. Il est temps de regarder le Code. L’injection de différentes implémentations nous permet d’étudier le processus de remaniement du Code pour le rendre plus réutilisable en fonction de ce qui est discuté dans cet article. Nous avons besoin de: Ajouter un contrat. Faire du post – générateur une implémentation. Contrat lié: initialise filterwpquery et relie l’implémentation du projet à elle. Modifier getposts () pour l’implémenter par un appel de convention. Implémentation d’injection au démarrage du plug – in. Étape 1: définir le contrat commençons par la construction du contrat:
Générer des postes;
}
\/ * *
Générer une série de messages de simulation.
* *
* @ Param int $nombre de messages à générer.
* *
Retourner le tableau
* \/
Fonction dédiée generateposts ($qty): Tableau
{Y}
$Simulation post = [];
Pour ($numeropost = 0; $numeropost) <?php
spazio dei nomi CalderaLearn\RestSearch\ContentGetter;
/**
* Definisce il contratto per ogni implementazione del content getter.
* @pacchetto CalderaLearn\RestSearch\ContentGetter
*/
interfaccia ContentGetterContract
{
/**
* Gestisce ottenere il contenuto per la query di ricerca.
*
* @param int $quantità Numero da ottenere.
*
* @return array
*/
funzione pubblica getContent( $quantità = 4 ): array;
} Nota che il nostro contratto ha un metodo getContent() e questo metodo accetta la quantità e restituisce un array di contenuto. Passaggio 2: implementazione del generatore di post Usiamo questo contratto e costruiamo il generatore di post come implementazione separata. Per fare ciò, implementiamo il contratto, aggiungiamo il metodo e quindi spostiamo il codice del generatore di post da FilterWPQuery a questa nuova classe. Post _ title = \
$post – > Filter = ‘original’;
$Simulation post [] = $post;
}
Retour à $Simulation post;
}
Étape 3: connectez le contrat à filterwpquery ensuite, nous devons lier l’implémentation à la requête de recherche: Getcontent ();
}
Permettez – moi d’expliquer ce qui se passe ici: Nous spécifions une propriété statique appelée $contentgetter pour contenir l’implémentation. C’est notre objet commun de capture de contenu. Ajouter
Une interface stricte pour la façon dont SCE interagit avec la mise en œuvre. Comment exploiter le polymorphisme en injectant les implémentations nécessaires au projet. Nous avons fait cet exercice pour développer vos idées sur la construction de code réutilisé. En concevant des implémentations distinctes pour les parties du Code qui peuvent changer d’un projet à l’autre, vous prévoyez les réutiliser. Profitez donc de ces implémentations interchangeables. En conséquence, vous pouvez réduire les coûts et les risques en rendant le projet plus flexible. Le Code final et chaque étape de remaniement sont enregistrés dans la demande de traction # 5 sur github. Je vous invite à explorer. Qu’en penses – tu? Non, sérieusement, je veux savoir ce que tu penses. Je vous invite à poser des questions, à partager vos points de vue ou à partager quelques idées dans les commentaires ci – dessous. Voyez – vous les avantages de la réutilisation de la conception? Est – il logique de séparer l’implémentation de la partie réutilisable de la base de code par cette expérience psychologique et le processus de reconstruction détaillé? J’ai hâte de discuter de la réutilisabilité avec vous.