Dans lrsquoarticle précédent, nous avons constaté que la tâche de générer des messages était arbitraire, mais qursquoelle nrsquoétait qursquoune 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 à rappeler que Josh a conçu ce plug in à des fins éducatives pour enseigner lrsquooop avancé et les tests. Lorsque et moi travaillons ensemble à travers la revue de code, la tâche get content devient une excellente occasion drsquoapprofondir 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 drsquoassemblage. 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 lrsquoutiliser à plusieurs reprises sur chaque projet. Nous voulons trouver un moyen drsquoisoler les besoins opérationnels drsquoun projet afin drsquoobtenir 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 imaginiez Q
Crsquoest 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 lrsquoimplémentation du projet, ce qui signifie que nous pouvons échanger lrsquoimplémentation entre les projets.
Pensez au pouvoir de ce concept. La méthode filterwpquery:: getposts () filterwpquery:: getposts () est indépendante de lrsquoimplé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 qursquoon devrait parler de pourquoi crsquoest important. Pourquoi la réutilisation est elle importante? Il est temps drsquoavoir une discussion de bord sur la raison pour laquelle la réutilisabilité est importante pour votre équipe et votre entreprise. Imaginez si deviez coder chaque implémentation dans filterwpquery:: getposts (). Que se passe t il ensuite? Vous devez modifier lrsquoimplémentation. Cela signifie que éditez manuellement filterwpquery:: getposts (). Ça a lrsquoair 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 poser une question. Que se passe t il lorsque trouvez un bogue ou des changements qui nécessitent des modifications à ce code de base?
Pensez aux projets que 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, ne pouvez pas résoudre tous les problèmes en changeant. Crsquoest pas vrai. Cela signifie que 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 drsquoerreurs sur plusieurs éléments augmente la probabilité drsquoerreurs drsquoentrée et drsquointroduction drsquoune 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 lrsquoentretien de tous vos projets coûteront de lrsquoargent à 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é drsquoé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 guide dans vos expériences psychologiques. Supposons qursquoil existe un moyen drsquoétablir une norme stricte définissant comment interagir avec plusieurs implémentations. Pour les rendre réutilisables, nous avons besoin drsquoun 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 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 lrsquoimplé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 (). À lrsquointerne, chaque implémentation gère son propre travail personnalisé pour obtenir du contenu.
Mais attends une seconde. Comment faire respecter cette stricte normalisation? Dans PHP oop, nous utilisons une interface. Qursquoest ce qursquoune interface? Une interface est une convention qui définit comment interagir avec chaque objet qui lrsquoimplémente. Le contrat fixe des normes strictes.
Une interface est une convention qui définit comment interagir avec chaque objet qui lrsquoimplémente en définissant des normes strictes. Conceptuellement, les interfaces sont des adhésifs qui lient le Code ensemble, nous permettant drsquoisoler 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. Lrsquoinjection de différentes implémentations nous permet drsquoé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 lrsquoimplémentation du projet à elle. Modifier getposts () pour lrsquoimplémenter par un appel de convention. Implémentation drsquoinjection 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}
$mulation post = []
Pour ($numeropost = 0 $numeropost) lt?php
spazio dei nomi CalderaLearnRestSearchContentGetter
**
* Definisce il contratto per ogni implementazione del content getter.
* @pacchetto CalderaLearnRestSearchContentGetter
*
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 gt Filter = lsquooriginalrsquo
$mulation post [] = $post
}
Retour à $mulation post
}
Étape 3: connectez le contrat à filterwpquery ensuite, nous devons lier lrsquoimplémentation à la requête de recherche: Getcontent ()
}
Permettez moi drsquoexpliquer ce qui se passe ici: Nous spécifions une propriété statique appelée $contentgetter pour contenir lrsquoimplémentation. Crsquoest 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 drsquoun projet à lrsquoautre, prévoyez les réutiliser. Profitez donc de ces implémentations interchangeables. En conséquence, 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 invite à explorer. Qursquoen penses tu? Non, sérieusement, je veux savoir ce que tu penses. Je invite à poser des questions, à partager vos points de vue ou à partager quelques idées dans les commentaires ci dessous. Voyez les avantages de la réutilisation de la conception? Est il logique de séparer lrsquoimplémentation de la partie réutilisable de la base de code par cette expérience psychologique et le processus de reconstruction détaillé? Jrsquoai hâte de discuter de la réutilisabilité avec .
Conception de la mise en oeuvre des demandes de recherche interchangeables révision du Code partie 4