{"id":229728,"date":"2022-11-09T14:36:00","date_gmt":"2022-11-09T11:36:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229728"},"modified":"2022-11-09T16:07:16","modified_gmt":"2022-11-09T13:07:16","slug":"quais-sao-os-efeitos-colaterais-da-programacao-afinal","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/quais-sao-os-efeitos-colaterais-da-programacao-afinal\/","title":{"rendered":"Quais s\u00e3o os efeitos colaterais da programa\u00e7\u00e3o, afinal?"},"content":{"rendered":"\n<p>Sempre que falamos sobre certos conceitos de programa\u00e7\u00e3o, acho importante dar um passo para tr\u00e1s de quaisquer detalhes espec\u00edficos que estamos discutindo e olhar para as coisas no contexto do quadro geral.<\/p>\n<p>Alguns m\u00f3dulos apresentam efeitos colaterais; alguns n\u00e3o. Est\u00e1 bem.<\/p>\n<p>Por exemplo, <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/padroes-basicos-de-codificacao-via-psr-1\/\" title=\"ontem\" >ontem<\/a> toquei brevemente na ideia de programar efeitos colaterais, mas fiz isso ao falar sobre o uso de PSRs. E para aqueles que est\u00e3o simplesmente interessados \u200b\u200bem aspectos de programa\u00e7\u00e3o em um sentido mais geral, \u00e9 importante entend\u00ea-los tamb\u00e9m.<\/p>\n<p>Lembre-se, a ideia de efeitos colaterais <a href=\"http:\/\/www.php-fig.org\/psr\/psr-1\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">conforme declarado no PSR-1<\/a> \u00e9:<\/p>\n<blockquote>\n<p>Um arquivo DEVE declarar novos s\u00edmbolos (classes, fun\u00e7\u00f5es, constantes, etc.) e n\u00e3o causar outros efeitos colaterais, ou DEVE executar l\u00f3gica com efeitos colaterais, mas N\u00c3O DEVE fazer as duas coisas.<\/p>\n<\/blockquote>\n<p>Neste post, n\u00e3o estou t\u00e3o interessado em discutir l\u00f3gica com efeitos colaterais (porque h\u00e1 momentos em que os efeitos colaterais acontecem). Em vez disso, estou mais preocupado em entender os efeitos colaterais da programa\u00e7\u00e3o (o que s\u00e3o, o que evitar e assim por diante).<\/p>\n<p>Afinal, falar sobre efeitos colaterais em um contexto pode significar uma coisa enquanto, em programa\u00e7\u00e3o, pode significar outra.<\/p>\n<h2>Efeitos colaterais de programa\u00e7\u00e3o<\/h2>\n<p>Ok, ent\u00e3o toda a ideia ou defini\u00e7\u00e3o de um efeito colateral gen\u00e9rico \u00e9 simples, <a href=\"https:\/\/d.pr\/Jyf2Np\" class=\"external external_icon\" rel=\"nofollow\" target=\"_blank\">certo<\/a>? <\/p>\n<blockquote>\n<p>um efeito secund\u00e1rio, tipicamente indesej\u00e1vel de uma droga ou tratamento m\u00e9dico.<\/p>\n<\/blockquote>\n<p>Retire todo o aspecto do tratamento e voc\u00ea ficar\u00e1 com um &#8220;efeito secund\u00e1rio, &#8230; indesej\u00e1vel&quot;.<\/p>\n<ul>\n<li>optamos por incluir um arquivo,<\/li>\n<li>sabemos o que o arquivo faz,<\/li>\n<li>assim, se sabemos o que estamos <a href=\"https:\/\/php.net\/manual\/en\/function.include-once.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">incluindo<\/a> e o que ele faz, como pode introduzir algo indesej\u00e1vel?<\/li>\n<\/ul>\n<p>Pelo menos, \u00e9 assim que muitas vezes ou\u00e7o quando se trata de falar sobre efeitos colaterais. Na programa\u00e7\u00e3o, sempre generalizei os efeitos colaterais como qualquer coisa que altere o estado do programa.<\/p>\n<p>F\u00e1cil o suficiente, certo?<\/p>\n<h3>Efeitos colaterais no WordPress<\/h3>\n<p>Ent\u00e3o digamos que voc\u00ea esteja trabalhando com WordPress, porque \u00e9 sobre isso que eu fa\u00e7o <a href=\"https:\/\/tommcfarlin.com\/tag\/wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">e escrevo<\/a> \ud83d\ude42, e temos um arquivo que \u00e9 respons\u00e1vel por adicionar um item de submenu a um dos menus de n\u00edvel superior existentes.<\/p>\n<p>Essa classe pode ser relativamente simples, pois envolve <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a chamada adequada da API do WordPress<\/a>, \u00e9 acionada quando anexada ao gancho [apropriado] e adiciona o submenu, conforme pretendido.<\/p>\n<p>Mas digamos que essa classe, um m\u00e9todo na classe ou incluindo um arquivo que essa classe tamb\u00e9m adiciona algum JavaScript ou estilos que alteram o estado do item do submenu de forma que seja destacado, ele se comporte como se tivesse sido &quot;clicado&quot; ou ele faz algo que o programa ou o usu\u00e1rio n\u00e3o pretende.<\/p>\n<p>Isso seria um efeito colateral na medida em que altera o estado do programa.<\/p>\n<h2>O que o m\u00f3dulo deve fazer?<\/h2>\n<p>Essa classe em si deve fazer <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma coisa<\/a> :<\/p>\n<blockquote>\n<p>O princ\u00edpio de responsabilidade \u00fanica \u00e9 um princ\u00edpio de programa\u00e7\u00e3o de computador que afirma que cada m\u00f3dulo ou classe deve ter responsabilidade sobre uma \u00fanica parte da funcionalidade fornecida pelo software, e essa responsabilidade deve ser inteiramente encapsulada pela classe.<\/p>\n<\/blockquote>\n<p>Mas quando introduzimos algo que acrescenta ao que deveria fazer \u2013 quando aumentamos sua responsabilidade ou mudamos a \u00fanica coisa que ele faz \u2013 ent\u00e3o introduzimos um efeito colateral.<\/p>\n<p>Lembre-se, isso n\u00e3o \u00e9 inerentemente ruim (de acordo com a defini\u00e7\u00e3o do PSR-1 acima), mas \u00e9 importante reconhecer quando estamos fazendo isso e quando n\u00e3o estamos.<\/p>\n<h2>Ent\u00e3o, como adicionamos funcionalidade?<\/h2>\n<p>Acho que a pergunta natural \u00e9 que, se queremos adicionar funcionalidade a um programa que altera seu estado, como fazemos isso (e est\u00e1 errado)?<\/p>\n<p>Primeiro, n\u00e3o, n\u00e3o \u00e9 errado. Quero dizer, os programas t\u00eam estados diferentes com base em uma variedade de coisas, certo? \u00c0s vezes acontece quando algo \u00e9 gravado em disco ou banco de dados; \u00e0s vezes acontece quando o usu\u00e1rio clica em um elemento na interface do usu\u00e1rio e assim por diante.<\/p>\n<p>Mas como esses estados acontecem \u00e9 onde a natureza dos efeitos colaterais entra em jogo.<\/p>\n<p>Tomemos, por exemplo, a ideia de um submenu. \u00c9 suposto fazer uma coisa. N\u00e3o deve alterar nada al\u00e9m do que vemos na tela.<\/p>\n<ul>\n<li>Ele n\u00e3o deve gravar no banco de dados,<\/li>\n<li>Ele n\u00e3o deve configurar um ouvinte de eventos para quando outro objeto adiciona um submenu,<\/li>\n<li>N\u00e3o deve alterar a apresenta\u00e7\u00e3o de nada fora de si mesmo.<\/li>\n<li>E assim por diante.<\/li>\n<\/ul>\n<p>A adi\u00e7\u00e3o de funcionalidade funciona da mesma maneira: voc\u00ea introduz classes que s\u00e3o respons\u00e1veis \u200b\u200bpor fazer uma coisa espec\u00edfica e as deixa fazer isso. Quando esses componentes trabalham em conjunto, voc\u00ea tem um programa funcional no qual cada m\u00f3dulo (classe\/fun\u00e7\u00e3o\/qualquer coisa) permanece em sua faixa, por assim dizer.<\/p>\n<h2>O que \u00e9 uma regra pr\u00e1tica?<\/h2>\n<p>Tenho certeza de que muitos de voc\u00eas que est\u00e3o lendo isso t\u00eam sua opini\u00e3o sobre quais s\u00e3o os efeitos colaterais e o que n\u00e3o s\u00e3o. E como voc\u00ea, eu tenho o meu.<\/p>\n<p>Pense assim:<\/p>\n<p>Se voc\u00ea chamar um m\u00e9todo e ele retornar um valor e, em seguida, chamar um m\u00e9todo novamente com o mesmo conjunto de dados, ele dever\u00e1 retornar o mesmo valor.<\/p>\n<p>\u00c9 assim que voc\u00ea sabe que sua fun\u00e7\u00e3o, classe ou m\u00f3dulo gen\u00e9rico n\u00e3o tem efeitos colaterais.<\/p>\n<p>E, como com qualquer coisa, cometi esses erros (e provavelmente continuarei), mas \u00e9 uma quest\u00e3o de tentar melhorar em n\u00e3o faz\u00ea-lo.<\/p>\n<p>Eventualmente, isso se tornar\u00e1 o novo normal.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eu discuti anteriormente os efeitos colaterais da programa\u00e7\u00e3o no contexto do PSR-1. Mas sua import\u00e2ncia se estende al\u00e9m de uma \u00fanica linguagem e na programa\u00e7\u00e3o geral.<\/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":[898,722],"tags":[1170],"class_list":["post-229728","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=229728"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229728\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}