{"id":2760,"date":"2018-06-17T23:53:59","date_gmt":"2018-06-18T02:53:59","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=2760"},"modified":"2018-06-17T23:53:59","modified_gmt":"2018-06-18T02:53:59","slug":"framework-voce-realmente-sabe-o-que-e-isto","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2760","title":{"rendered":"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto?"},"content":{"rendered":"<p>Recentemente retomei meu contato com o <a href=\"http:\/\/angular.io\">Angular<\/a>: est\u00e1 sendo uma experi\u00eancia muito enriquecedora pois a imagem negativa que tinha da ferramenta recebeu um significativo upgrade. Li uns 90% de toda a sua documenta\u00e7\u00e3o oficial (incluindo este <a href=\"https:\/\/www.manning.com\/books\/angularjs-in-action\">livro incr\u00edvel<\/a>) e o que posso dizer \u00e9: que\u00a0<strong>framework\u00a0<\/strong>maravilhoso! Mas o que \u00e9 um framework?<\/p>\n<h2>Um post atrasado no m\u00ednimo uma d\u00e9cada<\/h2>\n<p>Meu primeiro contato com o termo &#8220;framework&#8221; foi quando comecei a aprender Java. Naquela \u00e9poca (1996, 97, bem mais em 2001, 2002) muito se falava a respeito de frameworks, especialmente ap\u00f3s o lan\u00e7amento do <a href=\"http:\/\/struts.apache.org\">Struts<\/a>.\u00a0 Confesso que n\u00e3o conseguia entender direito o significado do termo, e n\u00e3o \u00e9 pra menos. Vejam o que me diziam na \u00e9poca a respeito:<\/p>\n<ul>\n<li>&#8220;Framework \u00e9 uma aplica\u00e7\u00e3o pr\u00e9-pronta&#8221;.<\/li>\n<li>&#8220;\u00c9 um conjunto de c\u00f3digos que voc\u00ea pode reaproveitar em seus projetos e que te poupa muito tempo&#8221;.<\/li>\n<li>&#8220;\u00c9 uma solu\u00e7\u00e3o pr\u00e9-pronta para problemas recorrentes&#8221;.<\/li>\n<\/ul>\n<p>Mas e uma <strong><em>&#8220;biblioteca&#8221;<\/em><\/strong>? Ela tamb\u00e9m n\u00e3o \u00e9 um conjunto de c\u00f3digos pr\u00e9-prontos que eu posso reutilizar?<\/p>\n<p>Se existem estas duas palavras:\u00a0<em>biblioteca<\/em> e\u00a0<em>framework<\/em>, seriam estas sin\u00f4nimos? Se sim, por que veio depois este termo, framework? Ser\u00e1 que eu o descobri posteriormente e que o mesmo sempre existiu (sim)?<\/p>\n<p>N\u00e3o s\u00e3o sin\u00f4nimos e hoje, ap\u00f3s trabalhar com diversos sistemas que n\u00e3o foram escritos por mim posso dizer algo com plena seguran\u00e7a:\u00a0<strong>boa parte do software que temos dificuldade em manter hoje \u00e9 mal escrito devido \u00e0 m\u00e1 compreens\u00e3o do termo &#8220;framework&#8221;.<\/strong><\/p>\n<h2>O que \u00e9 uma biblioteca?<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2763\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/biblioteca.jpg\" alt=\"\" width=\"500\" height=\"223\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/biblioteca.jpg 500w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/biblioteca-300x134.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/p>\n<p>Primeiro \u00e9 importante saber aquilo com o qual as pessoas costumam confundir o framework: a biblioteca. Esta sim \u00e9 um conjunto de c\u00f3digos reutiliz\u00e1veis que v\u00e3o se apresentar sob a forma de fun\u00e7\u00f5es, classes, m\u00f3dulos&#8230;<\/p>\n<p><strong>Seu c\u00f3digo invoca<\/strong> sua execu\u00e7\u00e3o e como consequ\u00eancia o trabalho pesado \u00e9 realizado para voc\u00ea. Vamos a alguns exemplos pr\u00e1ticos. O c\u00f3digo a seguir, escrito em Java (extra\u00eddo <a href=\"https:\/\/www.mkyong.com\/java\/how-to-compress-files-in-zip-format\/\">daqui<\/a>) usa as bibliotecas de compress\u00e3o da linguagem para gerar um arquivo zip.<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage com.mkyong.zip;\r\n\r\nimport java.io.FileInputStream;\r\nimport java.io.FileOutputStream;\r\nimport java.io.IOException;\r\nimport java.util.zip.ZipEntry;\r\nimport java.util.zip.ZipOutputStream;\r\n\r\npublic class App \r\n{\t\r\n    public static void main( String&#x5B;] args )\r\n    {\r\n    \tbyte&#x5B;] buffer = new byte&#x5B;1024];\r\n    \t\r\n    \ttry{\r\n    \t\t\r\n    \t\tFileOutputStream fos = new FileOutputStream(&quot;C:\\\\MyFile.zip&quot;);\r\n    \t\tZipOutputStream zos = new ZipOutputStream(fos);\r\n    \t\tZipEntry ze= new ZipEntry(&quot;spy.log&quot;);\r\n    \t\tzos.putNextEntry(ze);\r\n    \t\tFileInputStream in = new FileInputStream(&quot;C:\\\\spy.log&quot;);\r\n   \t   \r\n    \t\tint len;\r\n    \t\twhile ((len = in.read(buffer)) &gt; 0) {\r\n    \t\t\tzos.write(buffer, 0, len);\r\n    \t\t}\r\n\r\n    \t\tin.close();\r\n    \t\tzos.closeEntry();\r\n           \r\n    \t\t\/\/remember close it\r\n    \t\tzos.close();\r\n          \r\n    \t\tSystem.out.println(&quot;Done&quot;);\r\n\r\n    \t}catch(IOException ex){\r\n    \t   ex.printStackTrace();\r\n    \t}\r\n    }\r\n}\r\n<\/pre>\n<p><em>FileOutputStream, ZipOutputStream, ZipEntry, FIleInputStream<\/em> s\u00e3o classes disponibilizadas pela\u00a0<strong>biblioteca padr\u00e3o do Java SE<\/strong>. Observe algo interessante: eu simplesmente as importo e, na sequ\u00eancia,\u00a0<strong>meu c\u00f3digo define quando estas ser\u00e3o executadas e como<\/strong>.<\/p>\n<p>\u00c9 poss\u00edvel criar novas sub-classes baseadas nestas que acabei de mencionar, entretanto alguns aspectos se mant\u00e9m:<\/p>\n<ul>\n<li>Estou usando c\u00f3digo pr\u00e9-existente que n\u00e3o foi escrito por mim.<\/li>\n<li>Meu c\u00f3digo est\u00e1 definindo quando usarei estas classes\/fun\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>Outro exemplo bem simples podemos ver no c\u00f3digo C escrito a seguir:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#include &lt;stdio.h&gt;\r\n\r\nint main(void) {\r\n  printf(&quot;Aqui de buenas usando a fun\u00e7\u00e3o printf&quot;);\r\n  return 0;\r\n}\r\n\r\n<\/pre>\n<p>Agora ao inv\u00e9s de classes estou importando a biblioteca de I\/O cl\u00e1ssica da linguagem C e, na sequ\u00eancia, reaproveito a fun\u00e7\u00e3o <strong>printf<\/strong>, disponibilizada por esta. E novamente o fluxo do meu programa \u00e9 definido inteiramente por mim:\u00a0<em>imprima este texto in\u00fatil e na sequ\u00eancia retorne 0<\/em>.<\/p>\n<blockquote><p>Ent\u00e3o vamos \u00e0 defini\u00e7\u00e3o Kiconiana de uma biblioteca:\u00a0<em>c\u00f3digo escrito por terceiros focando o reuso e cuja ordem de execu\u00e7\u00e3o \u00e9 definida inteiramente por voc\u00ea.<\/em><\/p><\/blockquote>\n<h2>E o framework, o que \u00e9?<\/h2>\n<p>\u00c9 uma aplica\u00e7\u00e3o semi pronta? Sim, mas esta \u00e9 uma defini\u00e7\u00e3o muito vazia (bibliotecas tamb\u00e9m podem ser consideradas como tal). \u00c9 um conjunto de c\u00f3digo que posso reaproveitar? \u00d3bvio, mas tamb\u00e9m \u00e9 uma descri\u00e7\u00e3o incompleta e ainda gera confus\u00e3o em rela\u00e7\u00e3o ao termo\u00a0<em>biblioteca<\/em>. \u00c9 uma solu\u00e7\u00e3o para um problema recorrente? Tamb\u00e9m. <strong>Ent\u00e3o, qual a diferen\u00e7a?<\/strong><\/p>\n<p>O significado fica mais claro quando pensamos na tradu\u00e7\u00e3o do termo para o portugu\u00eas: <em>framework <\/em>pode ser traduzido como\u00a0<em>moldura<\/em>,\u00a0<em>arma\u00e7\u00e3o<\/em>. Imagens surgem em minha mente:<\/p>\n<figure id=\"attachment_2767\" aria-describedby=\"caption-attachment-2767\" style=\"width: 600px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2767\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/moldura.jpg\" alt=\"\" width=\"600\" height=\"600\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/moldura.jpg 600w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/moldura-150x150.jpg 150w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/moldura-300x300.jpg 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><figcaption id=\"caption-attachment-2767\" class=\"wp-caption-text\">isto \u00e9 uma moldura<\/figcaption><\/figure>\n<figure id=\"attachment_2768\" aria-describedby=\"caption-attachment-2768\" style=\"width: 608px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2768\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/vigamento.jpeg\" alt=\"\" width=\"608\" height=\"420\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/vigamento.jpeg 608w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/vigamento-300x207.jpeg 300w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/><figcaption id=\"caption-attachment-2768\" class=\"wp-caption-text\">Isto \u00e9 um vigamento, que tamb\u00e9m \u00e9 chamado de arma\u00e7\u00e3o<\/figcaption><\/figure>\n<figure id=\"attachment_2769\" aria-describedby=\"caption-attachment-2769\" style=\"width: 292px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2769\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/armacao.jpeg\" alt=\"\" width=\"292\" height=\"292\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/armacao.jpeg 292w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/armacao-150x150.jpeg 150w\" sizes=\"(max-width: 292px) 100vw, 292px\" \/><figcaption id=\"caption-attachment-2769\" class=\"wp-caption-text\">e esta \u00e9 uma arma\u00e7\u00e3o de \u00f3culos<\/figcaption><\/figure>\n<p>Arma\u00e7\u00e3o, vigamento e moldura: o que tem em comum? Me lembro de ficar um bom tempo me questionando a respeito.\u00a0<em>Framework: por que este termo? O que isto tem a ver com moldura???<\/em><\/p>\n<p>A moldura existe para suportar a gravura\/imagem, o vigamento para que as telhas ou piso possam ser inclu\u00eddos acima de si e a arma\u00e7\u00e3o dos \u00f3culos fornece a estrutura necess\u00e1ria para que as lentes possam estar bem posicionadas em rela\u00e7\u00e3o \u00e0 nossa face. E o framework?<\/p>\n<p>Enquanto no caso da biblioteca o ciclo de vida do nosso c\u00f3digo \u00e9 de nossa responsabilidade, ao lidamos com o framework o contr\u00e1rio ocorre: n\u00f3s fornecemos a gravura para a moldura, o piso para o vigamento e as lentes para a arma\u00e7\u00e3o.<\/p>\n<p>N\u00e3o somos n\u00f3s que definimos\u00a0<strong>quando<\/strong> nosso c\u00f3digo executa: quem define isto \u00e9 o framework. Se voc\u00ea j\u00e1 trabalhou com Spring ou Angular talvez isto lhe soe familiar. L\u00e1 vai: frameworks nada mais s\u00e3o que a aplica\u00e7\u00e3o mais b\u00e1sica do conceito de\u00a0<a href=\"https:\/\/pt.wikipedia.org\/wiki\/Invers%C3%A3o_de_controle\"><em>invers\u00e3o de controle<\/em><\/a>.\u00a0 A prop\u00f3sito, o Martin Fowler tem <a href=\"https:\/\/www.martinfowler.com\/bliki\/InversionOfControl.html\">um texto<\/a> muito bom sobre isto.<\/p>\n<p>Vamos a um exemplo bem simples baseado em Angular? Imagine que eu queira escrever um componente: ent\u00e3o escrevo algo similar ao c\u00f3digo a seguir usando TypeScript:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\n@Component({\r\n  selector: 'login',\r\n  templateUrl: '.\/login.component.html',\r\n  styleUrls: &#x5B;'.\/login.component.css']\r\n})\r\nexport class LoginComponent implements OnInit {\r\n\r\n  credentials: Credentials;\r\n\r\n  constructor(private usuarioService: UsuarioService) { \r\n    this.credentials = new Credentials(null,null);\r\n  }\r\n\r\n  ngOnInit() {\r\n  }\r\n\r\n  entrar() {\r\n    this.usuarioService.auth(this.credentials);\r\n  }\r\n\r\n}\r\n\r\n<\/pre>\n<p>Aquela fun\u00e7\u00e3o ali,\u00a0<em>ngOnInit<\/em>, n\u00e3o sou eu quem a invoco: \u00e9 o Angular. Repare: apenas forne\u00e7o os m\u00fasculos para este esqueleto. Eu sei que aquele m\u00e9todo ser\u00e1 invocado, mas n\u00e3o por mim. Em momento algum escrevo c\u00f3digo como o exemplo a seguir:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nusuarioService = new UsuarioService();\r\nlogin = new LoginComponent(usuarioService);\r\nlogin.ngOnInit();\r\n<\/pre>\n<p>O c\u00f3digo acima \u00e9 aquele que tipicamente escrevemos ao lidar com bibliotecas. Mas o que ganhamos com esta delega\u00e7\u00e3o? Ser\u00e1 que minha fun\u00e7\u00e3o realmente ser\u00e1 chamada?<\/p>\n<p>Lembra quando mencionei que sim, frameworks s\u00e3o solu\u00e7\u00f5es para problemas que ocorrem com frequ\u00eancia e que tamb\u00e9m s\u00e3o aplica\u00e7\u00f5es pr\u00e9-prontas, mas que v\u00e3o al\u00e9m? Pois bem: o problema que todo framework resolve \u00e9 essencialmente o ciclo de vida do nosso c\u00f3digo.<\/p>\n<p>Autores de frameworks se preocupam com a vida de nossos objetos\/fun\u00e7\u00f5es: quando devem ser criados, usados e destru\u00eddos. E isto de uma forma \u00f3tima, garantindo que nosso trabalho consista apenas em fornecer o conte\u00fado necess\u00e1rio para que nossas\u00a0<strong>necessidades de neg\u00f3cio\u00a0<\/strong>sejam atendidas.<\/p>\n<p>Vamos a mais um exemplo: desta vez usando a API Servlet do Java. Um Servlet pode ter diversas formas, a mais comum \u00e9 o HTTP que tem como objetivo receber requisi\u00e7\u00f5es pelo protocolo (HTTP), executar nossas regras e, finalmente, retornar conte\u00fado ao usu\u00e1rio final da aplica\u00e7\u00e3o. Vamos implementar um servlet?<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage br.com.kicosoft;\r\n\r\nimport java.io.IOException;\r\nimport java.io.PrintWriter;\r\nimport javax.servlet.http.HttpServlet;\r\nimport javax.servlet.http.HttpServletRequest;\r\nimport javax.servlet.http.HttpServletResponse;\r\n\r\npublic class ServletDemo1 extends HttpServlet{\r\n\t\r\n\tpublic void doGet(HttpServletRequest request, HttpServletResponse response)\r\n\tthrows IOException{\r\n\t\tPrintWriter out = response.getWriter();\r\n\t\tout.println(&quot;&lt;html&gt;&quot;);\r\n\t\tout.println(&quot;&lt;body&gt;&quot;);\r\n\t\tout.println(&quot;\r\n&lt;h1&gt;Sou um servlet feliz!&lt;\/h1&gt;\r\n\r\n&quot;);\r\n\t\tout.println(&quot;&lt;\/body&gt;&quot;);\r\n\t\tout.println(&quot;&lt;\/html&gt;&quot;);\t\r\n\t}\r\n}\r\n\r\n<\/pre>\n<p>Primeiro eu escrevo a minha classe, que extender\u00e1 uma outra chamada HttpServlet. Meu papel consiste apenas em sobrescrever os m\u00e9todos HTTP que me interessam, no caso,\u00a0<em>doGet<\/em>, que corresponde ao m\u00e9todo GET do protocolo. Minha fun\u00e7\u00e3o define o que dever\u00e1 ser retornado ao usu\u00e1rio: o conte\u00fado HTML que voc\u00ea v\u00ea em meu c\u00f3digo.<\/p>\n<p>Repare na riqueza: n\u00e3o preciso me preocupar em implementar o protocolo HTTP, ou mesmo um algoritmo de espera (ocupada ou n\u00e3o) de requisi\u00e7\u00f5es que chegam ao meu servidor. Apenas\u00a0<strong>forne\u00e7o ao meu framework<em>\u00a0<\/em>o c\u00f3digo que desejo ser executado.<\/strong><\/p>\n<blockquote><p>Ent\u00e3o, como posso definir um framework \u00e0 moda Kiconiana? \u00c9 o maestro respons\u00e1vel por orquestrar seu c\u00f3digo visando resolver um ou mais problemas espec\u00edficos .<\/p><\/blockquote>\n<p>O problema espec\u00edfico pode ser a constru\u00e7\u00e3o de uma aplica\u00e7\u00e3o web, uma integra\u00e7\u00e3o (pense em Apache Camel implementando os Enterprise Integration Patterns), um jogo (pense em um engine como o Unity). Seu papel \u00e9 portanto apenas fornecer o c\u00f3digo que ser\u00e1 executado pelo framework. O que nos leva \u00e0 grande quest\u00e3o.<\/p>\n<h2>Frameworks s\u00e3o burocr\u00e1ticos<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2775\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/burocracia.jpeg\" alt=\"\" width=\"800\" height=\"465\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/burocracia.jpeg 800w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/burocracia-300x174.jpeg 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/burocracia-768x446.jpeg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Lembra no in\u00edcio deste post quando disse que boa parte do c\u00f3digo mal escrito que vemos hoje tem como principal problema o fato de haver uma m\u00e1 compreens\u00e3o a respeito do termo &#8220;framework&#8221;? O problema nasce quando ignora-se este fato: frameworks s\u00e3o burocr\u00e1ticos.<\/p>\n<p>O termo burocracia tem uma conota\u00e7\u00e3o bastante negativa mas \u00e9 um fato necess\u00e1rio para que haja ordem, para que se consiga <strong>formalizar a identifica\u00e7\u00e3o de elementos<\/strong>.<\/p>\n<p>(Sabia que a escrita nasce de uma necessidade burocr\u00e1tica? Dica: pesquise sobre a origem da escrita cuneiforme e os sum\u00e9rios.<\/p>\n<p>Lembre: burocracia \u00e9 uma coisa, burrocracia, outra.)<\/p>\n<figure id=\"attachment_2776\" aria-describedby=\"caption-attachment-2776\" style=\"width: 450px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2776\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/cuneiforme.jpeg\" alt=\"\" width=\"450\" height=\"302\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/cuneiforme.jpeg 450w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/cuneiforme-300x201.jpeg 300w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><figcaption id=\"caption-attachment-2776\" class=\"wp-caption-text\">A literatura nasce de um hacking da burocracia. Pense nisto!<\/figcaption><\/figure>\n<p>Imagine que voc\u00ea ir\u00e1 escrever um framework: seu papel \u00e9 orquestrar a execu\u00e7\u00e3o de c\u00f3digo de terceiros, certo? Como voc\u00ea o identifica este c\u00f3digo e o papel a ser desempenhado por este? Alguma formaliza\u00e7\u00e3o precisa ser posta em pr\u00e1tica, o que ocorrer\u00e1 atrav\u00e9s da defini\u00e7\u00e3o de padr\u00f5es, tais como:<\/p>\n<ul>\n<li>Presen\u00e7a de arquivos de configura\u00e7\u00e3o que identifique os artefatos. Lembra do XML no Java ou Spring?<\/li>\n<li>Inclus\u00e3o de anota\u00e7\u00f5es em nosso c\u00f3digo. Olha ali o meu exemplo usando Angular e a anota\u00e7\u00e3o @Component.<\/li>\n<li>A implementa\u00e7\u00e3o de uma interface ou extens\u00e3o de classes (lembra do meu Servlet?).<\/li>\n<li>Padroniza\u00e7\u00f5es no c\u00f3digo como, por exemplo, a defini\u00e7\u00e3o de nomes padr\u00e3o para eventos de ciclo de vida dos objetos (j\u00e1 viu <a href=\"http:\/\/tapestry.apache.org\">Tapestry<\/a>?).<\/li>\n<li>Qualquer outro dispositivo que sirva para marcar o papel desempenhado pelo c\u00f3digo a ser orquestrado.<\/li>\n<\/ul>\n<p>O principal problema que encontro em c\u00f3digo legado \u00e9 justamente este: quem o evoluiu n\u00e3o se esfor\u00e7ou o suficiente para conhecer o framework adotado na escrita do projeto. E ainda pior: usou esta &#8220;moldura&#8221; como se fosse uma biblioteca, desrespeitando completamente o ciclo de vida proposto por esta.<\/p>\n<p>Sabe aquele sujeito que sempre &#8220;d\u00e1 um jeitinho&#8221; na burocracia cortando caminho? \u00c9 o programador que usa o framework como biblioteca e ferra a gente no futuro.<\/p>\n<h2>Frameworks s\u00e3o limitados<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2777\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/limites.png\" alt=\"\" width=\"400\" height=\"266\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/limites.png 400w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/limites-300x200.png 300w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Assim como o termo\u00a0<em>burocracia<\/em>, a palavra\u00a0<em>limitada<\/em> tamb\u00e9m tem uma conota\u00e7\u00e3o negativa em nossa sociedade, mas infelizmente \u00e9 verdade: frameworks s\u00e3o limitados (e tem de ser). Aqui nasce outro problema que encontro em muito c\u00f3digo legado.<\/p>\n<p>Lembra que na defini\u00e7\u00e3o Kiconiana menciono o fato do framework\u00a0<em>visar resolver um ou mais problemas espec\u00edficos?<\/em> Pois \u00e9: meu framework web favorito \u00e9 o <a href=\"http:\/\/grails.org\">Grails<\/a>, mas n\u00e3o o uso para implementar integra\u00e7\u00f5es.<\/p>\n<p>Apesar de 90% do c\u00f3digo que vejo ser escrito hoje visar resolver o problema da constru\u00e7\u00e3o de aplica\u00e7\u00f5es web (ou web services, micro-servi\u00e7os), este n\u00e3o \u00e9 o \u00fanico problema computacional a ser resolvido.<\/p>\n<p>Talvez voc\u00ea precise escrever uma automa\u00e7\u00e3o residencial (<a href=\"https:\/\/developer.apple.com\/homekit\/\">HomeKit<\/a> da Apple), ou quem sabe uma integra\u00e7\u00e3o (<a href=\"http:\/\/camel.apache.org\">Apache Camel<\/a>), talvez seja a implementa\u00e7\u00e3o de um jogo de tiro em primeira pessoa (<a href=\"https:\/\/www.cryengine.com\/\">Cry Engine<\/a>). Posso ficar um bom tempo aqui com exemplos.<\/p>\n<p>O importante \u00e9: muitos dos problemas que encontro s\u00e3o resultantes da m\u00e1 escolha do framework para aplica\u00e7\u00f5es distintas do seu prop\u00f3sito original. Isto deve ser levado em considera\u00e7\u00e3o. Nem tudo \u00e9 uma aplica\u00e7\u00e3o web, e desconfio de gente que diz ser capaz de resolver qualquer problema usando um \u00fanico framework.<\/p>\n<p>O que a arma\u00e7\u00e3o, a moldura e o vigamento tem em comum? Eles <strong>limitam<\/strong> a forma do que ir\u00e3o orquestrar.<\/p>\n<h2>Concluindo<\/h2>\n<p>Estudando o Angular (6) fiquei maravilhado com o modo como ele organiza meu c\u00f3digo fonte e orquestra a sua execu\u00e7\u00e3o, o que me fez voltar ao conceito de framework e, na sequ\u00eancia, finalmente liberar este post.<\/p>\n<p>Resumindo, digo que voc\u00ea deve evitar as seguintes armadilhas ao escrever seu c\u00f3digo:<\/p>\n<ul>\n<li>Saber se precisa realmente de um framework ou de uma biblioteca (em 95% das vezes usar\u00e1 os dois no mesmo projeto).<\/li>\n<li>Saber como usar uma biblioteca e, principalmente, um framework.<\/li>\n<li>Buscar entender as formaliza\u00e7\u00f5es definidas pelos autores do seu framework (poder\u00edamos falar o mesmo a respeito de bibliotecas: pense em OpenGL).<\/li>\n<li>Entender para qual fim o framework foi escrito e us\u00e1-lo apenas para este fim.<\/li>\n<li>Resumindo o resumo: voc\u00ea deve respeitar o framework.<\/li>\n<\/ul>\n<p>Infelizmente (ou felizmente?) n\u00e3o se discute com tanta \u00eanfase hoje o significado dos termos biblioteca e framework. Talvez pelo fato de terem se tornado ub\u00edquos para n\u00f3s com o passar do tempo, o que mostra termos evolu\u00eddo (e muito) de l\u00e1 pra c\u00e1.<\/p>\n<p>Mais uma vez o <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Ludwig_Wittgenstein\">Wittgenstein<\/a> estava certo: a maior parte dos problemas surge da m\u00e1 compreens\u00e3o da linguagem.<\/p>\n<figure id=\"attachment_1821\" aria-describedby=\"caption-attachment-1821\" style=\"width: 561px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1821\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/05\/wittgenstein.jpg\" alt=\"\" width=\"561\" height=\"319\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/05\/wittgenstein.jpg 561w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/05\/wittgenstein-300x170.jpg 300w\" sizes=\"(max-width: 561px) 100vw, 561px\" \/><figcaption id=\"caption-attachment-1821\" class=\"wp-caption-text\">Ludwig Wittgenstein &#8211; 1889 &#8211; 1951<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Boa parte do c\u00f3digo que temos dificuldade em manter hoje tem como ra\u00edz dos seus problemas o fato de terem ignorado o real significado do termo &#8220;framework&#8221;?<\/p>\n","protected":false},"author":1,"featured_media":2761,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[35,34],"tags":[],"class_list":["post-2760","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-armadilhas","category-paideia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto? - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2760\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto? - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Boa parte do c\u00f3digo que temos dificuldade em manter hoje tem como ra\u00edz dos seus problemas o fato de terem ignorado o real significado do termo &quot;framework&quot;?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2760\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-18T02:53:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2760\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2760\",\"name\":\"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto? - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2760#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2760#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg\",\"datePublished\":\"2018-06-18T02:53:59+00:00\",\"dateModified\":\"2018-06-18T02:53:59+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2760#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2760\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2760#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg\",\"width\":800,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2760#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto? - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2760","og_locale":"pt_BR","og_type":"article","og_title":"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto? - \/dev\/Kico","og_description":"Boa parte do c\u00f3digo que temos dificuldade em manter hoje tem como ra\u00edz dos seus problemas o fato de terem ignorado o real significado do termo \"framework\"?","og_url":"https:\/\/devkico.itexto.com.br\/?p=2760","og_site_name":"\/dev\/Kico","article_published_time":"2018-06-18T02:53:59+00:00","og_image":[{"width":800,"height":600,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg","type":"image\/jpeg"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2760","url":"https:\/\/devkico.itexto.com.br\/?p=2760","name":"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto? - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2760#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2760#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg","datePublished":"2018-06-18T02:53:59+00:00","dateModified":"2018-06-18T02:53:59+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2760#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2760"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2760#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg","width":800,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2760#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Framework: voc\u00ea REALMENTE sabe o que \u00e9 isto?"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2018\/06\/framework.jpg","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2760"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2760"}],"version-history":[{"count":11,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2760\/revisions"}],"predecessor-version":[{"id":2779,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2760\/revisions\/2779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/2761"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2760"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}