Ontwerppatronen in WordPress een inleiding

Voor degenen die een uitgebreide achtergrond in software engineering hebben, moeten ontwerppatronen vertrouwd terrein zijn; Er is echter een hele groep ontwikkelaars - vooral in de webontwikkelingsgemeenschap - die niet noodzakelijk vertrouwd zijn met ontwerppatronen (ook al hebben ze deze waarschijnlijk gebruikt!).

In deze serie gaan we kijken naar ontwerppatronen, met name in de context van WordPress, hoe ze nuttig zijn en enkele praktische voorbeelden die we kunnen gebruiken in onze thema's en plug-ins..

Het uiteindelijke doel van de serie is om een ​​gedegen definitie te geven van wat ontwerppatronen zijn, waarom ze nuttig zijn, hoe ze worden gebruikt in de kern van WordPress en vervolgens twee populaire voorbeelden te bekijken die we gemakkelijk in ons eigen werk kunnen gebruiken..

Voordat we enkele praktische voorbeelden bekijken, kunnen we ontwerppatronen definiëren en een voorbeeld bekijken van hoe ze worden gebruikt in de kern van WordPress..


Ontwerppatronen gedefinieerd

Voor diegenen van jullie die nog nooit van gehoord hebben of die nooit ontwerppatronen hebben gebruikt, is het belangrijk om te begrijpen wat ze zijn voordat we ze daadwerkelijk gaan gebruiken in ons werk.

Wikipedia biedt de volgende definitie:

Een ontwerppatroon in architectuur en informatica is een formele manier om een ​​oplossing voor een ontwerpprobleem in een bepaald vakgebied te documenteren. Een georganiseerde verzameling ontwerppatronen die betrekking hebben op een bepaald veld, wordt een patroontaal genoemd.

Misschien zou een meer vereenvoudigde definitie zijn:

Een patroon is een ontwerp dat kan worden toegepast op een probleem in een specifieke situatie.

Als dat zo is nog steeds niet duidelijk, denk er zo over na:

  • Wanneer u een stukje software bouwt, zult u waarschijnlijk herkennen dat u een probleem oplost dat u al eerder hebt opgelost. Als zodanig, jij weten hoe het op te lossen.
  • Uiteraard zal de oplossing voor het probleem een ​​iets meer gegeneraliseerde vorm zijn die van toepassing is op hoe je hem eerder hebt toegepast.
  • Deze gegeneraliseerde vorm van de oplossing kan als het ontwerppatroon worden beschouwd.

De algemene implementatie en architectuur zien er precies hetzelfde uit; de details van de implementatie variëren natuurlijk van project tot project, maar dat is gewoon de aard van het beest.

In de komende secties en aankomende artikelen zullen we dit in meer detail bekijken.


Ontwerp patronen in WordPress

Als je elk type WordPress-ontwikkeling met betrekking tot het haaksysteem hebt gedaan - dat wil zeggen, je hebt hele plug-ins, thema's of zelfs een eenvoudige functie geschreven en hebt geprofiteerd van de add_action of add_filter functies - dan heb je ontwerppatronen gebruikt.

WordPress gebruikt een zogenaamd gebeurtenisgestuurd ontwerppatroon. Er zijn verschillende variaties van door gebeurtenissen aangestuurde ontwerppatronen die we een moment zullen herzien, maar de kern van de patronen is hetzelfde:

  • Een deel van het patroon implementeert wat bekend staat als een uitgever
  • Een deel van het patroon implementeert wat bekend staat als een abonnee

Over het algemeen zendt de uitgever een bericht uit dat er is iets gebeurd voor alle objecten waarop is geabonneerd op die bepaalde uitgever.

Een andere manier om hiernaar te kijken is dat, in software, wanneer er iets gebeurt, we zeggen dat er een evenement wordt georganiseerd. Misschien is de meest voorkomende plaats die we zien in webontwikkeling in JavaScript met dingen zoals de muis waarop wordt geklikt, een toets op het toetsenbord die wordt ingedrukt of iets dergelijks.

Vervolgens schrijven we functies die deze functies afhandelen, en deze functies worden passend aangeduid als gebeurtenishandlers omdat ze verantwoordelijk zijn voor het afhandelen van de case wanneer een gebeurtenis plaatsvindt.

