Ontwerppatronen in WordPress het eenvoudige fabriekspatroon

In deze serie kijken we naar ontwerppatronen en hoe we ze kunnen gebruiken in ons voordeel bij het bouwen van producten bovenop WordPress.

Het leuke aan ontwerppatronen is dat ze niet expliciet zijn beperkt tot thema's of plug-ins - ze zijn handig in verschillende scenario's. Het is gewoon een kwestie van in staat zijn om te identificeren welke patronen van toepassing zijn op bepaalde scenario's.

In het laatste bericht hebben we het Singleton-patroon beoordeeld. In dit artikel gaan we het Simple Factory Pattern bekijken, wat vooral handig is wanneer je een aantal verschillende klassen hebt die elk een uniek doel hebben en een specifiek probleem oplossen.

In dit bericht bekijken we nog een ander patroon - het Simple Factory Pattern - dat handig is wanneer je een aantal klassen hebt die elk een uniek doel hebben en die geselecteerd kunnen worden op basis van bepaalde criteria.


Het fabrieksmethodepatroon

Het Simple Factory Pattern is eigenlijk afgeleid van een patroon dat bekend staat als het Factory Method Pattern, een iets gecompliceerdere versie van het patroon dat we gaan beoordelen.

Volgens Wikipedia is het patroon van de fabrieksmethode als volgt gedefinieerd:

Het patroon van de fabrieksmethode is een objectgeoriënteerd creatieontwerppatroon om het concept van fabrieken te implementeren en gaat over het probleem van het maken van objecten (producten) zonder de exacte klasse van objecten te specificeren die worden gemaakt

Klinkt een beetje ingewikkeld, niet??

De waarheid is dat het eigenlijk een heel krachtig ontwerppatroon is, maar het zou een veel langer artikel zijn om het te bespreken, en het is een beetje buiten bereik voor het doel van deze serie.

Dus, zoals gezegd, gaan we een versie bekijken van het patroon dat een beetje is gepaard en moeten meer algemeen van toepassing zijn op minder gecompliceerde projecten.

Laten we, voordat we dat doen, op een definitie komen van het Simple Factory Pattern:

Het Simple Factory-patroon retourneert een specifieke set gegevens of een specifieke klasse op basis van de invoer.

Ah het risico om een ​​woordspeling te maken, eenvoudig, toch?

Een opmerking over het eenvoudige fabriekspatroon

De waarheid is dat veel software-ingenieurs de Simple Factory meer als een idioom dan een volledig patroon beschouwen; anderen beschouwen dit als een patroon.

Voor wat het waard is, zie ik het als een heel eenvoudig patroon. Het heeft een specifieke use-case die gemakkelijk kan worden geïdentificeerd wanneer deze tijdens de ontwikkeling moet worden gebruikt, en die we verderop in dit artikel zullen bespreken.

Hoe dan ook, ik breng dit naar boven, zodat als je ziet dat dit wordt gebruikt als een idioom (of een patroon) dat in verschillende artikelen op internet wordt gebruikt, of zelfs in een gesprek, je weet dat de betreffende ontwikkelaars dezelfde programmeerstrategie bedoelen - gewoon op een andere manier.

Dus waarom doet deze materie in WordPress?

Net als ontwerppatronen in niet-WordPress-specifieke projecten, zoals grotere toepassingen, bieden de ontwerppatronen een beproefde manier om een ​​veelvoorkomend probleem op te lossen.

Het helpt onze code een beetje te abstraheren, ons project gemakkelijk te onderhouden, gemakkelijk leesbaar te houden en kan ons zelfs helpen onze code lean te houden. Dit kan ertoe leiden dat we er eigenlijk meer hebben bestanden in ons project, maar elk bestand zou minder coderegels moeten bevatten.

Dit betekent dat elk bestand een specifiek doel moet hebben dat duidelijk moet zijn, niet alleen voor ons, maar ook voor toekomstige ontwikkelaars.


Hoe het eruit ziet

Voordat we ons verdiepen in de diagrammen, praten over klassen en de strategieën die nodig zijn om het eigenlijke patroon te implementeren, wil ik vermelden dat we hier een eenvoudige benadering van gaan gebruiken..

Het punt is, het lezerspubliek van deze blog omvat een breed scala aan ervaringen - we hebben enkele mensen die leren code te schrijven; anderen die doorgewinterde veteranen zijn.

Om een ​​beroep te doen op de meerderheid van de lezers, moeten we een evenwicht vinden. Dus voor degenen onder u die al jarenlang betrokken zijn bij software engineering, lijkt dit misschien te simplistisch; haal het echter niet weg - misschien haal je iets nieuws op.

Voor degenen onder u die beginners of zelfs tussentijdse programmeurs zijn, let goed op wat we bespreken, want het kan voordelen bieden in toekomstige (of zelfs bestaande) werkzaamheden.

Het doel van de eenvoudige fabriek

Dus stel je dit scenario voor: je werkt aan een functie die een reeks invoer bevat - meestal een soort van unieke string of integer - en je hebt dit lang if / else verklaring of misschien heb je deze zo groot switch / case verklaring die blijft groeien naarmate uw project groeit.

Het probleem is dat de conditionals lastig te beheren zijn. In feite kunnen case-conditionals, of de case-blocks, uiteindelijk zo veel werk doen als een bepaalde functie zou moeten doen.

Dit is waar de Simple Factory om de hoek komt kijken. Wat we kunnen doen is de details die plaatsvinden in elk van de conditionals in hun eigen klasse abstraheren waardoor het veel gemakkelijker wordt om de code veel leaner te houden en te houden.

En dat is het eenvoudige fabriekspatroon.

Een blik op het patroon

