{"id":228999,"date":"2022-11-09T14:53:00","date_gmt":"2022-11-09T11:53:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228999"},"modified":"2022-11-09T15:00:03","modified_gmt":"2022-11-09T12:00:03","slug":"vad-aer-programmeringsbiverkningar-egentligen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/vad-aer-programmeringsbiverkningar-egentligen\/","title":{"rendered":"Vad \u00e4r programmeringsbiverkningar egentligen?"},"content":{"rendered":"\n<p>N\u00e4r vi pratar om vissa programmeringskoncept tror jag att det \u00e4r viktigt att ta ett steg tillbaka fr\u00e5n de detaljer vi \u00e4n diskuterar och titta p\u00e5 saker i sammanhanget av den st\u00f6rre bilden.<\/p>\n<p>Vissa moduler introducerar biverkningar; vissa g\u00f6r det inte. Det \u00e4r okej.<\/p>\n<p>Till exempel <a href=\"https:\/\/wordpress.mediadoma.com\/sv\/grundlaeggande-kodningsstandarder-via-psr-1\/\" title=\"ig\u00e5r\">ig\u00e5r<\/a> ber\u00f6rde jag kort id\u00e9n om att programmera biverkningar, men jag gjorde det n\u00e4r jag pratade om att anv\u00e4nda PSR. Och f\u00f6r dem som helt enkelt \u00e4r intresserade av aspekter av programmering i en mer allm\u00e4n bem\u00e4rkelse, \u00e4r det viktigt att f\u00f6rst\u00e5 dem ocks\u00e5.<\/p>\n<p>Kom ih\u00e5g att id\u00e9n om biverkningar <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">som anges i PSR-1<\/a> \u00e4r:<\/p>\n<blockquote>\n<p>En fil SKA deklarera nya symboler (klasser, funktioner, konstanter, etc.) och inte orsaka n\u00e5gra andra biverkningar, eller s\u00e5 SKA den k\u00f6ra logik med biverkningar, men SKA INTE g\u00f6ra b\u00e5da.<\/p>\n<\/blockquote>\n<p>I det h\u00e4r inl\u00e4gget \u00e4r jag inte s\u00e5 intresserad av att diskutera logik med biverkningar (eftersom det finns tillf\u00e4llen d\u00e5 biverkningar kommer att h\u00e4nda). Ist\u00e4llet \u00e4r jag mer angel\u00e4gen om att f\u00f6rst\u00e5 biverkningar av programmering (vad de \u00e4r, vad man ska undvika och s\u00e5 vidare).<\/p>\n<p>Att prata om biverkningar i ett sammanhang kan trots allt betyda en sak medan det i programmering kan betyda en annan.<\/p>\n<h2>Programmeringsbiverkningar<\/h2>\n<p>Okej, s\u00e5 hela id\u00e9n eller definitionen av en generisk biverkning \u00e4r enkel, <a href=\"https:\/\/d.pr\/Jyf2Np\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">eller hur<\/a>? <\/p>\n<blockquote>\n<p>en sekund\u00e4r, typiskt o\u00f6nskad effekt av ett l\u00e4kemedel eller medicinsk behandling.<\/p>\n<\/blockquote>\n<p>Ta bort hela behandlingsaspekten och du f\u00e5r en &quot;sekund\u00e4r, &#8230; o\u00f6nskad effekt.&quot; Okej, s\u00e5 h\u00e4r \u00e4r den potentiellt f\u00f6rvirrande delen:<\/p>\n<ul>\n<li>vi v\u00e4ljer att inkludera en fil,<\/li>\n<li>vi vet vad filen g\u00f6r,<\/li>\n<li>allts\u00e5, om vi vet vad vi <a href=\"https:\/\/php.net\/manual\/en\/function.include-once.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">inkluderar<\/a> och vad det g\u00f6r, hur kan det introducera n\u00e5got o\u00f6nskat?<\/li>\n<\/ul>\n<p>\u00c5tminstone \u00e4r det s\u00e5 jag ofta h\u00f6r att det fr\u00e5gas n\u00e4r det kommer till att prata om biverkningar. I programmering har jag alltid generaliserat biverkningar som allt som f\u00f6r\u00e4ndrar programmets tillst\u00e5nd.<\/p>\n<p>L\u00e4tt nog, eller hur?<\/p>\n<h3>Biverkningar i WordPress<\/h3>\n<p>S\u00e5 l\u00e5t oss s\u00e4ga att du arbetar med WordPress, f\u00f6r det \u00e4r vad jag g\u00f6r <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">och skriver om<\/a> \ud83d\ude42, och vi har en fil som \u00e4r ansvarig f\u00f6r att l\u00e4gga till ett undermenyobjekt till en av de befintliga toppniv\u00e5menyerna.<\/p>\n<p>Den klassen kan vara relativt enkel p\u00e5 s\u00e5 s\u00e4tt att den omsluter <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det korrekta WordPress API-anropet<\/a>, den avfyras n\u00e4r den kopplas till [r\u00e4tt] krok och sedan l\u00e4gger till undermenyn som avsett.<\/p>\n<p>Men l\u00e5t oss s\u00e4ga att antingen den klassen, en metod i klassen eller inkluderar en fil att den klassen ocks\u00e5 l\u00e4gger till en del JavaScript eller stilar som \u00e4ndrar tillst\u00e5ndet f\u00f6r undermenyobjektet s\u00e5 att det \u00e4r markerat, det beter sig som om det &quot;klickats&quot; eller det g\u00f6r n\u00e5got som antingen programmet eller anv\u00e4ndaren inte har f\u00f6r avsikt.<\/p>\n<p>Det skulle vara en bieffekt eftersom det f\u00f6r\u00e4ndrar programmets tillst\u00e5nd.<\/p>\n<h2>Vad ska modulen g\u00f6ra?<\/h2>\n<p>Den klassen i sig borde g\u00f6ra <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en sak<\/a> :<\/p>\n<blockquote>\n<p>Principen f\u00f6r ett enda ansvar \u00e4r en datorprogrammeringsprincip som s\u00e4ger att varje modul eller klass ska ha ansvar \u00f6ver en enskild del av funktionaliteten som tillhandah\u00e5lls av programvaran, och att ansvaret ska vara helt inkapslat av klassen.<\/p>\n<\/blockquote>\n<p>Men n\u00e4r vi introducerar n\u00e5got som l\u00e4gger till vad det \u00e4r t\u00e4nkt att g\u00f6ra \u2013 n\u00e4r vi l\u00e4gger till sitt ansvar eller \u00e4ndrar den enda k\u00e4rngrejen det g\u00f6r \u2013 d\u00e5 har vi inf\u00f6rt en bieffekt.<\/p>\n<p>Kom ih\u00e5g att detta inte i sig \u00e4r d\u00e5ligt (enligt PSR-1-definitionen ovan), men det \u00e4r viktigt att k\u00e4nna igen n\u00e4r vi g\u00f6r det och n\u00e4r vi inte g\u00f6r det.<\/p>\n<h2>S\u00e5 hur l\u00e4gger vi till funktionalitet?<\/h2>\n<p>Jag tror att den naturliga fr\u00e5gan \u00e4r att om vi vill l\u00e4gga till funktionalitet till ett program som \u00e4ndrar dess tillst\u00e5nd, hur g\u00f6r vi det (och \u00e4r det fel)?<\/p>\n<p>F\u00f6r det f\u00f6rsta, nej, det \u00e4r inget fel. Jag menar att program har olika tillst\u00e5nd baserat p\u00e5 en m\u00e4ngd olika saker, eller hur? Ibland h\u00e4nder det n\u00e4r n\u00e5got skrivs till disk eller en databas; ibland h\u00e4nder det n\u00e4r anv\u00e4ndaren klickar p\u00e5 ett element i anv\u00e4ndargr\u00e4nssnittet, och s\u00e5 vidare.<\/p>\n<p>Men hur dessa tillst\u00e5nd intr\u00e4ffar \u00e4r d\u00e4r karakt\u00e4ren av biverkningar spelar in.<\/p>\n<p>Ta till exempel tanken p\u00e5 en undermeny. Det ska g\u00f6ra en sak. Det borde inte f\u00f6r\u00e4ndra n\u00e5got annat \u00e4n vad vi ser p\u00e5 sk\u00e4rmen.<\/p>\n<ul>\n<li>Det ska inte skriva till databasen,<\/li>\n<li>Det b\u00f6r inte st\u00e4lla in en h\u00e4ndelseavlyssnare f\u00f6r n\u00e4r ett annat objekt l\u00e4gger till en undermeny,<\/li>\n<li>Det b\u00f6r inte f\u00f6r\u00e4ndra presentationen av n\u00e5got utanf\u00f6r sig sj\u00e4lv.<\/li>\n<li>Och s\u00e5 vidare.<\/li>\n<\/ul>\n<p>Att l\u00e4gga till funktionalitet fungerar p\u00e5 samma s\u00e4tt: Du introducerar klasser som \u00e4r ansvariga f\u00f6r att g\u00f6ra en specifik sak och l\u00e5ter dem g\u00f6ra det. N\u00e4r dessa komponenter fungerar i samverkan med varandra, har du ett funktionsprogram d\u00e4r varje modul (klass\/funktion\/vad som helst) stannar i sitt k\u00f6rf\u00e4lt, s\u00e5 att s\u00e4ga.<\/p>\n<h2>Vad \u00e4r en tumregel?<\/h2>\n<p>Jag \u00e4r s\u00e4ker p\u00e5 att m\u00e5nga av er som l\u00e4ser detta har din syn p\u00e5 vad biverkningar \u00e4r och vad de inte \u00e4r. Och precis som du har jag min egen.<\/p>\n<p>T\u00e4nk p\u00e5 det s\u00e5 h\u00e4r:<\/p>\n<p>Om du anropar en metod och den returnerar ett v\u00e4rde, och sedan anropar en metod igen med samma upps\u00e4ttning data, b\u00f6r den returnera samma v\u00e4rde.<\/p>\n<p>Det \u00e4r s\u00e5 du vet att din funktion, klass eller generiska modul inte har biverkningar.<\/p>\n<p>Och som med allt annat har jag gjort dessa misstag (och kommer sannolikt att forts\u00e4tta) men det handlar om att f\u00f6rs\u00f6ka bli b\u00e4ttre p\u00e5 att inte g\u00f6ra det.<\/p>\n<p>S\u00e5 sm\u00e5ningom kommer det att bli det nya normala.<\/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>Jag diskuterade tidigare programmeringsbiverkningar i samband med PSR-1. Men deras betydelse str\u00e4cker sig bortom ett enda spr\u00e5k och till allm\u00e4n programmering.<\/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":[901,724],"tags":[1173],"class_list":["post-228999","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228999","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=228999"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228999\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228999"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228999"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228999"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}