{"id":229738,"date":"2022-11-09T14:29:00","date_gmt":"2022-11-09T11:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229738"},"modified":"2022-11-09T16:10:27","modified_gmt":"2022-11-09T13:10:27","slug":"mitae-ovat-ohjelmoinnin-sivuvaikutukset","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/mitae-ovat-ohjelmoinnin-sivuvaikutukset\/","title":{"rendered":"Mit\u00e4 ovat ohjelmoinnin sivuvaikutukset?"},"content":{"rendered":"\n<p>Aina kun puhumme tietyist\u00e4 ohjelmointikonsepteista, mielest\u00e4ni on t\u00e4rke\u00e4\u00e4 ottaa askel taaksep\u00e4in kaikista keskustelemistamme yksityiskohdista ja tarkastella asioita laajemman kokonaisuuden yhteydess\u00e4.<\/p>\n<p>Jotkut moduulit tuovat sivuvaikutuksia; jotkut eiv\u00e4t. Se on okei.<\/p>\n<p>Esimerkiksi <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/peruskoodausstandardit-psr-1-n-kautta\/\" title=\"eilen\" >eilen<\/a> kosketin lyhyesti ajatusta sivuvaikutusten ohjelmoinnista, mutta tein niin puhuessani PSR:ien k\u00e4yt\u00f6st\u00e4. Ja niille, jotka ovat vain kiinnostuneita ohjelmoinnin n\u00e4k\u00f6kohdista yleisemmin, on t\u00e4rke\u00e4\u00e4 ymm\u00e4rt\u00e4\u00e4 my\u00f6s ne.<\/p>\n<p>Muista, ett\u00e4 sivuvaikutusten idea <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PSR-1:ss\u00e4<\/a> on:<\/p>\n<blockquote>\n<p>Tiedoston PIT\u00c4\u00c4 ilmoittaa uusia symboleja (luokat, funktiot, vakiot jne.) eik\u00e4 aiheuta muita sivuvaikutuksia, tai sen PIT\u00c4\u00c4 suorittaa logiikkaa sivuvaikutuksineen, mutta EI SID\u00c4 tehd\u00e4 molempia.<\/p>\n<\/blockquote>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 en ole niin kiinnostunut keskustelemaan logiikasta sivuvaikutusten kanssa (koska on aikoja, jolloin sivuvaikutuksia tapahtuu). Sen sijaan olen enemm\u00e4n huolissani ohjelmoinnin sivuvaikutusten ymm\u00e4rt\u00e4misest\u00e4 (mit\u00e4 ne ovat, mit\u00e4 v\u00e4ltet\u00e4\u00e4n ja niin edelleen).<\/p>\n<p>Loppujen lopuksi sivuvaikutuksista puhuminen yhdess\u00e4 yhteydess\u00e4 voi tarkoittaa yht\u00e4 asiaa, kun taas ohjelmoinnissa se voi tarkoittaa toista.<\/p>\n<h2>Ohjelmoinnin sivuvaikutukset<\/h2>\n<p>Okei, joten koko idea tai m\u00e4\u00e4ritelm\u00e4 yleisest\u00e4 sivuvaikutuksesta on yksinkertainen, <a href=\"https:\/\/d.pr\/Jyf2Np\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">eik\u00f6<\/a>? <\/p>\n<blockquote>\n<p>l\u00e4\u00e4kkeen tai l\u00e4\u00e4kehoidon toissijainen, tyypillisesti ei-toivottu vaikutus.<\/p>\n<\/blockquote>\n<p>Ota pois koko hoiton\u00e4k\u00f6kohta, ja sinulle j\u00e4\u00e4 &quot;toissijainen, \u2026 ei-toivottu vaikutus.&quot; Okei, t\u00e4ss\u00e4 on mahdollisesti h\u00e4mment\u00e4v\u00e4 osa:<\/p>\n<ul>\n<li>p\u00e4\u00e4t\u00e4mme sis\u00e4llytt\u00e4\u00e4 tiedoston,<\/li>\n<li>tied\u00e4mme mit\u00e4 tiedosto tekee,<\/li>\n<li>N\u00e4in ollen, jos tied\u00e4mme, mit\u00e4 <a href=\"https:\/\/php.net\/manual\/en\/function.include-once.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sis\u00e4llyt\u00e4mme<\/a> ja mit\u00e4 se tekee, kuinka se voi tuoda esiin jotain ei-toivottua?<\/li>\n<\/ul>\n<p>Ainakin n\u00e4in kuulen usein kysytt\u00e4v\u00e4n, kun puhutaan sivuvaikutuksista. Ohjelmoinnissa olen aina yleist\u00e4nyt sivuvaikutukset kaikkeen, joka muuttaa ohjelman tilaa.<\/p>\n<p>Tarpeeksi helppoa, eik\u00f6?<\/p>\n<h3>Sivuvaikutukset WordPressiss\u00e4<\/h3>\n<p>Oletetaan siis, ett\u00e4 ty\u00f6skentelet WordPressin kanssa, koska siit\u00e4 min\u00e4 teen <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ja kirjoitan<\/a> \ud83d\ude42, ja meill\u00e4 on tiedosto, joka vastaa alivalikkokohteen lis\u00e4\u00e4misest\u00e4 johonkin olemassa olevista yl\u00e4tason valikoista.<\/p>\n<p>T\u00e4m\u00e4 luokka voisi olla suhteellisen yksinkertainen siin\u00e4 mieless\u00e4, ett\u00e4 se katkaisee <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oikean WordPress API -kutsun<\/a>, k\u00e4ynnistyy, kun se on liitetty [oikeaan] koukkuun, ja lis\u00e4\u00e4 sitten alivalikon tarkoitetulla tavalla.<\/p>\n<p>Oletetaan kuitenkin, ett\u00e4 joko kyseinen luokka, luokassa oleva menetelm\u00e4 tai tiedosto, joka lis\u00e4\u00e4 my\u00f6s JavaScripti\u00e4 tai tyylej\u00e4, jotka muuttavat alivalikon kohdan tilaa siten, ett\u00e4 se on korostettu, se k\u00e4ytt\u00e4ytyy kuin &quot;napsautettu&quot; tai se tekee jotain, mit\u00e4 joko ohjelma tai k\u00e4ytt\u00e4j\u00e4 ei aio.<\/p>\n<p>Se olisi sivuvaikutus, koska se muuttaa ohjelman tilaa.<\/p>\n<h2>Mit\u00e4 moduulin pit\u00e4isi tehd\u00e4?<\/h2>\n<p>T\u00e4m\u00e4n luokan pit\u00e4isi itse tehd\u00e4 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">yksi asia<\/a> :<\/p>\n<blockquote>\n<p>Yksitt\u00e4isen vastuun periaate on tietokoneohjelmointiperiaate, jonka mukaan jokaisella moduulilla tai luokalla tulee olla vastuu yhdest\u00e4 ohjelmiston tarjoaman toiminnallisuuden osasta ja ett\u00e4 vastuun tulee olla kokonaan luokan sis\u00e4ll\u00e4.<\/p>\n<\/blockquote>\n<p>Mutta kun esittelemme jotain, joka lis\u00e4\u00e4 sen tarkoitusta \u2013 kun lis\u00e4\u00e4mme sen vastuuta tai muutamme sen yksitt\u00e4ist\u00e4 ydinasiaa \u2013 olemme ottaneet k\u00e4ytt\u00f6\u00f6n sivuvaikutuksen.<\/p>\n<p>Muista, ett\u00e4 t\u00e4m\u00e4 ei ole luonnostaan \u200b\u200bhuono (kuten yll\u00e4 oleva PSR-1-m\u00e4\u00e4ritelm\u00e4), mutta on t\u00e4rke\u00e4\u00e4 tunnistaa, milloin teemme sit\u00e4 ja milloin emme.<\/p>\n<h2>Joten kuinka lis\u00e4\u00e4mme toimintoja?<\/h2>\n<p>Luulen, ett\u00e4 luonnollinen kysymys on, ett\u00e4 jos haluamme lis\u00e4t\u00e4 toiminnallisuutta ohjelmaan, joka muuttaa sen tilaa, miten se tehd\u00e4\u00e4n (ja onko se v\u00e4\u00e4rin)?<\/p>\n<p>Ensinn\u00e4kin, ei, se ei ole v\u00e4\u00e4rin. Tarkoitan, ett\u00e4 ohjelmilla on erilaisia \u200b\u200btiloja useiden asioiden perusteella, eik\u00f6 niin? Joskus se tapahtuu, kun jotain kirjoitetaan levylle tai tietokantaan; joskus se tapahtuu, kun k\u00e4ytt\u00e4j\u00e4 napsauttaa jotakin k\u00e4ytt\u00f6liittym\u00e4n elementti\u00e4 ja niin edelleen.<\/p>\n<p>Mutta miten n\u00e4m\u00e4 tilat tapahtuvat, sivuvaikutusten luonne vaikuttaa.<\/p>\n<p>Otetaan esimerkiksi ajatus alivalikosta. Sen pit\u00e4isi tehd\u00e4 yksi asia. Sen ei pit\u00e4isi muuttaa mit\u00e4\u00e4n muuta kuin sit\u00e4, mit\u00e4 n\u00e4emme n\u00e4yt\u00f6ll\u00e4.<\/p>\n<ul>\n<li>Sen ei pit\u00e4isi kirjoittaa tietokantaan,<\/li>\n<li>Sen ei pit\u00e4isi m\u00e4\u00e4ritt\u00e4\u00e4 tapahtumaseurainta, kun toinen objekti lis\u00e4\u00e4 alivalikon,<\/li>\n<li>Sen ei pit\u00e4isi muuttaa mink\u00e4\u00e4n itsens\u00e4 ulkopuolisen esityst\u00e4.<\/li>\n<li>Ja niin edelleen.<\/li>\n<\/ul>\n<p>Toimintojen lis\u00e4\u00e4minen toimii samalla tavalla: esittelet luokat, jotka ovat vastuussa tietyn asian tekemisest\u00e4, ja annat heid\u00e4n tehd\u00e4 sen. Kun n\u00e4m\u00e4 komponentit toimivat yhdess\u00e4, sinulla on toiminnallinen ohjelma, jossa jokainen moduuli (luokka\/toiminto\/mik\u00e4 tahansa) pysyy niin sanotusti omalla kaistallaan.<\/p>\n<h2>Mik\u00e4 on peukalos\u00e4\u00e4nt\u00f6?<\/h2>\n<p>Olen varma, ett\u00e4 monet teist\u00e4 t\u00e4t\u00e4 lukevista tiet\u00e4v\u00e4t, mit\u00e4 sivuvaikutuksia on ja mit\u00e4 ne eiv\u00e4t ole. Ja kuten sinulla, minulla on omani.<\/p>\n<p>Ajattele asiaa n\u00e4in:<\/p>\n<p>Jos kutsut menetelm\u00e4\u00e4 ja se palauttaa arvon ja sitten kutsut metodia uudelleen samalla tietojoukolla, sen pit\u00e4isi palauttaa sama arvo.<\/p>\n<p>N\u00e4in tied\u00e4t, ett\u00e4 funktiollasi, luokallasi tai yleisell\u00e4 moduulillasi ei ole sivuvaikutuksia.<\/p>\n<p>Ja kuten miss\u00e4 tahansa, olen tehnyt n\u00e4m\u00e4 virheet (ja tulen todenn\u00e4k\u00f6isesti jatkamaan), mutta kyse on siit\u00e4, ett\u00e4 yrit\u00e4n olla parempi tekem\u00e4tt\u00e4 sit\u00e4.<\/p>\n<p>Lopulta siit\u00e4 tulee uusi normaali.<\/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>Keskustelin aiemmin ohjelmoinnin sivuvaikutuksista PSR-1:n yhteydess\u00e4. Mutta niiden merkitys ulottuu yhden kielen ulkopuolelle ja yleiseen ohjelmointiin.<\/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":[719,895],"tags":[1166],"class_list":["post-229738","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229738","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=229738"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229738\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}