Dus hier zijn de belangrijkste kenmerken van het Simple Factory Pattern:

  • Merk op dat de klasse Plugin een privéverwijzing heeft naar de Factory-klasse
  • In de klasse Factory wordt alle logica ingekapseld om een ​​object van het type Gebruiker te retourneren
  • De User-klasse is een basisklasse voor drie andere klassen: Admin, Volunteer, Reader, en het idee is dat elk van deze typen subklassen van gebruikers zijn met unieke functionaliteit van hun eigen
  • De invoegtoepassing ontvangt een bepaald type invoer dat wordt doorgegeven aan de fabriek
  • De fabriek onderzoekt de invoer en retourneert vervolgens op basis van de waarde een van de drie gebruikerstypen

Niets te gecompliceerd, toch? Eerlijk gezegd denk ik dat het diagram iets gecompliceerder is dan de principes die spelen. Het biedt echt veel flexibiliteit vooral wanneer u op zoek bent naar een ander gebruikerstype zoals een editor of iets dergelijks.

Notitie: Dit is niet te verwarren met de ingebouwde gebruikerstypes van WordPress. Dit is gewoon een voorbeeld om te laten zien hoe het patroon eruit zou zien.

Een werkvoorbeeld

Nu we het diagram voor het patroon hebben bekeken, laten we de broncode in actie bekijken. Hieronder zullen we de broncode voor elke klas bekijken en daarna zal ik een download beschikbaar maken voor een volledig gedocumenteerde demo na de discussie.

De plug-in

Laten we eerst de plugin-klasse bekijken. Vergeet niet dat dit niets meer is dan een prototype van hoe het patroon eruit ziet. Het is niet hetzelfde als een volledig ontwikkelde WordPress-plug-in.

 fabriek = nieuw Simple_Factory ();  openbare functie get_user ($ permissie) return $ this-> factory-> get_user ($ permission); ?>

Merk op dat de plug-in relatief eenvoudig is:

  • Het omvat de eenvoudig factory.php script in de kop van het bestand
  • Het definieert vervolgens een constructor waarin het de $ fabriek eigenschap aan een instantie van de Simple_Factory
  • De enige beschikbare methode in de plug-in is get_user die een gebruiker retourneert op basis van een type

We zullen zien hoe dit in het spel komt nadat we alle andere klassen hebben bekeken.

De gebruiker

De Gebruiker is een abstracte basisklasse die een basisconstructor en een abstracte functie biedt die door alle andere subklassen moet worden geïmplementeerd.

 rol = $ rol;  abstracte openbare functie get_role (); ?>

Houd er rekening mee dat deze klasse is bedoeld om te worden onderverdeeld in verschillende andere klassen, die we elk moment in detail zullen bekijken.

De beheerder, de lezer en de vrijwilliger

De volgende vier klassen zijn allemaal afzonderlijke bestanden die elk de subklasse Gebruiker basisklasse. Ik heb ervoor gekozen om ze hier allemaal bij elkaar te voegen, omdat er zo weinig afwijking is van de daadwerkelijke implementatie dat het eenvoudig genoeg moet zijn om te volgen.

De beheerder
 rol = "Beheerder";  openbare functie get_role () return $ this-> rol; ?>
De lezer
 role = "Reader";  openbare functie get_role () return $ this-> rol; ?>
De vrijwilliger
 rol = "Vrijwilliger";  openbare functie get_role () return $ this-> rol; ?>

Zoals gebruikelijk, laat me vragen in de comments; lees anders de code door en lees dan verder De eenvoudige fabriek wat de volgende sectie is - het verbindt dit alles samen.

Vergeet ook niet dat al deze code aan het einde van het artikel wordt gedeeld, samen met code-opmerkingen die precies beschrijven wat er gebeurt.

De eenvoudige fabriek

De Simple_Factory klasse is echt de crux van het hele patroon. Hier worden alle beslissingen genomen en de juiste objecten geretourneerd.

 

Merk op dat de Simple_Factory omvat de basisgebruikersklasse en de bijbehorende subklassen en werkt vervolgens om het juiste type gebruiker terug te geven op basis van de inkomende reeks machtigingen.


De voordelen van het eenvoudige fabriekspatroon

Hoewel het op dit punt in dit artikel een beetje duidelijk zou moeten zijn, biedt het Simple Factory Pattern een aantal voordelen, vooral als je gewend bent om met grote conditionals te werken.

  • Het biedt een elegante manier om uw code te abstraheren, zodat er minder visuele rommel is
  • Hiermee kun je gespecialiseerde, gerichte lessen introduceren met een enkel doel (wat geweldig is als je de SOLID-principes volgt)
  • Het maakt de code beter onderhouden omdat er een enkele plaats is waar klassen worden geïnstantieerd en elke klasse één doel dient

Over het algemeen is dit een van mijn favoriete patronen, simpelweg vanwege de kwestie van de code-indeling en specialisatie die het op tafel kan brengen.


Conclusie

Ten slotte kun je via deze link de volledige broncode - compleet met documentatie en installatie-instructies - downloaden op GitHub.

Op dit punt hebben we drie patronen bekeken:

  1. The Observer Pattern
  2. Het Singleton-patroon
  3. Het eenvoudige fabriekspatroon

Deze serie kan een tijdje duren; Ik denk echter dat we op zijn minst voldoende aandacht hebben besteed om velen van ons te laten beginnen met het implementeren van patronen in ons werk.

Dus in het laatste artikel van de serie zullen we samenvatten wat we hebben geleerd en ik zal ook enkele andere patronen aanbevelen, hun doel en enkele andere punten van onderzoek die je moeten blijven helpen bij het blijven leren over ontwerppatronen. en hun voordelen niet alleen in de ontwikkeling van WordPress, maar ook in de algemene ontwikkeling van software.