{"id":1600,"date":"2012-02-24T06:01:14","date_gmt":"2012-02-24T13:01:14","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/?p=1600"},"modified":"2012-02-24T09:33:03","modified_gmt":"2012-02-24T16:33:03","slug":"desenvolver-em-java-em-pleno-2012-mesmos-erros-de-2005","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2012\/02\/24\/desenvolver-em-java-em-pleno-2012-mesmos-erros-de-2005\/","title":{"rendered":"Desenvolver em Java em pleno 2012, mesmos erros de 2005"},"content":{"rendered":"<p><script type=\"text\/javascript\"> function get_style1600 () { return \"none\"; } function end1600_ () { document.getElementById('wqd1600').style.display = get_style1600(); } <\/script>Post j\u00e1 nasce datado, mas s\u00f3 faz sentido para agora mesmo. Passei uns 10 anos da minha vida programando na linguagem Java e nos \u00faltimos 3 anos eu peguei poucos projetos, mas o que me impressiona nesses poucos projetos \u00e9 que as coisas n\u00e3o mudam, inclusive a tara por patterns desnecess\u00e1rios e antipatterns.<\/p>\n<h2>Comecemos por Nomenclatura<\/h2>\n<p>Se voce chama sua classes de WhateverController, WhateverService e ou WhateverDAO, voce est\u00e1 usando <a href=\"http:\/\/www.milfont.org\/tech\/2008\/01\/21\/nao-use-notacao-estranha\/\">nota\u00e7\u00e3o hungara<\/a> desnecess\u00e1ria e complicando a modelagem do seu neg\u00f3cio. Se o seu framework te obriga a nomear as classes com sufixos ou prefixos, ele est\u00e1 errado e \u00e9 melhor procurar uma solu\u00e7\u00e3o.<\/p>\n<p>Se voce chama classes como\u00a0WhateverModel ou\u00a0WhateverEntity a\u00ed voce est\u00e1 estragando a amizade, se mate.<\/p>\n<p>Se voce tem uma classe chamada Whatever e tem propriedades como nameWhatever, leia urgente <a href=\"http:\/\/www.amazon.com\/gp\/product\/0132350882\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0132350882\">Clean Code<\/a>.<\/p>\n<p><a href=\"http:\/\/www.amazon.com\/gp\/product\/0132350882\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0132350882\"><img decoding=\"async\" src=\"http:\/\/ws.assoc-amazon.com\/widgets\/q?_encoding=UTF8&amp;Format=_SL110_&amp;ASIN=0132350882&amp;MarketPlace=US&amp;ID=AsinImage&amp;WS=1&amp;tag=milftech-20&amp;ServiceVersion=20070822\" alt=\"\" border=\"0\" \/><\/a><img decoding=\"async\" loading=\"lazy\" style=\"border: none !important; margin: 0px !important;\" src=\"http:\/\/www.assoc-amazon.com\/e\/ir?t=milftech-20&amp;l=as2&amp;o=1&amp;a=0132350882\" alt=\"\" width=\"1\" height=\"1\" border=\"0\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>BOLOVO<\/h2>\n<p>As pessoas criavam entidades chamadas\u00a0WhateverManager por n\u00e3o saberem orienta\u00e7\u00e3o a objetos, se existe isso no seu projeto na maioria das vezes n\u00e3o tem muito o que fazer, mude de emprego ou de projeto. Mas&#8230; se for corajoso comece a refatorar isso guiado por testes, o livro &#8220;<a href=\"http:\/\/www.amazon.com\/gp\/product\/0321503627\/ref=as_li_ss_tl?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321503627\">Growing Object-Oriented Software, Guided by Tests<\/a>&#8221; vai te ajudar bastante. O Paulo Silveira e o Phillip Cal\u00e7ado nomearam esse anti-pattern de <a href=\"http:\/\/blog.fragmental.com.br\/2010\/01\/18\/domain-driven-bolovo-passando-conhecimento-e-etc\/\">BOLOVO<\/a>.<\/p>\n<p><a href=\"http:\/\/www.amazon.com\/gp\/product\/0321503627\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321503627\"><img decoding=\"async\" src=\"http:\/\/ws.assoc-amazon.com\/widgets\/q?_encoding=UTF8&amp;Format=_SL110_&amp;ASIN=0321503627&amp;MarketPlace=US&amp;ID=AsinImage&amp;WS=1&amp;tag=milftech-20&amp;ServiceVersion=20070822\" alt=\"\" border=\"0\" \/><\/a><img decoding=\"async\" loading=\"lazy\" style=\"border: none !important; margin: 0px !important;\" src=\"http:\/\/www.assoc-amazon.com\/e\/ir?t=milftech-20&amp;l=as2&amp;o=1&amp;a=0321503627\" alt=\"\" width=\"1\" height=\"1\" border=\"0\" \/><\/p>\n<h2>DAO<\/h2>\n<p>DAO \u00e9 o pattern in\u00fatil quando falamos de neg\u00f3cios, principalmente CRUD. A n\u00e3o ser que voc\u00ea esteja codando Framework ou comittando em projetos como o Hibernate, voce n\u00e3o precisa escrever DAO. Voce usa Hibernate, a Session \u00e9 seu DAO.<\/p>\n<p>Se voce precisa de uma entidade para agrupar alguma l\u00f3gica de ORM mais complexa no seu neg\u00f3cio &#8211; como algumas transa\u00e7\u00f5es com rollback l\u00f3gicos, uma alternativa \u00e9 <a href=\"http:\/\/martinfowler.com\/eaaCatalog\/repository.html\">Repository<\/a>. Mas por favor, leia o <a href=\"http:\/\/philcalcado.com\/2010\/12\/23\/how-to-write-a-repository\/\">artigo do Phillip<\/a> primeiro e n\u00e3o fa\u00e7a WhateverRepository. N\u00e3o h\u00e1 problema nenhum voce ter Criteria dentro de um controller por exemplo, afinal isso <a href=\"http:\/\/martinfowler.com\/eaaCatalog\/queryObject.html\">\u00e9 um pattern<\/a> bem estabelecido e o mapeamento um-pra-um com outra entidade s\u00f3 vai complicar e n\u00e3o traz ganho algum.<\/p>\n<p>S\u00f3 uma dica aproveitando o tema ORM, o Hibernate trabalha e sempre trabalhou com conven\u00e7\u00f5es usando anota\u00e7\u00f5es, ent\u00e3o n\u00e3o precisa mapear tudo. Basta um @Entity na maioria das vezes. Nos relacionamentos observe se ele j\u00e1 n\u00e3o mapeia tranquilo apenas com o @ManyToOne e diminua o ru\u00eddo.<\/p>\n<p>Em termos de Patterns, por mais caduco que j\u00e1 esteja, o <a href=\"http:\/\/www.amazon.com\/gp\/product\/0321127420\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321127420\">PoEAA do Fowler<\/a> ainda reina.<\/p>\n<p><a href=\"http:\/\/www.amazon.com\/gp\/product\/0321127420\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321127420\"><img decoding=\"async\" src=\"http:\/\/ws.assoc-amazon.com\/widgets\/q?_encoding=UTF8&amp;Format=_SL110_&amp;ASIN=0321127420&amp;MarketPlace=US&amp;ID=AsinImage&amp;WS=1&amp;tag=milftech-20&amp;ServiceVersion=20070822\" alt=\"\" border=\"0\" \/><\/a><img decoding=\"async\" loading=\"lazy\" style=\"border: none !important; margin: 0px !important;\" src=\"http:\/\/www.assoc-amazon.com\/e\/ir?t=milftech-20&amp;l=as2&amp;o=1&amp;a=0321127420\" alt=\"\" width=\"1\" height=\"1\" border=\"0\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Interface e Implementa\u00e7\u00e3o<\/h2>\n<p>Existe uma boa pr\u00e1tica como guia que \u00e9 desenvolver orientado a interface, s\u00f3 que isso n\u00e3o \u00e9 lei e deve ser usado o bom senso como sempre. A maioria dos desenvolvedores criam a Interface Whatever e uma &#8211; e apenas uma &#8211; implementa\u00e7\u00e3o WhateverImpl. Isso \u00e9 desnecess\u00e1rio e muita gente nem sabe que o Spring sempre funcionou injetar em classes concretas e n\u00e3o apenas em Interface. Deixe a Interface gritar na sua cara para refatorar.<\/p>\n<h2>Service e Domain Driven Design<\/h2>\n<p>Aqui que mora o perigo, sempre quando eu vejo WhateverService a implementa\u00e7\u00e3o dessa classe \u00e9 o mesmo c\u00f3digo do antigo WhateverManager. Depois que <a href=\"http:\/\/www.amazon.com\/gp\/product\/0321125215\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321125215\">Domain Driven Design<\/a> fez sucesso todo mundo finje que modela o dom\u00ednio.<\/p>\n<p><a href=\"http:\/\/www.amazon.com\/gp\/product\/0321125215\/ref=as_li_ss_il?ie=UTF8&amp;tag=milftech-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321125215\"><img decoding=\"async\" src=\"http:\/\/ws.assoc-amazon.com\/widgets\/q?_encoding=UTF8&amp;Format=_SL110_&amp;ASIN=0321125215&amp;MarketPlace=US&amp;ID=AsinImage&amp;WS=1&amp;tag=milftech-20&amp;ServiceVersion=20070822\" alt=\"\" border=\"0\" \/><\/a><img decoding=\"async\" loading=\"lazy\" style=\"border: none !important; margin: 0px !important;\" src=\"http:\/\/www.assoc-amazon.com\/e\/ir?t=milftech-20&amp;l=as2&amp;o=1&amp;a=0321125215\" alt=\"\" width=\"1\" height=\"1\" border=\"0\" \/><\/p>\n<p>As classes do seu dom\u00ednio devem e podem ter m\u00e9todos de neg\u00f3cios, se ela apenas tem propriedades \u00e9 sinal do BOLOVO e representa uma tabela do banco de dados vitaminada. Um Service n\u00e3o \u00e9 a parte de neg\u00f3cios do seu domain, a grosso modo de explicar o c\u00f3digo dele explodiu na sua cara por manipular duas ou mais entidades e n\u00e3o ser responsabilidade de nenhuma delas.<\/p>\n<h2>ANUNCIO EM LETRAS GARRAFAIS<\/h2>\n<p>Cuidado com os livros que eu indiquei, quando foram escritos o Hibernate e o Spring estavam nascendo ou ainda n\u00e3o tinham nascidos, portanto leia com modera\u00e7\u00e3o. V\u00e1rias coisas j\u00e1 forma implementadas pelos Frameworks e n\u00e3o v\u00e1 fazer uma roda por cima de outra roda.<\/p>\n<h2>TL;DR<\/h2>\n<p>Cuidado com o c\u00f3digo que voce escreve, fa\u00e7a-o guiado por testes, leia bons livros de Orienta\u00e7\u00e3o a objetos e Patterns. N\u00e3o escreva c\u00f3digo igual aos outros porque \u00e9 assim que todo mundo faz.<\/p>\n<p id=\"wqd1600\">Typically chemist&#8217;s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra manufacturer coupon<\/a>&#8220;. Maybe &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra discount coupons<\/a>&#8221; is a extremely complicated problem. Matters, like &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">coupons for viagra<\/a>&#8220;, are united numerous types of health problems. If you need to take recipe medications, ask your pharmacist to check your testosterone levels before. Sometimes the treatment options may include erectile dysfunction remedies or a suction device that helps get an hard-on. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a recipe is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies. <\/p>\n<p><script type=\"text\/javascript\"> end1600_(); <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Post j\u00e1 nasce datado, mas s\u00f3 faz sentido para agora mesmo. Passei uns 10 anos da minha vida programando na linguagem Java e nos \u00faltimos 3 anos eu peguei poucos projetos, mas o que me impressiona nesses poucos projetos \u00e9 que as coisas n\u00e3o mudam, inclusive a tara por patterns desnecess\u00e1rios e antipatterns. Comecemos por [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,11,3,311,38,27,39],"tags":[367,68,361,414],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1600"}],"collection":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/comments?post=1600"}],"version-history":[{"count":7,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1600\/revisions"}],"predecessor-version":[{"id":1603,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/1600\/revisions\/1603"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=1600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=1600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=1600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}