{"id":230233,"date":"2022-11-21T11:40:00","date_gmt":"2022-11-21T08:40:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230233"},"modified":"2022-11-21T17:26:00","modified_gmt":"2022-11-21T14:26:00","slug":"olio-ohjelmointi-kaeyttoeliittymien-ymmaertaeminen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/olio-ohjelmointi-kaeyttoeliittymien-ymmaertaeminen\/","title":{"rendered":"Olio-ohjelmointi: K\u00e4ytt\u00f6liittymien ymm\u00e4rt\u00e4minen"},"content":{"rendered":"\n<p>T\u00e4ss\u00e4 vaiheessa sanoisin, ett\u00e4 olio-ohjelmoinnin ymm\u00e4rt\u00e4misen perusta on luotu.<\/p>\n<p>Erityisesti olen k\u00e4sitellyt:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"Abstraktio\">Abstraktio<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-ensimmaeistae-pilaria\/\" title=\"Kapselointi\">Kapselointi<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/\" title=\"Perint\u00f6\">Perint\u00f6<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/oop-n-kaksi-toista-pilaria\/\" title=\"Polymorfismi\">Polymorfismi<\/a><\/li>\n<\/ol>\n<p>Ja kyll\u00e4, on keskustelua siit\u00e4, mik\u00e4 muodostaa perustan (eli jotkut eiv\u00e4t heit\u00e4 polymorfismia sekoitukseen, vaikka teenkin). Mutta edell\u00e4 mainittujen nelj\u00e4n pit\u00e4isi tarjota vankka perusta, jolta voit jatkaa olio-ohjelmointitaitosi rakentamista.<\/p>\n<p>On enemm\u00e4nkin, mutta en usko, ett\u00e4 ne ovat niin syvi\u00e4, yksityiskohtaisia \u200b\u200btai vaikeasti ymm\u00e4rrett\u00e4vi\u00e4 kuin jotkut edell\u00e4 mainituista k\u00e4sitteist\u00e4. Sitten taas eri asiat tulevat toisille helpommin.<\/p>\n<p>Joka tapauksessa seuraavat kaksi aihetta, jotka on t\u00e4rke\u00e4\u00e4 ymm\u00e4rt\u00e4\u00e4, ovat:<\/p>\n<ol>\n<li>Liit\u00e4nn\u00e4t<\/li>\n<li>Abstraktio<\/li>\n<\/ol>\n<p>Puhun jokaisesta erikseen, mutta varmista, ett\u00e4 olet lukenut <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fundamentals<\/a> &#8211; sarjan ensin, koska yll\u00e4 olevat kaksi aihetta antavat sinun luottaa niihin ja hy\u00f6dynt\u00e4\u00e4 niit\u00e4.<\/p>\n<p>Ep\u00e4m\u00e4\u00e4r\u00e4ist\u00e4, tied\u00e4n, mutta anna minun selitt\u00e4\u00e4 ja sitten menn\u00e4 sielt\u00e4.<\/p>\n<h2>K\u00e4ytt\u00f6liittymien ymm\u00e4rt\u00e4minen<\/h2>\n<p>Ylivoimaisesti yleisin k\u00e4ytt\u00f6liittym\u00e4n m\u00e4\u00e4ritelm\u00e4, jonka todenn\u00e4k\u00f6isesti kuulet, on, ett\u00e4 se on sopimus. T\u00e4m\u00e4 ei ole v\u00e4\u00e4rin, mutta mielest\u00e4ni se j\u00e4tt\u00e4\u00e4 paljon toivomisen varaa.<\/p>\n<p>Esimerkiksi, kun ajattelet sopimuksia, ajattelet todenn\u00e4k\u00f6isesti jotain, joka on hyvin mukana, paljon ammattikielt\u00e4, monimutkaista prosessia, jolla jotain allekirjoitetaan, p\u00e4iv\u00e4t\u00e4\u00e4n, valmistetaan ty\u00f6skentelyyn ja niin edelleen.<\/p>\n<p>Mutta mit\u00e4 tulee ohjelmointirajapintoihin, t\u00e4m\u00e4 ei todellakaan pid\u00e4 paikkaansa. Itse asiassa v\u00e4itt\u00e4isin, ett\u00e4 rajapintojen m\u00e4\u00e4ritt\u00e4minen voi helpottaa ohjelmointia ja lievitt\u00e4\u00e4 paljon byrokratiaa, koska se tekee asioista eritt\u00e4in mustavalkoisia sen suhteen, mit\u00e4 jotain pit\u00e4isi toteuttaa.<\/p>\n<h3>Sana &quot;liit\u00e4nn\u00f6ist\u00e4&quot;<\/h3>\n<p>Toimialamme k\u00e4ytt\u00e4\u00e4 sanaa &quot;k\u00e4ytt\u00f6liittym\u00e4&quot; kahdelle asialle:<\/p>\n<ul>\n<li>Suunnittelijat ja k\u00e4ytt\u00e4j\u00e4t k\u00e4ytt\u00e4v\u00e4t termi\u00e4 k\u00e4ytt\u00f6liittym\u00e4 kuvaamaan, mit\u00e4 he n\u00e4kev\u00e4t ja kuinka he ovat vuorovaikutuksessa sovelluksen kanssa. T\u00e4m\u00e4 sis\u00e4lt\u00e4\u00e4 esimerkiksi painikkeita, avattavia valikoita ja muita elementtej\u00e4, joita voimme &quot;koskettaa&quot;.<\/li>\n<li>Ohjelmoijat k\u00e4ytt\u00e4v\u00e4t termi\u00e4 viittaamaan siihen, mit\u00e4 toimintoja alaluokan tulee toteuttaa liitty\u00e4kseen rajapintaan. T\u00e4t\u00e4 kutsutaan &quot;ohjelmoimiseksi k\u00e4ytt\u00f6liittym\u00e4\u00e4n&quot;.<\/li>\n<\/ul>\n<p>J\u00e4lkimm\u00e4ist\u00e4 k\u00e4sitell\u00e4\u00e4n t\u00e4ss\u00e4 artikkelissa. Ja ei, emme aio k\u00e4ytt\u00e4\u00e4 tyypillisi\u00e4 esimerkkej\u00e4, kuten ohjelmointia <strong>Animal<\/strong> &#8211; rajapintaan tai mit\u00e4 tahansa. Sen sijaan tarkastelemme sit\u00e4 todellisista koodin\u00e4ytteist\u00e4.<\/p>\n<h3>Ohjelmointi k\u00e4ytt\u00f6liittym\u00e4\u00e4n<\/h3>\n<p>M\u00e4\u00e4rittelemme &quot;ohjelmoinnin rajapinnalle&quot; tapaksi kirjoittaa koodia, joka toteuttaa mainitussa rajapinnassa m\u00e4\u00e4riteltyjen toimintojen allekirjoitukset.<\/p>\n<p>Mutta mit\u00e4 ovat metodi-allekirjoitukset? Yksinkertaisesti sanottuna menetelm\u00e4n allekirjoitukset sis\u00e4lt\u00e4v\u00e4t:<\/p>\n<ul>\n<li>funktion nimen nimi,<\/li>\n<li>sen vaatimat argumentit,<\/li>\n<li>n\u00e4kyvyyden muokkaaja<\/li>\n<\/ul>\n<p>Luokan kontekstissa n\u00e4et sen <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seuraavasti:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) \n  {\n    \/\/ method implementation\n  }\n}\n<\/code><\/pre>\n<p>Helppoa, eik\u00f6?<\/p>\n<p>Yll\u00e4 olevasta koodista voimme n\u00e4hd\u00e4, ett\u00e4 <strong>set<\/strong> &#8211; funktio hyv\u00e4ksyy k\u00e4ytett\u00e4v\u00e4n <strong>avaimen<\/strong> ja <strong>arvon<\/strong>, ja toiminto on k\u00e4ytett\u00e4viss\u00e4 mill\u00e4 tahansa objektilla, jolla on viittaus luokkaan.<\/p>\n<p>Mutta k\u00e4ytt\u00f6liittym\u00e4t voivat my\u00f6s sis\u00e4lt\u00e4\u00e4 t\u00e4m\u00e4n. Siin\u00e4 on kuitenkin varoitus: liit\u00e4nn\u00f6ill\u00e4 ei ole menetelm\u00e4toteutusta.<\/p>\n<p>Joten mieluummin kuin jotain <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4llaista:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) {\n    set_transient($key, $value);\n  }\n}\n<\/code><\/pre>\n<p>N\u00e4et <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4m\u00e4n:<\/a><\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Mutta yll\u00e4 olevassa koodissa on my\u00f6s pari hienovaraisuutta.<\/p>\n<ul>\n<li>T\u00e4m\u00e4 koodi ei m\u00e4\u00e4rittele sit\u00e4 luokkaksi. Sen sijaan se kutsuu sit\u00e4 <strong>k\u00e4ytt\u00f6liittym\u00e4ksi<\/strong>.<\/li>\n<li>Luokan nimess\u00e4 on i-kirjain, joka osoittaa, ett\u00e4 se on k\u00e4ytt\u00f6liittym\u00e4. T\u00e4t\u00e4 ei vaadita; se on yleissopimus.<\/li>\n<li>Menetelm\u00e4ll\u00e4 ei ole toteutusta. Siin\u00e4 ei ole muuta kuin allekirjoitus.<\/li>\n<\/ul>\n<p>Kun luomme k\u00e4ytt\u00f6liittym\u00e4n, sanomme, kuten edell\u00e4 mainittiin, ett\u00e4 mik\u00e4 tahansa luokka toteuttaa rajapinnan, m\u00e4\u00e4ritt\u00e4\u00e4 sen sis\u00e4lt\u00e4m\u00e4t menetelm\u00e4t.<\/p>\n<p>Joten jos yhdist\u00e4isimme kaikki yll\u00e4 n\u00e4kem\u00e4mme, lopullinen toteutus n\u00e4ytt\u00e4isi t\u00e4lt\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">(<\/a> vaikka mieluiten s\u00e4ilytt\u00e4isimme t\u00e4m\u00e4n erillisiss\u00e4 tiedostoissa):<\/p>\n<pre><code>&lt;?php\n\ninterface iCache {\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n\npublic class SimpleCache implemnents iCache\n{\n  public function set($key, $value)\n  {\n    set_transient($key, $value, DAY_IN_SECONDS);\n  }\n\n  public function get($key)\n  {\n    if (!$this-&gt;has($key))\n    {\n      return false;\n    }\n    return get_transient($key);\n  }\n\n  public function has($key)\n  {\n    return false !== get_transient($key);\n  }\n}\n<\/code><\/pre>\n<p>Ja n\u00e4in k\u00e4ytt\u00f6liittym\u00e4t ja luokat sopivat yhteen.<\/p>\n<h2>Se siit\u00e4?<\/h2>\n<p>Yksinkertaisesti sanottuna kyll\u00e4. Mutta kokemukseni mukaan olen huomannut, ett\u00e4 siin\u00e4 on muutakin kuin menetelmien m\u00e4\u00e4rittely ja niiden toteuttaminen.<\/p>\n<p>Usein on helppoa m\u00e4\u00e4ritell\u00e4 luokat, sitten m\u00e4\u00e4ritell\u00e4 k\u00e4ytt\u00f6liittym\u00e4 ja sitten toteuttaa k\u00e4ytt\u00f6liittym\u00e4. Mutta se on <strong>t\u00e4ysin<\/strong> taaksep\u00e4in. Sen sijaan meid\u00e4n on mietitt\u00e4v\u00e4 ty\u00f6t\u00e4mme strategisemmin.<\/p>\n<p>Sen sijaan, ett\u00e4 tukeutuisimme k\u00e4ytt\u00f6liittym\u00e4\u00e4n, joka kumoaa tarkoituksen t\u00e4ysin, meid\u00e4n on aloitettava laajasta, jotta luokkamme voivat erikoistua siihen, mit\u00e4 he tekev\u00e4t, samalla kun ne toteuttavat toimintoja, jotka ovat yhteisi\u00e4 paitsi t\u00e4lle luokalle my\u00f6s muille luokille, jotka saattavat tarvita samoja toimintoja.<\/p>\n<p>Yll\u00e4 olevan esimerkin avulla meill\u00e4 voi olla <strong>SimpleCache<\/strong>, <strong>TransientCache<\/strong> tai jokin muu v\u00e4limuisti. Riippumatta siit\u00e4, mink\u00e4 tyyppist\u00e4 v\u00e4limuistia k\u00e4yt\u00e4mme, he toteuttavat k\u00e4ytt\u00f6liittym\u00e4n, ja toiminnallisuus j\u00e4tet\u00e4\u00e4n rajapinnan toteuttavalle luokalle.<\/p>\n<p>Joten m\u00e4\u00e4rittelemme, milt\u00e4 v\u00e4limuisti voi n\u00e4ytt\u00e4\u00e4 korkealla tasolla, mutta toteutusluokat m\u00e4\u00e4rittelev\u00e4t tarkalleen, kuinka ne toimivat.<\/p>\n<hr \/>\n<p>Jos olet WordPress-kehitt\u00e4j\u00e4 ja haluat oppia rakentamaan asioita sovelluksen p\u00e4\u00e4lle k\u00e4yt\u00e4nn\u00f6llisill\u00e4, oliopohjaisilla tekniikoilla, <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">miksi et liittyisi sivustoon?<\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Yksi ohjelmointirajapinnan m\u00e4\u00e4ritelm\u00e4 on, ett\u00e4 se on sopimus. Mielest\u00e4ni se j\u00e4tt\u00e4\u00e4 paljon toivomisen varaa rajapintojen ymm\u00e4rt\u00e4misess\u00e4.<\/p>\n","protected":false},"author":1,"featured_media":164880,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,843],"tags":[1166],"class_list":["post-230233","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230233","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230233"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230233\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}