{"id":228351,"date":"2022-10-22T18:16:00","date_gmt":"2022-10-22T15:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228351"},"modified":"2022-11-09T02:00:52","modified_gmt":"2022-11-08T23:00:52","slug":"refactoring-wordpress-plugins-ett-litet-exempel","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/refactoring-wordpress-plugins-ett-litet-exempel\/","title":{"rendered":"Refactoring WordPress Plugins: Ett litet exempel"},"content":{"rendered":"\n<p>Ett av s\u00e4tten som WordPress-plugins blir till \u00e4r att de, \u00e5tminstone i mitt fall, b\u00f6rjar som en samling funktioner som anv\u00e4nds f\u00f6r att hj\u00e4lpa till med ett visst syfte f\u00f6r ett givet projekt. D\u00e4rifr\u00e5n t\u00e4nker du &quot;Hej, kanske n\u00e5gon annan kommer att ha nytta av det h\u00e4r.&quot;<\/p>\n<p>Det har \u00e5tminstone varit min erfarenhet oftare \u00e4n inte.<\/p>\n<p>Men grejen \u00e4r att innan du sl\u00e4pper den f\u00f6r andra att prova, vill du g\u00e5 igenom processen att rensa upp koden. Jag pratar inte heller om att omstrukturera WordPress-plugins \u2013 \u00e5tminstone inte \u00e4nnu.<\/p>\n<p>Jag pratar om att ta koden, ta upp den till n\u00e5got som kommer att fungera som ett WordPress-plugin, och sedan eventuellt omfaktorisera koden.<\/p>\n<h2>Refaktorering av WordPress-plugins<\/h2>\n<p>Att g\u00e5 igenom hela processen med att omstrukturera WordPress-plugin-program \u2013 \u00e4n mindre ett enda WordPress-plugin \u2013 kan vara sv\u00e5rt, men att dela med sig av hur man refaktorerar en del av ett plugin \u00e4r n\u00e5got som \u00e4r genomf\u00f6rbart.<\/p>\n<p>S\u00e5 jag kommer att anv\u00e4nda ett exempel p\u00e5 hur jag anv\u00e4nde n\u00e5got nyligen (med koden abstraherad lite f\u00f6r att inte bry mig om att bli specifik om ett givet projekt).<\/p>\n<p>Kartl\u00e4gga den idealiska produktionen av alternativ.<\/p>\n<p>Innan jag g\u00f6r det tror jag dock att det \u00e4r viktigt att dela min process kan skilja sig \u2013 eller sannolikt \u2013 skilja sig fr\u00e5n din (eftersom m\u00e5nga av oss har olika processer).<\/p>\n<ol>\n<li>Designa komponenten (ja, inte ens hela plugin-programmet) i en anteckningsbok,<\/li>\n<li>Kom med en checklista \u00f6ver anv\u00e4ndningsfallen d\u00e4r den ska passera och n\u00e4r den ska misslyckas,<\/li>\n<li>Skriv ut vilken data som beh\u00f6vs, hur den beh\u00f6vs och n\u00e4r den ska ignoreras<\/li>\n<li>Konvertera allt ovan till kod.<\/li>\n<\/ol>\n<p>Naturligtvis konverterar jag inte allt bokstavligen till kod, men du fattar. Det kanske mest kortfattade s\u00e4ttet att uttrycka det \u00e4r s\u00e5 h\u00e4r:<\/p>\n<ul>\n<li>B\u00f6rja med en l\u00e5ng metod som passar perfekt. Refaktorera sedan den koden s\u00e5 att funktionerna blir mindre och ta h\u00e4nsyn till fall d\u00e4r resultatet skulle misslyckas.<\/li>\n<\/ul>\n<p>S\u00e5 med det sagt, s\u00e5 h\u00e4r kan koden se ut.<\/p>\n<h3>1 Att skriva f\u00f6r den perfekta anv\u00e4ndningen<\/h3>\n<p>I det h\u00e4r exemplet \u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det idealiska anv\u00e4ndningsfallet<\/a> n\u00e4r anv\u00e4ndaren laddar alternativen, alternativen finns och sedan m\u00e5ste de utf\u00f6ra en \u00e5tg\u00e4rd om alternativen har vissa v\u00e4rden.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Den h\u00e4r delen b\u00f6r vara l\u00e4tt att l\u00e4sa, men den tar inte h\u00e4nsyn till n\u00e5got annat \u00e4n den ideala v\u00e4gen genom koden.<\/p>\n<h3>2 Bli lite defensiv<\/h3>\n<p>D\u00e4refter vill jag se till att alternativen \u00e4r inst\u00e4llda innan jag f\u00f6rs\u00f6ker l\u00e4sa dem. I vissa fall kanske du vill visa ett meddelande, skicka ett undantag eller logga information.<\/p>\n<p>I det h\u00e4r exemplet <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ska jag bara \u00e5terkomma<\/a> eftersom det \u00e4r l\u00e4tt att l\u00e4sa och l\u00e4ttast kan anpassas f\u00f6r din anv\u00e4ndning.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>S\u00e5 det hanterar alternativen, men hur \u00e4r det n\u00e4r alternativen \u00e4r inst\u00e4llda men inte har de v\u00e4rden vi f\u00f6rv\u00e4ntar oss? Det betyder att vi ocks\u00e5 m\u00e5ste verifiera att de g\u00f6r det. Och om inte, ignorera dem, returnera, logga ett fel, kasta ett undantag och s\u00e5 vidare.<\/p>\n<p>Du vet: Samma sak som ovan. F\u00f6rutom att i det h\u00e4r fallet kommer jag inte att vidta n\u00e5gra \u00e5tg\u00e4rder om inte koden har den perfekta informationen.<\/p>\n<h3>3 Bli lite l\u00e5ng<\/h3>\n<p>Vid det h\u00e4r laget b\u00f6rjar metoden bli lite l\u00e5ng och blir sv\u00e5rare att l\u00e4sa. Visst, om du \u00e4r en erfaren programmerare kan du h\u00e4vda att &quot;Detta \u00e4r kod, det \u00e4r inte engelska&quot;, men varf\u00f6r inte str\u00e4va efter att g\u00f6ra det lite l\u00e4ttare att f\u00f6lja?<\/p>\n<p>Dessutom g\u00f6r det det lite l\u00e4ttare att testa. Men det ligger utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg. Ta alternativutv\u00e4rderingen som det f\u00f6rsta exemplet p\u00e5 koden.<\/p>\n<ol>\n<li>Detta \u00e4r n\u00e5got som kan lindas in i sin funktion som inte bara isolerar denna kontroll utan ocks\u00e5 g\u00f6r det resulterande samtalet lite l\u00e4ttare.<\/li>\n<li>Ta sedan det andra kodblocket som letar efter de idealiska alternativv\u00e4rdena. Detta kan ocks\u00e5 abstraheras av samma sk\u00e4l ovan.<\/li>\n<li>Och slutligen, st\u00e4ll in en funktion f\u00f6r att se till att de f\u00f6rv\u00e4ntade v\u00e4rdena \u00e4r inst\u00e4llda f\u00f6r vart och ett av <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">v\u00e4rdena som anges<\/a> :<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>S\u00e5 nu har du tv\u00e5 mindre metoder som kapslar in samma kontroll som du gjorde.<\/p>\n<h3>4 Slutfunktionen<\/h3>\n<p>Vid det h\u00e4r laget \u00e4r den slutliga funktionen mycket l\u00e4ttare att l\u00e4sa eftersom den har tv\u00e5 hj\u00e4lpfunktioner som kapslar in deras ansvar medan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den h\u00e4r \u00e4r tillbaka till att utv\u00e4rdera den ideala v\u00e4gen<\/a> genom koden:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Det r\u00e4cker med att s\u00e4ga att n\u00e4r det kommer till att omstrukturera WordPress-plugins \u00e4r detta bara ett exempel p\u00e5 hur man g\u00f6r bara ett segment av det. Men det \u00e4r en b\u00f6rjan, eller hur?<\/p>\n<h2>Hela plugins?<\/h2>\n<p>Eller hur? Att omstrukturera WordPress-plugins \u00e4r inget sk\u00e4mt. Men om du b\u00f6rjar med sm\u00e5 funktioner som denna och gradvis arbetar dig runt kodbasen blir det l\u00e4ttare.<\/p>\n<p>Och om du l\u00e4gger ner tid p\u00e5 att planera projektet fr\u00e5n b\u00f6rjan kan det spara mycket tid p\u00e5 att g\u00e5 tillbaka och omstrukturera den h\u00e4r typen av saker.<\/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>Att omstrukturera WordPress-plugins \u00e4r jobb. Men om du b\u00f6rjar med sm\u00e5 funktioner och gradvis arbetar dig runt kodbasen blir det l\u00e4ttare.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,755,922,818,724,868],"tags":[1173],"class_list":["post-228351","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-oeppen-kaella","category-oevrig","category-plugins-3","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228351","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=228351"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228351\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}