{"id":228810,"date":"2022-11-03T19:43:00","date_gmt":"2022-11-03T16:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228810"},"modified":"2022-11-09T04:21:59","modified_gmt":"2022-11-09T01:21:59","slug":"foerdelar-med-foervarsmoenster-varfoer-vi-boer-oevervaega-det","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/foerdelar-med-foervarsmoenster-varfoer-vi-boer-oevervaega-det\/","title":{"rendered":"F\u00f6rdelar med f\u00f6rvarsm\u00f6nster: Varf\u00f6r vi b\u00f6r \u00f6verv\u00e4ga det"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/repository-pattern-primer\/\" title=\"Ig\u00e5r\" >Ig\u00e5r<\/a> gav jag en primer p\u00e5 f\u00f6rvarsm\u00f6nstret. Kort sagt, det \u00e4r ett av de m\u00f6nster som jag tror att alla som arbetar med mellanprogram byggd ovanp\u00e5 WordPress borde f\u00f6rst\u00e5.<\/p>\n<p>N\u00e4r du ger en primer p\u00e5 ett m\u00f6nster som detta kan det vara sv\u00e5rt att g\u00f6ra r\u00e4ttvisa \u00e5t m\u00f6nstret n\u00e4r du beh\u00f6ver:<\/p>\n<ul>\n<li>introducera det,<\/li>\n<li>f\u00f6rklara hur det fungerar,<\/li>\n<li>t\u00e4cka f\u00f6rm\u00e5nerna,<\/li>\n<li>och ge en liten demo.<\/li>\n<\/ul>\n<p>Men den verkliga f\u00f6rdelen med f\u00f6rvaret ligger inte bara i att abstrahera datalagret bort fr\u00e5n resten av applikationen utan att det enkelt kan (eller borde) kunna bytas ut med olika datalager utan att \u00e4ndra API:et.<\/p>\n<p>Till exempel, i ett fall kan du beh\u00f6va h\u00e4mta data fr\u00e5n WordPress-databasen, i andra fall kan du beh\u00f6va h\u00e4mta n\u00e5got fr\u00e5n ett tredjeparts-API, eller kanske finns det n\u00e5gon annan plats d\u00e4r du beh\u00f6ver h\u00e4mta data.<\/p>\n<p>Oavsett vilket \u00e4r tanken bakom f\u00f6rvarsm\u00f6nstret att vad som \u00e4n sitter bakom det inte spelar n\u00e5gon roll s\u00e5 l\u00e4nge som API:et det tillhandah\u00e5ller fungerar f\u00f6r lagret i applikationen som anropar det.<\/p>\n<p>Och eftersom vi har t\u00e4ckt en primer om f\u00f6rvarsm\u00f6nstret, l\u00e5t oss ta en titt p\u00e5 n\u00e5gra av f\u00f6rvarsm\u00f6nstrets f\u00f6rdelar och hur vi kan implementera det i samband med WordPress-projekt.<\/p>\n<h2>F\u00f6rdelar med f\u00f6rvarsm\u00f6nster<\/h2>\n<p>Det finns n\u00e5gra s\u00e4tt att b\u00f6rja f\u00f6rklara m\u00f6nstret, s\u00e5 jag b\u00f6rjar med ett enkelt diagram:<\/p>\n<p>F\u00f6rdelarna med f\u00f6rvarsm\u00f6nster inkluderar Data Store Abstraktion<\/p>\n<p>Observera i bilden ovan, det finns tre huvudkomponenter:<\/p>\n<ol>\n<li>dom\u00e4nlogiken (eller aff\u00e4rslogiken) som jag har m\u00e4rkt &quot;App&quot;,<\/li>\n<li>f\u00f6rvaret,<\/li>\n<li>datalagret,<\/li>\n<\/ol>\n<p>N\u00e4r det g\u00e4ller till\u00e4mpningen kommer aff\u00e4rsreglerna alltid att vara relativt konsekventa. Det borde de \u00e5tminstone, eller hur?<\/p>\n<p>F\u00f6rvaret \u00e4r det som fungerar som ett kommunikationsmedel mellan aff\u00e4rslogiken och datalagret.<\/p>\n<p>Nu kan datalagret vara en databas, kanske en upps\u00e4ttning filer (vilket jag inte skulle rekommendera), ett API till en tredje part, en lista med information h\u00e4mtad fr\u00e5n en annan applikation, och s\u00e5 vidare.<\/p>\n<p>Po\u00e4ngen \u00e4r att f\u00f6rvaret kommer att tillhandah\u00e5lla ett rent API som aff\u00e4rslogiken kan skriva till och l\u00e4sa fr\u00e5n (och mer om detta p\u00e5 ett \u00f6gonblick) utan att oroa sig f\u00f6r detaljerna om vart data \u00e4r p\u00e5 v\u00e4g eller hur den kommer tillbaka.<\/p>\n<p>Det \u00e4r f\u00f6rvarets uppgift. Och det \u00e4r det som g\u00f6r det viktigt att ha ett konsekvent API och det \u00e4r det som \u00e4r viktigt f\u00f6r att se till att det har implementeringsdetaljerna f\u00f6r det datalager som det interagerar med.<\/p>\n<h3>P\u00e5 koppling<\/h3>\n<p>F\u00f6rutom att ha din applikation ordentligt segmenterad, gynnar f\u00f6rvarsm\u00f6nstret arkitekturen genom att det hj\u00e4lper till att frikoppla delarna av din applikation.<\/p>\n<p>Det vill s\u00e4ga, aff\u00e4rslogiken vet ingenting om hur eller var data lagras. Det vet bara att det kan skriva det och h\u00e4mta det och det kan g\u00f6ra det med ett rent API.<\/p>\n<p>Lagret \u00e4r ansvarigt f\u00f6r att kommunicera n\u00e4mnda datalager f\u00f6r att organisera serialisering och h\u00e4mtning men m\u00e5ste tillhandah\u00e5lla ett konsekvent API, s\u00e5 datalagret beh\u00f6ver inte g\u00f6ra n\u00e5gon syntaxgymnastik f\u00f6r att l\u00e4sa och skriva sin information.<\/p>\n<h3>Implementeringsdetaljer<\/h3>\n<p>Fram till denna punkt har jag representerat f\u00f6rvaret som en betongklass.<\/p>\n<p>Saken \u00e4r att en applikation sannolikt kommer att ha flera arkiv. Och p\u00e5 grund av det \u00e4r det en bra id\u00e9 att ha gr\u00e4nssnitt som varje arkiv kan implementera.<\/p>\n<p>S\u00e5 h\u00e4r definierar du kontraktet med metoder som f\u00f6rvaret ska tillhandah\u00e5lla. Och s\u00e5 h\u00e4r kan du s\u00e4kerst\u00e4lla att varje f\u00f6rr\u00e5d \u00e4r anslutet till r\u00e4tt datalager.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166772-61e79a138aeb3.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-166772-61e79a138aeb3.png\" alt=\"F\u00f6rdelar med f\u00f6rvarsm\u00f6nster: Varf\u00f6r vi b\u00f6r \u00f6verv\u00e4ga det\" ><\/a><\/p>\n<p>En gr\u00e4nssnittsimplementering f\u00f6r flera arkiv.<\/p>\n<p>S\u00e5 l\u00e5t oss s\u00e4ga att din applikation beh\u00f6ver prata med WordPress-databasen s\u00e5v\u00e4l som ett tredjeparts-API.<\/p>\n<p>Helst skulle gr\u00e4nssnittet tillhandah\u00e5lla en gemensam upps\u00e4ttning metoder, men implementeringsdetaljerna skulle variera beroende p\u00e5 lagringsplats eftersom varje arkiv kommer att ha de n\u00f6dv\u00e4ndiga referenserna och f\u00f6rm\u00e5gan att kommunicera med datalagret.<\/p>\n<p>Framsteg till gr\u00e4nssnittet \u00e4r dock det som ger m\u00f6nstret dess kraft. Dom\u00e4nlogiken beh\u00f6ver inte oroa sig f\u00f6r hur informationen sparas eller hur den h\u00e4mtas. Det anropar helt enkelt metoderna som definieras i gr\u00e4nssnittet och det n\u00f6dv\u00e4ndiga objektet tar hand om det.<\/p>\n<p>Det anropar helt enkelt metoderna som definieras i gr\u00e4nssnittet och det n\u00f6dv\u00e4ndiga objektet tar hand om det.<\/p>\n<h2>Hur skulle detta se ut i WordPress?<\/h2>\n<p>Det h\u00e4r \u00e4r en bra fr\u00e5ga (och nej, jag hittade inte p\u00e5 den bara f\u00f6r att svara p\u00e5 den p\u00e5 egen hand \ud83d\ude42), och det kan vara sv\u00e5rt att ge ett bra exempel eftersom s\u00e5 mycket av det vi g\u00f6r interagerar direkt med WordPress-databasen.<\/p>\n<p>Det betyder inte att det inte finns abstraktioner som vi kan anv\u00e4nda s\u00e5som inl\u00e4gg, sidor, anv\u00e4ndare eller andra anpassade inl\u00e4ggstyper vi v\u00e4ljer att skapa.<\/p>\n<p>Men WordPress tillhandah\u00e5ller ett API f\u00f6r mycket av detta. Jag kan se ett fall d\u00e4r, s\u00e4g, en anv\u00e4ndare med ytterligare f\u00e4lt som har lagts till kan dra nytta av ett User Repository.<\/p>\n<p>Eller en anpassad posttyp med mycket metadata kan ocks\u00e5 dra nytta av ett arkiv genom att ha detaljerna inkapslade i arkivet.<\/p>\n<h3>Ett exempel p\u00e5 h\u00f6g niv\u00e5<\/h3>\n<p>S\u00e4g till exempel att du har en anpassad inl\u00e4ggstyp f\u00f6r en h\u00e4ndelse, och h\u00e4ndelsen har en titel och beskrivning som naturligt skulle passa in i inl\u00e4ggets titel och inneh\u00e5ll.<\/p>\n<p>Men sedan har den metadata om sin plats, sin starttid, sin sluttid och s\u00e5 vidare. Det kan ocks\u00e5 vara inkapslat av f\u00f6rvaret s\u00e5 att du kan ha ett Event-objekt, skicka det till f\u00f6rvaret och sedan l\u00e5ta f\u00f6rvaret skicka informationen till r\u00e4tt plats i databasen.<\/p>\n<p>Och detsamma g\u00e4ller f\u00f6r att h\u00e4mta informationen: Den vet var den ska h\u00e4mtas, hur man fyller i ett h\u00e4ndelseobjekt och sedan l\u00e4mnar tillbaka den till den som ringer.<\/p>\n<h2>Tillbaka p\u00e5 banan<\/h2>\n<p>Men allt det h\u00e4r snacket om en h\u00e4ndelse b\u00f6rjar bli lite utanf\u00f6r \u00e4mnet, s\u00e5 jag kanske forts\u00e4tter att prata om det och hur det passar in i f\u00f6rvaret i ett uppf\u00f6ljande inl\u00e4gg. Det \u00e4r uppenbart att n\u00e4r man pratar om detta finns det mycket att ta upp.<\/p>\n<p>Jag tar det hellre i mindre steg<\/p>\n<p>Kort sagt, om du har ett Event Repository har du sannolikt ett Event-objekt eller en Event-enhet. Och hur detta passar in i WordPress, anpassade inl\u00e4ggstyper, metadata och s\u00e5 vidare introducerar en komplexitetsniv\u00e5 som kan verka skr\u00e4mmande till en b\u00f6rjan men som i slut\u00e4ndan l\u00f6nar sig n\u00e4r man arbetar med en st\u00f6rre webbapplikation.<\/p>\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>L\u00e5t oss ta en titt p\u00e5 n\u00e5gra av f\u00f6rdelarna med f\u00f6rvarsm\u00f6nster och hur vi kan implementera det i samband med WordPress-projekt.<\/p>\n","protected":false},"author":1,"featured_media":223872,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,922,724],"tags":[1173],"class_list":["post-228810","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-oevrig","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228810","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=228810"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228810\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223872"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228810"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228810"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228810"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}