Niet erg ingewikkeld, toch? Eerlijk gezegd vind ik de terminologie soms verwarrender dan de daadwerkelijke implementatie.

Hoe dan ook, in de context van WordPress - of welke webapplicatie dan ook - zijn evenementen niet beperkt tot toetsaanslagen of muisklikken. In plaats daarvan kan het gebeuren tijdens verschillende delen van de levenscyclus van de pagina, wanneer gegevens naar de database worden geschreven, wanneer gegevens naar de database worden gelezen, enzovoort.

Uiteindelijk kun je het patroon desgewenst implementeren, zodat je haken kunt bieden waarin ontwikkelaars functies kunnen registreren om te schieten zodra het evenement zich voordoet.

Dit brengt ons volledig terug naar de architectuur van WordPress: haken worden overal in de code geplaatst, zodat we een functie kunnen registreren om altijd af te vuren er gebeurt iets (dat wil zeggen, wanneer een gebeurtenis plaatsvindt).


Een blik op een event-driven architectuur: het waarnemerspatroon

Er zijn een aantal door gebeurtenissen aangestuurde ontwerppatronen, waarvan er één bekend staat als het waarnemerspatroon. Dit specifieke patroon is ook bekend als het Publisher-Subscriber Pattern of, beknopter, Pub-Sub.

In de eenvoudigste implementatie van dit patroon is er een enkele uitgever die verantwoordelijk is voor het uitzenden van berichten naar een of meer abonnees. De abonnees zijn verantwoordelijk voor de registratie bij de uitgever en vervolgens is de uitgever verantwoordelijk voor het verzenden van een bericht of het ondernemen van actie tegen alle abonnees.

Een diagram op hoog niveau ziet er ongeveer zo uit:

Vanuit een codeperspectief heeft de uitgever drie dingen nodig:

  1. Een manier om een ​​lijst met abonnees bij te houden
  2. Een manier voor de abonnees om zichzelf te registreren
  3. Een manier om een ​​bericht naar alle abonnees uit te zenden

Evenzo moet de abonnee twee dingen kunnen doen:

  1. Registreer uzelf bij de uitgever
  2. Neem eventueel actie wanneer de Publisher een bericht ernaar verzendt

Er zijn een aantal manieren waarop dit kan worden geïmplementeerd, maar voor alle intenties en doeleinden en om het voorbeeld relatief eenvoudig te houden, laten we zeggen dat de abonnees zichzelf registreren bij de uitgever met de waarnemer registreren methode en de functie accepteert een verwijzing naar de abonnee en elke abonnee heeft een bijwerken methode die de Publisher oproept bij het uitzenden van het bericht.

Uitgever Code

 class MyPublisher / ** De lijst met abonnees die zijn geregistreerd bij deze uitgever * / private $ subscribers; / ** * Verantwoordelijk voor het initialiseren van de klas en het opstellen van de lijst met abonnees. * / public function __construct () $ this-> subscribers = array ();  // end constructor / ** * Voegt het binnenkomende onderwerp toe aan de lijst met geregistreerde abonnees * * @param array $ subject Het onderwerp dat moet worden toegevoegd aan de lijst met subscribers * / public function register ($ subject) array_push ($ this- > subscribers, $ subject);  // end register_subscriber / ** * Waarschuwt alle abonnees dat er iets is gebeurd door hun 'update' * methode aan te roepen. * / public function notify_subscribers () for ($ i = 0; $ l < count( $this->abonnees); $ i ++) $ current_subscriber = $ this-> subscribers [$ i]; $ Current_subscriber-> update ();  // end for // end notify_subscribers // end class

De bovenstaande code is ongeveer net zo eenvoudig als we het kunnen maken:

Voor degenen die meer ervaring hebben met object-georiënteerde technieken, zult u waarschijnlijk de noodzaak zien om een ​​klasse-interface voor de Publisher te maken, maar dat is buiten het bereik van deze specifieke tutorial.

Denk eraan, het doel is om eenvoudigweg een voorbeeld te geven van hoe een eenvoudige waarnemer eruit kan zien.

Abonneer Code

Het creëren van een uitgever is eigenlijk maar de helft van de implementatie. Denk eraan, we moeten iets hebben dat echt, weet je, onderschrijft naar de uitgever om actie te ondernemen wanneer er iets gebeurt.

