{"id":10081,"date":"2016-10-05T09:00:03","date_gmt":"2016-10-05T12:00:03","guid":{"rendered":"https:\/\/king.host\/blog\/?p=10081"},"modified":"2024-06-04T07:20:16","modified_gmt":"2024-06-04T10:20:16","slug":"conceitos-de-programacao-funcional-com-scala","status":"publish","type":"post","link":"https:\/\/king.host\/blog\/tecnologia\/conceitos-de-programacao-funcional-com-scala\/","title":{"rendered":"Conceitos de Programa\u00e7\u00e3o Funcional com Scala"},"content":{"rendered":"<p>Quando falamos em programa\u00e7\u00e3o em geral, v\u00e1rios paradigmas costumam aparecer. Ultimamente a&nbsp;programa\u00e7\u00e3o funcional tem sido mencionada bastante em confer\u00eancias e artigos.&nbsp;O fato \u00e9 que hoje poucos desenvolvedores conhecem de fato esse paradigma. O mercado \u00e9&nbsp;focado na abordagem&nbsp;imperativa (orientada a objetos), entretanto, v\u00e1rios conceitos utilizados&nbsp;em API&#8217;s e bibliotecas que s\u00e3o escritas OO, vem da programa\u00e7\u00e3o funcional.&nbsp;Programa\u00e7\u00e3o funcional \u00e9 um paradigma onde o c\u00f3digo \u00e9 composto de v\u00e1rias express\u00f5es (pode se pensar em fun\u00e7\u00f5es que recebem um valor e sempre retornam algum valor) e n\u00e3o&nbsp;declara\u00e7\u00f5es, evitando ao m\u00e1ximo a mudan\u00e7a de estado de objetos e vari\u00e1veis mut\u00e1veis.&nbsp;Ent\u00e3o, ao utilizar Scala, voc\u00ea deve programar \u201corientado a express\u00f5es\u201d.<\/p>\n<h3>No Scala, alguns&nbsp;blocos de controle como if retornam valores, por exemplo:<\/h3>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-10082 size-full\" src=\"https:\/\/king.host\/blog\/wp-content\/uploads\/2016\/07\/fidelis.png\" alt=\"fidelis\" width=\"665\" height=\"132\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis.png 665w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis-300x60.png 300w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis-400x79.png 400w\" sizes=\"(max-width: 665px) 100vw, 665px\" \/><\/p>\n<p>Como pode ver, if no scala \u00e9 uma express\u00e3o. Similar ao if utilizado em linguagens como&nbsp;Java, que utiliza o operador \u201c? :\u201d para retornar valor.&nbsp;Um conceito chave \u00e9 perceber que n\u00e3o \u00e9 necess\u00e1rio utilizar a palavra \u201creturn\u201d. Uma&nbsp;express\u00e3o sempre vai retornar um valor. Enquanto em Java \u00e9 pratica comum utilizar return&nbsp;para qualquer m\u00e9todo. Em Scala, a ultima instru\u00e7\u00e3o da fun\u00e7\u00e3o ser\u00e1 a instru\u00e7\u00e3o que retornara o&nbsp;valor. Abaixo um exemplo.<\/p>\n<h3>Java<\/h3>\n<p><img decoding=\"async\" class=\"alignnone size-large wp-image-10083\" src=\"https:\/\/king.host\/blog\/wp-content\/uploads\/2016\/07\/fidelis2-780x260.png\" alt=\"fidelis2\" width=\"780\" height=\"260\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis2-780x260.png 780w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis2-300x100.png 300w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis2-768x256.png 768w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis2-400x133.png 400w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis2.png 786w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>Aqui definimos a fun\u00e7\u00e3o para mapear um c\u00f3digo de erro a uma mensagem. Em Scala match \u00e9&nbsp;equivalente ao \u201cswitch\u201d do Java. Caso n\u00e3o encontre, ele vai cair no \u201ccase _\u201d que seria&nbsp;equivalente ao \u201cdefault\u201d.<\/p>\n<h3>Scala<\/h3>\n<p><img decoding=\"async\" class=\"alignnone size-large wp-image-10084\" src=\"https:\/\/king.host\/blog\/wp-content\/uploads\/2016\/07\/fidelis3-780x195.png\" alt=\"fidelis3\" width=\"780\" height=\"195\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis3-780x195.png 780w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis3-300x75.png 300w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis3-768x192.png 768w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis3-400x100.png 400w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2016\/07\/fidelis3.png 786w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/p>\n<p>Percebemos que ao inv\u00e9s de utilizar \u201cvar\u201d foi usado \u201cval\u201d. Isso faz com que o \u201cresult\u201d se torne&nbsp;imut\u00e1vel. E por segundo, ao utilizar match (que \u00e9 uma express\u00e3o equivalente ao switch case)&nbsp;por padr\u00e3o ir\u00e1 retornar o valor que cair no case. Logo, reduzimos o tamanho e complexidade&nbsp;do c\u00f3digo e aumentamos a imutabilidade do programa.<\/p>\n<p>Imutabilidade \u00e9 um dos fundamentos da programa\u00e7\u00e3o funcional e uma boa pr\u00e1tica para&nbsp;orienta\u00e7\u00e3o a objeto utilizando JVM. Como regra geral, criar classes imut\u00e1veis reduz o&nbsp;n\u00famero de poss\u00edveis bugs em runtime.<\/p>\n<p>A vantagem disso \u00e9 que facilita para o programador avaliar o resultado de express\u00f5es e&nbsp;express\u00f5es concorrentes. Scala n\u00e3o \u00e9 uma linguagem totalmente funcional, ela incorpora&nbsp;elementos de OO como classes, objetos, polimorfismo. A linguagem j\u00e1 est\u00e1 na vers\u00e3o 2.11.8&nbsp;e roda em cima da JVM que por si s\u00f3 traz grandes otimiza\u00e7\u00f5es para o c\u00f3digo.<\/p>\n<p>Caso tenha se interessado, recomendo muito o livro \u201cScala in Depth\u201d, e um curso&nbsp;disponibilizado gratuitamente pelo <a href=\"https:\/\/pt.coursera.org\/learn\/progfun1\" target=\"_blank\" rel=\"noopener\">portal Coursera<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando falamos em programa\u00e7\u00e3o em geral, v\u00e1rios paradigmas costumam aparecer. Ultimamente a&nbsp;programa\u00e7\u00e3o funcional tem sido mencionada bastante em confer\u00eancias e artigos.&nbsp;O fato \u00e9 que hoje poucos desenvolvedores conhecem de fato esse paradigma. O mercado \u00e9&nbsp;focado na abordagem&nbsp;imperativa (orientada a objetos), entretanto, v\u00e1rios conceitos utilizados&nbsp;em API&#8217;s e bibliotecas que s\u00e3o escritas OO, vem da programa\u00e7\u00e3o funcional.&nbsp;Programa\u00e7\u00e3o [&hellip;]<\/p>\n","protected":false},"author":279,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1179,8],"tags":[1376],"class_list":["post-10081","post","type-post","status-publish","format-standard","hentry","category-desenvolvimento","category-tecnologia","tag-desenvolvimento"],"_links":{"self":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/users\/279"}],"replies":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/comments?post=10081"}],"version-history":[{"count":2,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10081\/revisions"}],"predecessor-version":[{"id":31299,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10081\/revisions\/31299"}],"wp:attachment":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media?parent=10081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/categories?post=10081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/tags?post=10081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}