{"id":228804,"date":"2022-11-02T18:29:00","date_gmt":"2022-11-02T15:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228804"},"modified":"2022-11-09T04:19:52","modified_gmt":"2022-11-09T01:19:52","slug":"repository-pattern-primer","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/repository-pattern-primer\/","title":{"rendered":"Repository Pattern Primer"},"content":{"rendered":"\n<p>N\u00e4rhelst du arbetar med ett st\u00f6rre projekt som \u00e4r baserat p\u00e5 WordPress, \u00e4r oddsen att du kommer att arbeta med mer \u00e4n en enda datak\u00e4lla \u2013 det vill s\u00e4ga WordPress-databasen \u2013 h\u00f6gre \u00e4n normalt. Du kanske till exempel arbetar med ett projekt som m\u00e5ste koordinera information fr\u00e5n:<\/p>\n<ul>\n<li>WordPress-databasen,<\/li>\n<li>ett hj\u00e4lpdesk biljettsystem,<\/li>\n<li>ett inneh\u00e5llsimporteringssystem,<\/li>\n<li>ett annat API fr\u00e5n tredje part,<\/li>\n<li>och m\u00f6jligt mer.<\/li>\n<\/ul>\n<p>Och n\u00e4r detta h\u00e4nder kan det bli lite kr\u00e5ngligt att skriva kod som g\u00f6r det enkelt att h\u00e4mta information fr\u00e5n de olika platserna. Det h\u00e4r brukar utvecklare prata om n\u00e4r de h\u00e4nvisar till att hantera &quot;lager&quot; i sin applikation. Det vill s\u00e4ga,<\/p>\n<ul>\n<li>det finns lager f\u00f6r att presentera information f\u00f6r anv\u00e4ndaren,<br \/>\nlager f\u00f6r att hantera aff\u00e4rslogik (eller dom\u00e4nlogik),<\/li>\n<li>lager f\u00f6r att kommunicera med API:er,<\/li>\n<li>och lager f\u00f6r att lagra data.<\/li>\n<\/ul>\n<p>\u00c4rligt talat beh\u00f6ver du inte ha en m\u00e4ngd olika datalager att titta p\u00e5 f\u00f6r att skapa ett lager som g\u00f6r det l\u00e4ttare att skicka och h\u00e4mta data fr\u00e5n databasen, det \u00e4r just d\u00e5 det \u00e4r vanligare. Du kan lika effektivt arbeta med ett enda datalager, som WordPress-databasen, n\u00e4r du implementerar f\u00f6rvarsm\u00f6nstret.<\/p>\n<p>Oavsett, om du bygger en st\u00f6rre webbplats, webbapplikation eller plugin, \u00e4r implementering av f\u00f6rvarsm\u00f6nstret n\u00e5got som kan ge utdelning i underh\u00e5ll, tydlig kod och separation av problem.<\/p>\n<p>Men hur kan detta implementeras i WordPress? Det \u00e4r inte s\u00e4rskilt utmanande, men f\u00f6rst \u00e4r det v\u00e4rt att granska en repository primer innan du hoppar in i n\u00e5gon kod.<\/p>\n<h2>En f\u00f6rvarsm\u00f6nsterprimer<\/h2>\n<p>Innan du tittar p\u00e5 en faktisk implementering i WordPress \u00e4r det viktigt att f\u00f6rst\u00e5 vad f\u00f6rvaret \u00e4r, hur det definieras, vad det erbjuder och en generisk implementering av det. Jag kommer att dela lite mer l\u00e4sning i slutet av artikeln, men tills dess kommer jag att t\u00e4cka min allm\u00e4nna syn p\u00e5 m\u00f6nstret h\u00e4r.<\/p>\n<p>F\u00f6r det f\u00f6rsta kan en implementering av detta m\u00f6nster bli mer komplicerad \u00e4n n\u00f6dv\u00e4ndigt f\u00f6r nyb\u00f6rjare. D\u00e4rmed inte sagt att det faktiska m\u00f6nstret inte \u00e4r v\u00e4rt att f\u00f6rst\u00e5, men om du bara \u00e4r ute efter att bli bl\u00f6t med det h\u00e4r, \u00e4r jag inte ett fan av att kasta in l\u00e4sarna i den djupa delen. Jag tror inte att det \u00e4r det b\u00e4sta s\u00e4ttet att l\u00e4ra sig.<\/p>\n<p>Ist\u00e4llet \u00e4r det v\u00e4rt att bryta ner problemet och sedan bygga om det till n\u00e5got lite mer elegant. S\u00e5 det \u00e4r vad jag ska sikta p\u00e5 att g\u00f6ra.<\/p>\n<h3>Ett ord om frikoppling<\/h3>\n<p>N\u00e4r vi pratar om objektorienterad programmering pratar vi ofta om id\u00e9n att &quot;frikoppla&quot; delar av systemet. Om du \u00e4r bekant med <a href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2014\/05\/08\/SingleReponsibilityPrinciple.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koppling och sammanh\u00e5llning<\/a>, d\u00e5 vet du varf\u00f6r.<\/p>\n<p>Men om inte, r\u00e4cker det med att s\u00e4ga att ju mer kopplade komponenterna ditt system \u00e4r, desto sv\u00e5rare \u00e4r de att \u00e4ndra. De vet f\u00f6r mycket om varandra. Det vill s\u00e4ga, om du \u00e4ndrar en av aspekterna av systemet, kommer det sannolikt att \u00f6verlappa eller p\u00e5verka en annan del av systemet som du aldrig menade skulle h\u00e4nda. D\u00e5 \u00e4r du kvar n\u00e4r du m\u00e5ste l\u00e4gga mycket mer tid p\u00e5 att fixa alla dessa andra &quot;ber\u00f6ringspunkter&quot; i systemet som inte borde vara n\u00f6dv\u00e4ndiga.<\/p>\n<p>Implementering av olika strategier, som f\u00f6rvarsm\u00f6nstret, kan hj\u00e4lpa till att frikoppla delar av systemet. Exempel: Presentationsskiktet vet inte hur den underliggande datalagringen \u00e4r organisation. Den beh\u00f6ver inte kunna SQL. Det beh\u00f6ver inte veta att det \u00e4r en databas. Ist\u00e4llet beh\u00f6ver den bara veta hur man pratar med f\u00f6rvaret.<\/p>\n<p>Trevligt, eller hur?<\/p>\n<p>Detta inneb\u00e4r att du kan byta ut backend-datalagret och, f\u00f6rutsatt att ditt API \u00e4r stabilt; din applikation kommer att forts\u00e4tta att fungera med liten eller ingen f\u00f6r\u00e4ndring. Och det \u00e4r vad det inneb\u00e4r att verkligen vara frikopplad.<\/p>\n<h3>En implementering av f\u00f6rvarsm\u00f6nstret<\/h3>\n<p>S\u00e5 hur ser f\u00f6rvarsm\u00f6nstret ut? Som med de flesta designm\u00f6nster finns det en generisk form av m\u00f6nstret, och det \u00e4r alltid anv\u00e4ndbart, men jag tror att det ocks\u00e5 hj\u00e4lper oss som arbetar i WordPress att se hur det kan fungera inom ramen f\u00f6r, du vet, WordPress.\u00a0<\/p>\n<p>S\u00e5 f\u00f6rst vill jag bryta ner sj\u00e4lva m\u00f6nstret och sedan ge ett exempel p\u00e5 hur det kan se ut n\u00e4r man arbetar med WordPress.<\/p>\n<h3>En generisk implementering av f\u00f6rvarsm\u00f6nstret<\/h3>\n<p>Den faktiska implementeringen av f\u00f6rvarsm\u00f6nstret \u00e4r ganska enkel. Jag \u00e4r faktiskt aldrig s\u00e4ker p\u00e5 om det \u00e4r s\u00e5 anv\u00e4ndbart eftersom det bara visar hur datalagren, f\u00f6rvaret och resten av applikationen interagerar med varandra.<\/p>\n<p>Missf\u00f6rst\u00e5 mig r\u00e4tt: jag \u00e4r helt f\u00f6r konceptuella modeller av hur saker \u00e4r organiserade. Personligen hj\u00e4lper det mig att t\u00e4nka p\u00e5 strukturen f\u00f6r en applikation n\u00e4r jag bygger den, men om den \u00e4r f\u00f6r allm\u00e4n \u00e4r det inte mycket hj\u00e4lp.<\/p>\n<p>Men f\u00f6r att komma till ett konkret redskap m\u00e5ste vi v\u00e4l b\u00f6rja n\u00e5gonstans? S\u00e5 jag b\u00f6rjar p\u00e5 h\u00f6gsta m\u00f6jliga niv\u00e5 och jobbar ner\u00e5t.<\/p>\n<p>Som du kan se p\u00e5 bilden ovan har du ett par datalager som alla l\u00e4ses via f\u00f6rvaret, och sedan fr\u00e5gar applikationen ut f\u00f6rr\u00e5det som i sin tur h\u00e4mtar information fr\u00e5n datalagret.<\/p>\n<p>Ja, det finns alternativ f\u00f6r att cache-information, ogiltigf\u00f6rklara cachen och allt det d\u00e4r roliga. Men det ligger utanf\u00f6r omfattningen av en prim\u00e4r av f\u00f6rvaret. S\u00e5 jag t\u00e4nker inte g\u00e5 in p\u00e5 just den v\u00e4gen just nu. Kanske i ett framtida inl\u00e4gg (skulle detta visa sig vara anv\u00e4ndbart f\u00f6r dig).<\/p>\n<h2>F\u00f6rvarsm\u00f6nstret i WordPress<\/h2>\n<p>S\u00e5 med det sagt, l\u00e5t oss ta en titt p\u00e5 en grundl\u00e4ggande implementering av hur detta kan se ut i en standard WordPress-installation. Det vill s\u00e4ga, allt vi har \u00e4r datalagret. Vi kommunicerar inte med n\u00e5got annat, men vi vill se till att allt som gr\u00e4nssnitt mot databasen eller API:t hanteras av f\u00f6rvaret<\/p>\n<p>Det h\u00e4r skulle se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.png\" alt=\"Repository Pattern Primer\" ><\/a><\/p>\n<p>Hur det kan se ut med WordPress<\/p>\n<p>Och detta kan abstraheras ytterligare. Kanske finns det ett postf\u00f6rr\u00e5d eller ett anv\u00e4ndarf\u00f6rr\u00e5d. Personligen \u00e4r jag ett fan av att ha ett arkiv f\u00f6r varje typ av entitet eftersom det hj\u00e4lper till att inneh\u00e5lla relaterad aff\u00e4rslogik utan att skapa de d\u00e4r stora klasserna som vet allt (och i on\u00f6dan).<\/p>\n<p>S\u00e5 det h\u00e4r kan se ut s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.png\" alt=\"Repository Pattern Primer\" ><\/a><\/p>\n<p>Ett paket med f\u00f6rr\u00e5d<\/p>\n<p>L\u00e5t oss sedan ta det upp en niv\u00e5 till och s\u00e4ga att du arbetar med Twitter API, ZenDesk API, WordPress User API och WordPress Post API. Sen d\u00e5? Det finns fler f\u00f6rr\u00e5d.<\/p>\n<p>Kanske finns de i deras namnutrymme (vilket de borde vara), kanske implementerar de ett gemensamt gr\u00e4nssnitt (som det finns sk\u00e4l f\u00f6r detta), men under utvecklingstiden tror jag att det \u00e4r viktigt att uttryckligen ange vilket arkiv du anv\u00e4nder f\u00f6r att vara s\u00e5 tydlig som m\u00f6jligt.<\/p>\n<p>Det vill s\u00e4ga, anv\u00e4nd inte en generisk och l\u00e5t runtime ta reda p\u00e5 det:<\/p>\n<pre><code>$support_repository = new Support_Repository();\n$support_repository-&gt;get_tickets_for( 'tommcfarlin' );<\/code><\/pre>\n<p>Var i st\u00e4llet tydlig:<\/p>\n<pre><code>$zendesk_repository = new ZenDesk_Repository();\n$zendesk_repository-&gt;get_tickets_from( 'yesterday' );<\/code><\/pre>\n<p>Det h\u00e4r kan k\u00e4nnas mycket. Jag vet inte om du upplever detta, men det finns en konstig k\u00e4nsla i objektorienterad programmering d\u00e4r vi vill skapa de sm\u00e5 fokuserade klasserna men det skapar m\u00e5nga filer.<\/p>\n<p>S\u00e5 du har dessa snyggt inst\u00e4llda filer som var och en g\u00f6r n\u00e5got litet och m\u00e5lmedvetet. L\u00e5t inte antalet filer som utg\u00f6r ett projekt ge intryck av att du har en d\u00e5lig arkitektur.<\/p>\n<h2>Slutsats<\/h2>\n<p>Detta \u00e4r primern p\u00e5 f\u00f6rvarsm\u00f6nstret. Naturligtvis finns det kod som h\u00f6r ihop med detta, men innan jag dyker in i den delen \u2013 eftersom kod \u00e4r d\u00e4r saker som l\u00e4tt f\u00f6rsvinner i \u00f6vers\u00e4ttning \u2013 ville jag vara s\u00e4ker p\u00e5 att jag hj\u00e4lpte till att ge en illustration f\u00f6r att utveckla en konceptuell modell f\u00f6r hur m\u00f6nstret fungerar.<\/p>\n<p>H\u00e4rifr\u00e5n kan vi b\u00f6rja prata om en implementering av m\u00f6nstret. S\u00e5 under n\u00e4sta inl\u00e4gg eller n\u00e4sta par inl\u00e4gg kommer jag att g\u00f6ra precis det.<\/p>\n<p>Under tiden, tveka inte att l\u00e4mna n\u00e5gra kommentarer eller fr\u00e5gor om vad som har tagits upp h\u00e4r.<\/p>\n<h2>Relaterad l\u00e4sning<\/h2>\n<ul>\n<li><a href=\"https:\/\/8thlight.com\/blog\/mike-ebert\/2013\/03\/23\/the-repository-pattern.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">F\u00f6rvarsm\u00f6nstret via 8th Light<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ff649690.aspx\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">F\u00f6rvarsm\u00f6nstret via MSDN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/clean\/repository\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">En implementering av f\u00f6rvarsm\u00f6nstret<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Att implementera f\u00f6rvarsm\u00f6nstret \u00e4r inte s\u00e4rskilt sv\u00e5rt, men det \u00e4r v\u00e4rt att granska en f\u00f6rvarsprimer innan du hoppar in i n\u00e5gon kod.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,922,724],"tags":[1173],"class_list":["post-228804","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-oevrig","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228804"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}