Dit is waar de toepasselijke naam Abonnee in het spel komt.

 class MySubscriber / ** De uitgever waarop deze klasse * / private $ publisher registreert; / ** * Verantwoordelijk voor het initialiseren van de klasse en het instellen van een verwijzing naar de uitgever * / public function __construct () $ this-> publisher = new MyPublisher (); $ this-> publisher-> registreer ($ this);  // end constructor / ** * Dit is de methode die de Publisher oproept wanneer deze zijn bericht uitzendt. * / update openbare functie () / ** Implementatie is puur gebaseerd op wat u wilt. * / // eindupdate // eindklasse

Kortom, dit is het. Merk hierboven op dat deze implementatie van de bijwerken functie is niet echt gedefinieerd. Dat komt omdat het ons de mogelijkheid biedt om uniek gedrag aan te bieden aan dit specifieke exemplaar.

Maar onthoud, er is veel code in de WordPress-kern die niet objectgeoriënteerd is. In plaats daarvan is het procedureel. Als zodanig varieert de implementatie van een patroon als dit enigszins.

Een analogie in WordPress zou bijvoorbeeld ongeveer zo kunnen zijn:

 function my_custom_subscriber ($ content) $ content = 'Dit is mijn aangepaste inhoud.' . $ Inhoud; return $ inhoud;  // einde my_custom_subscriber add_action ('the_content', 'my_custom_subscriber');

Merk op dat de syntaxis een beetje anders is, maar we doen in essentie iets heel vergelijkbaars:

  • We hebben een abonneerfunctie - my_custom_subscriber - en het is geregistreerd bij de de inhoud evenement
  • Wanneer de de inhoud functie vuurt, onze aangepaste functie zal vuren.

Niets is te ingewikkeld, hoop ik.

Een van de doelen in deze serie is niet alleen om een ​​paar voorbeelden te geven van ontwerppatronen en hoe deze te implementeren, maar ze zijn al aanwezig in bestaande systemen.


De patronen die we zullen onderzoeken

Naast het door gebeurtenissen aangestuurde patroon dat we hierboven hebben besproken, gaan we ook een blik werpen op twee patronen die gebruikelijk, praktisch en zeer nuttig zijn in ons dagelijks werk.

Concreet gaan we de volgende patronen bekijken:

  1. Singleton patroon. In objectgeoriënteerd ontwerp zorgt het enkele patroon ervoor dat slechts één instantie van een klasse wordt gemaakt. Dit is handig, zodat we niet per ongeluk meerdere exemplaren maken met behoud van hun eigen gegevenssets, wat uiteindelijk tegenstrijdige resultaten oplevert tijdens de levenscyclus van een project.
  2. Eenvoudig fabriekspatroon. Als u een verzameling klassen hebt die elk zijn ontworpen om een ​​specifiek type gegevens te verwerken (in tegenstelling tot één grote klasse), dan is het eenvoudige fabriekspatroon nuttig om de binnenkomende gegevens te bekijken en vervolgens een instantie van de juiste klasse voor het verwerken van de gegevens.

Vanzelfsprekend gaat praten over software alleen zo ver zonder te praten over diagrammen en / of code, dus we zullen een blik werpen op beide in de komende reeks artikelen.


Conclusie

Zoals je kunt zien, is het concept van ontwerppatronen niets erg ingewikkelds en valt er veel te winnen door ze in ons werk te gebruiken. Misschien is de grootste uitdaging waar ontwikkelaars voor staan ​​ontwerppatronen te gebruiken om ontwerppatronen te gebruiken.

In plaats daarvan is het belangrijk om te erkennen dat er bepaalde situaties zijn waarin ontwerppatronen van toepassing zijn. Dat wil zeggen dat er bepaalde problemen zijn waarvoor ontwerppatronen de perfecte oplossing zijn. Ervaring is misschien wel de beste leraar om te weten wanneer een ontwerppatroon moet worden gebruikt en wanneer niet om het te gebruiken.

In de volgende artikelen zullen we hopelijk genoeg terrein kunnen bespreken om twee solide voorbeelden van ontwerppatronen te bieden, wanneer ze van toepassing zijn, hoe ze te gebruiken en hoe ze ons kunnen helpen bij ons toekomstige werk.