{"id":230345,"date":"2022-12-08T17:32:00","date_gmt":"2022-12-08T14:32:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230345"},"modified":"2022-12-07T11:56:35","modified_gmt":"2022-12-07T08:56:35","slug":"sikta-paa-att-dela-upp-program-i-mindre-komponenter","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/sikta-paa-att-dela-upp-program-i-mindre-komponenter\/","title":{"rendered":"Sikta p\u00e5 att dela upp program i mindre komponenter"},"content":{"rendered":"\n<p>En av de saker som programmerare ofta pratar om \u00e4r viljan att dela upp program i mindre komponenter, eller funktioner, s\u00e5 att det blir l\u00e4ttare att sp\u00e5ra, l\u00e4ttare att l\u00e4sa och l\u00e4ttare att fels\u00f6ka.<\/p>\n<p>Men det \u00e4r inte s\u00e5 ovanligt att se monolitiska funktioner med m\u00e5nga kodkommentarer f\u00f6r att f\u00f6rklara vad som h\u00e4nder i programmet.<\/p>\n<p>Jag knackar inte p\u00e5 det h\u00e4r, f\u00f6r jag vet inte vilka begr\u00e4nsningar en programmerare arbetade under. Det \u00e4r:<\/p>\n<ul>\n<li>Vilken budget hade han\/hon n\u00e4r han\/hon byggde upp programmet?<\/li>\n<li>Hur mycket tid gavs f\u00f6r att slutf\u00f6ra projektet?<\/li>\n<li>Var det m\u00e5nga som arbetade med projektet?<\/li>\n<li>Fick programmeraren tid att skriva koden s\u00e5 att de kunde enhetstesta den, omstrukturera den eller bara g\u00f6ra den l\u00e4ttare att l\u00e4sa?<\/li>\n<\/ul>\n<p>Kort sagt, det finns m\u00e5nga sk\u00e4l \u2013 tror jag \u2013 att vi kan l\u00e4sa &quot;d\u00e5lig kod&quot;, och det beh\u00f6ver inte alltid vara programmerarens fel (det \u00e4r bara det mest naturliga vi m\u00e5ste kasta ut n\u00e4r vi l\u00e4ser n\u00e5got vi ogillar).<\/p>\n<p>Betyder detta dock att vi inte ska str\u00e4va efter att omstrukturera eller skriva kod p\u00e5 ett s\u00e4tt som g\u00f6r det l\u00e4ttare att f\u00f6rst\u00e5? Sj\u00e4lvklart inte. F\u00f6rutsatt att vi har tid att g\u00f6ra det, hur kan vi g\u00f6ra det?<\/p>\n<h2>Dela upp program i mindre komponenter<\/h2>\n<p>N\u00e4r det kommer till att skriva om ett \u00e4mne som detta, s\u00e4rskilt i en ekonomi som \u00e4r lika aktiv som e-handel i WordPress, kan det vara en utmaning.<\/p>\n<h3>&quot;L\u00e5t oss bli specifika, Bob.&quot;<\/h3>\n<div class=\"sds-iframe-wrapper fitvidsignore\" style=\"position:relative;padding-top:56.25%;max-width:100%;\"><iframe allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;\" src=\"\/\/www.youtube.com\/embed\/4M2kEiLHKhs\" frameborder=\"0\"><\/iframe><\/div>\n<p>Det vill s\u00e4ga, jag kan skriva om det p\u00e5 en mycket detaljerad niv\u00e5 med hj\u00e4lp av en upps\u00e4ttning plugins, titta p\u00e5 data, dissekera fr\u00e5gor och visa hur man g\u00f6r det. Eller s\u00e5 kan jag skriva det om det p\u00e5 en lite h\u00f6gre niv\u00e5 med det yttersta m\u00e5let att visa hur man delar upp program i mindre komponenter.<\/p>\n<p>Eftersom det finns s\u00e5 m\u00e5nga s\u00e4tt att uppn\u00e5 det f\u00f6rra, v\u00e4ljer jag det senare. Det vill s\u00e4ga, detta kommer inte n\u00f6dv\u00e4ndigtvis att anv\u00e4nda n\u00e5gra specifika plugins utan direkta fr\u00e5gor. Den kommer dock att anv\u00e4nda exempel p\u00e5 h\u00f6g niv\u00e5 f\u00f6r att hj\u00e4lpa dig g\u00e5 igenom vad som kan vara en serie fr\u00e5gor och loopar och dela upp dem i mindre funktioner.<\/p>\n<h3>Ett allm\u00e4nt exempel<\/h3>\n<p>Till exempel, l\u00e5t oss s\u00e4ga att jag arbetar p\u00e5 en funktion i ett WordPress-plugin som \u00e4r det yttersta syftet med \u00e4r att h\u00e4mta alla de olika betalningsmetoderna som en anv\u00e4ndare har lagrat och som \u00e4r relaterade till deras konto.<\/p>\n<p>Utmaningen \u00e4r att denna information \u00e4r spridd \u00f6ver flera databastabeller (p\u00e5 grund av olika plugins som anv\u00e4nds) s\u00e5 det finns n\u00e5gra fr\u00e5gor som m\u00e5ste k\u00f6ras och sedan h\u00e4mtas.<\/p>\n<p>Stegen f\u00f6r att g\u00f6ra s\u00e5dana fr\u00e5gor kan se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<ol>\n<li>f\u00e5 den nuvarande anv\u00e4ndarens kund-ID,<\/li>\n<li>f\u00e5 alla order-ID-nummer f\u00f6r kunden<\/li>\n<li>avg\u00f6ra vilka betalningsmetoder som anv\u00e4ndes f\u00f6r varje best\u00e4llning<\/li>\n<li>h\u00e4mta n\u00e4mnda betalningsmetoder och sedan skicka informationen g\u00f6ra till kunden<\/li>\n<\/ol>\n<p>Beroende p\u00e5 hur databasen \u00e4r inst\u00e4lld, beroende p\u00e5 din SQL-kunskapsniv\u00e5, och beroende p\u00e5 hur de olika plugins f\u00f6r att hantera all ovanst\u00e5ende data fungerar tillsammans, kan det vara l\u00e4tt att skriva en stor fr\u00e5ga f\u00f6r att h\u00e4mta denna information.<\/p>\n<p>Men om du har arbetat med e-handel i WordPress och olika plugins s\u00e5 vet du att det inte alltid \u00e4r s\u00e5 l\u00e4tt.<\/p>\n<p>Ist\u00e4llet tittar du p\u00e5 n\u00e5got som:<\/p>\n<ol>\n<li>vi beh\u00f6ver f\u00e5 en kunds profil fr\u00e5n anv\u00e4ndarens metadata,<\/li>\n<li>vi m\u00e5ste hitta alla best\u00e4llningar som anv\u00e4ndaren har gjort, och detta kan ofta associeras med inl\u00e4gget eller inl\u00e4ggets metadatatabell,<\/li>\n<li>betalningsmetoderna kan med stor sannolikhet lagras i deras tabell som \u00e4r kopplad till anv\u00e4ndaren genom n\u00e5gon typ av token,<\/li>\n<li>token ovan sitter i en tabell och \u00e4r relaterad till en given information i en annan tabell som du sedan m\u00e5ste h\u00e4rleda genom att titta p\u00e5 den data som finns i hela databasen.<\/li>\n<\/ol>\n<p>I slut\u00e4ndan m\u00e5ste du skapa en upps\u00e4ttning fr\u00e5gor endast genom att f\u00f6rst f\u00f6rst\u00e5 hur du fr\u00e5gar efter den data du letar efter. Det \u00e4r tillr\u00e4ckligt utmanande som det \u00e4r. Men n\u00e4r du f\u00e5r g\u00f6ra det, l\u00e5t oss s\u00e4ga att du skriver dina fr\u00e5gor sekventiellt och sedan anv\u00e4nder resultaten av var och en f\u00f6r att komma till \u00f6nskat resultat.<\/p>\n<p>Detta kan resultera i <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/7c0c8b50cd361f22b5f777544adc2204#file-00-monolithic-queries-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">n\u00e5got i stil med detta<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ First, read the user ID and meta value to get authorization information\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT\n            user_id, meta_value\n        FROM $wpdb-&gt;usermeta\n        WHERE meta_key LIKE %s\n        AND user_id = %d\n        \",\n        '%customer_profile_id%',\n        filter_input(INPUT_GET, 'customer_id')\n    ),\n    ARRAY_A\n);\n\n$result = isset($results[0])? array_column($results[0], 'meta_value'): [];\nif (empty($result)) {\n    return $result;\n}\n\n\/\/ Get the ID of the current customer.\n$customers = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\", \/\/ Your custom query goes here.\n        filter_input(INPUT_GET, 'customer_id')\n    ),\n    ARRAY_A\n);\n\n$customer = isset($customers[0])? array_column($customers[0], 'customer_id'): [];\nif (empty($customer)) {\n    return $customer;\n}\n\n\/\/ Get all of the order IDs from the set of orders returned from the previous query.\n$orderIds = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\", \/\/ Your custom query goes here.\n        $customer\n    ),\n    ARRAY_A\n);\n\nreturn $orderIds;\n\n\/\/ Finally, get all of the payment methods for the orders based on their Ids.\n$orders = [];\nforeach ($orderIds as $orderId) {\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\" \/\/ The query for retrieving various payment method information based on the $orderId\n        ),\n        ARRAY_A\n    );\n\n    if (empty($results)) {\n        continue;\n    }\n\n    $orders[$orderId] = $results;\n}\n\n\/\/ Now send the information back to the user.\nwp_send_json_success($orders);\n<\/code><\/pre>\n<p>Men det beh\u00f6ver inte vara s\u00e5 h\u00e4r.<\/p>\n<p>F\u00f6r det f\u00f6rsta \u00e4r dessa alla oberoende fr\u00e5gor med oberoende upps\u00e4ttningar resultat \u00e4ven om de m\u00e5ste anv\u00e4ndas tillsammans. Det betyder att vi kan bryta is\u00e4r dem och utv\u00e4rdera resultaten av var och en innan vi g\u00e5r vidare med n\u00e4sta steg.<\/p>\n<p>Dessutom till\u00e5ter det oss att skriva mindre, mer sammanh\u00e4ngande funktioner. \u00c4ven om de kan bero p\u00e5 varandra, kan vi st\u00e4lla in varje funktion f\u00f6r att acceptera ett argument (eller en upps\u00e4ttning argument fr\u00e5n vilka vi kan h\u00e4mta all information.<\/p>\n<p>Kanske kan slutresultatet se <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/7c0c8b50cd361f22b5f777544adc2204#file-01-breaking-apart-the-queries-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\npublic function getPaymentMethods()\n{\n  $authInfo = $this-&gt;getAuthorizationInformation();\n  $currentCustomerId = $this-&gt;getCurrentCustomerId($authInfo);\n  $orders = $this-&gt;getCustomerOrders($currentCustomerId);\n  $paymentMethods = $this-&gt;getPaymentMethodsFromOrders($orders);\n  wp_send_json_success($orders);\n}\n\nprivate function getAuthorizationInformation()\n{\n  global $wpdb;\n  $authInfo = $wpdb-&gt;get_results(\n      $wpdb-&gt;prepare(\n          \"\n          SELECT\n              user_id, meta_value\n          FROM $wpdb-&gt;usermeta\n          WHERE meta_key LIKE %s\n          AND user_id = %d\n          \",\n          '%customer_profile_id%',\n          filter_input(INPUT_GET, 'customer_id')\n      ),\n      ARRAY_A\n  );\n\n  return isset($authInfo[0])? array_column($authInfo[0], 'meta_value'): [];\n}\n\nprivate function getCurrentCustomerIdFromAuthInfo($authInfo)\n{\n  global $wpdb;\n  $customers = $wpdb-&gt;get_results(\n      $wpdb-&gt;prepare(\n          \"\", \/\/ Your custom query goes here.\n          $authInfo;\n      ),\n      ARRAY_A\n  );\n\n  return isset($customerId[0])? array_column($customerId[0], 'meta_value'): [];\n}\n\nprivate function getCustomerOrders($customerId)\n{\n  global $wpdb;\n  $orderIds = $wpdb-&gt;get_results(\n      $wpdb-&gt;prepare(\n          \"\", \/\/ Your custom query goes here.\n          $customerId\n      ),\n      ARRAY_A\n  );\n\n  return empty($orderIds)? []: $orderIds;\n}\n\nprivate function getPaymentMethodsFromOrders($orderIds)\n{\n  $paymentMethods = [];\n  foreach ($orderIds as $orderId) {\n      $results = $wpdb-&gt;get_results(\n          $wpdb-&gt;prepare(\n              \"\" \/\/ The query for retrieving various payment method information based on the $orderId\n          ),\n          ARRAY_A\n      );\n\n      if (empty($results)) {\n          continue;\n      }\n\n      $paymentMethods[$orderId] = $results;\n  }\n\n  return $paymentMethods;\n}\n<\/code><\/pre>\n<p>Naturligtvis kan jag inte visa n\u00e5gon faktisk SQL \u2013 ja, \u00e5tminstone inte \u00f6verallt \u2013 eftersom jag inte kan den allm\u00e4nna upps\u00e4ttningen och inte heller vet exakt vilka plugins eller scheman det \u00e4r som du arbetar med.<\/p>\n<p>Men det har aldrig varit meningen med det h\u00e4r inl\u00e4gget.<\/p>\n<p>Ist\u00e4llet \u00e4r den ultimata po\u00e4ngen som jag f\u00f6rs\u00f6ker f\u00f6rmedla denna: \u00c4ven om vi kanske arbetar under mycket begr\u00e4nsade begr\u00e4nsningar, kan vi fortfarande dela upp program i mindre komponenter som hj\u00e4lper oss att beskriva vad som h\u00e4nder, f\u00f6rst\u00e5 hur det g\u00f6rs och sedan skicka data fram och tillbaka mellan olika funktioner och till och fr\u00e5n anv\u00e4ndaren.<\/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>En av de saker som programmerare ofta pratar om \u00e4r viljan att dela upp program i mindre komponenter, eller funktioner, s\u00e5 att det blir l\u00e4ttare att sp\u00e5ra, l\u00e4ttare att l\u00e4sa och l\u00e4ttare att fels\u00f6ka.<\/p>\n","protected":false},"author":1,"featured_media":236233,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,807,724],"tags":[1173],"class_list":["post-230345","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-php-9","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230345","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=230345"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230345\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236233"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}