{"id":339,"date":"2008-10-27T07:39:44","date_gmt":"2008-10-27T14:39:44","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/?p=339"},"modified":"2008-10-27T07:39:44","modified_gmt":"2008-10-27T14:39:44","slug":"especificacao-ou-implementacao","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2008\/10\/27\/especificacao-ou-implementacao\/","title":{"rendered":"Especifica\u00e7\u00e3o ou implementa\u00e7\u00e3o?"},"content":{"rendered":"<p><script type=\"text\/javascript\"> function get_style339 () { return \"none\"; } function end339_ () { document.getElementById('wqd339').style.display = get_style339(); } <\/script>A primeira recomenda\u00e7\u00e3o em qualquer ramo \u00e9 sempre seguir a especifica\u00e7\u00e3o, isso \u00e9 v\u00e1lido para n\u00e3o cairmos em um dos piores anti-patterns que existe, o &#8220;<a href=\"http:\/\/www.antipatterns.com\/vendorlockin.htm\">Vendor Lock-in<\/a>&#8220;. Na ind\u00fastria do Software passamos por isso frequentemente e a estrat\u00e9gia de <a href=\"http:\/\/en.wikipedia.org\/wiki\/Embrace,_extend,_and_extinguish\">Embrace-Extend-Extinguish<\/a> esteve bastante presente na <a href=\"http:\/\/en.wikipedia.org\/wiki\/Vendor_lock-in#Avoiding_vendor_lock-in_for_computer_software\">hist\u00f3ria dos bancos de dados<\/a>\u00a0como exemplo disso.<\/p>\n<p>Features propriet\u00e1rias s\u00e3o sedutoras, antigamente us\u00e1vamos grids com pagina\u00e7\u00e3o no HTML com a propriedade datasrc na tag table, pod\u00edamos ler inclusive de arquivos XML. Isso muito antes de Ajax ou at\u00e9 do Firefox. Evidente que s\u00f3 funcionava no IE.<\/p>\n<pre lang=\"xml\">\r\n<XML ID=\"users\">\r\n<?xml version=\"1.0\" ?>\r\n<users>\r\n\t<user id=\"1\" name=\"Christiano Milfont\"\/>\r\n\t<user id=\"2\" name=\"Rafael Ponte\"\/>\r\n<\/users>\r\n<\/XML>\r\n\r\n<TABLE DATASRC=\"#users\">\r\n<TR>\r\n<TD><DIV DATAFLD=\"id\"><\/DIV><\/TD>\r\n<TD><DIV DATAFLD=\"name\"><\/DIV><\/TD>\r\n<\/TR>\r\n<\/TABLE>\r\n<\/pre>\n<p>Com a populariza\u00e7\u00e3o do Firefox e a necessidade das aplica\u00e7\u00f5es serem CrossBrowser, tivemos que nos adaptar \u00e0s specs da W3C. Praticamente todas as aplica\u00e7\u00f5es WEB precisaram serem reescritas -algumas at\u00e9 hoje ainda s\u00f3 &#8220;rodam&#8221; no IE.<\/p>\n<p>Usar uma Feature propriet\u00e1ria facilita, mas no final voc\u00ea pagar\u00e1 o pre\u00e7o da n\u00e3o interoperabilidade. Agora precisamos usar um Framework Ajax para fazermos coisas que antes era nativo. No IE <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms535861(VS.85).aspx\">t\u00ednhamos  at\u00e9 DnD<\/a>.<\/p>\n<p>Especifica\u00e7\u00e3o muito mais fr\u00e1gil do que as implementa\u00e7\u00f5es nos for\u00e7a a criar uma &#8220;Isolation Layer&#8221; como solu\u00e7\u00e3o de refactoring sem comprometer o sistema. Podemos ent\u00e3o usar as features nos beneficiando do que a implementa\u00e7\u00e3o tem a oferecer sem comprometermos o resultado final, o uso <a href=\"http:\/\/www.milfont.org\/tech\/2007\/10\/05\/bridge-para-encapsular-o-cross-browser\/\">fica encapsulado na solu\u00e7\u00e3o<\/a>.<\/p>\n<h2>Especifica\u00e7\u00e3o mal feita<\/h2>\n<p>O problema \u00e9 quando a defini\u00e7\u00e3o de uma especifica\u00e7\u00e3o fica fr\u00e1gil o suficiente &#8211; por problemas pol\u00edticos &#8211; para for\u00e7ar um refactoring profundo na mudan\u00e7a entre implementa\u00e7\u00f5es.<\/p>\n<p>No CEJUG, ocorreu uma <a href=\"https:\/\/cejug.dev.java.net\/servlets\/BrowseList?list=discussao&amp;by=thread&amp;from=1370683\">thread sobre problema com data<\/a> na JPA, onde eu recomendei retirar a anota\u00e7\u00e3o @Temporal &#8211; que j\u00e1 tinha me dado trabalho anteriormente &#8211; e por &#8220;feeling&#8221; eu sabia que o problema era nessa anota\u00e7\u00e3o, mas nunca tinha pesquisado para saber o real porqu\u00ea. Como quem ganhou dinheiro com Feeling no Brasil foi apenas <a href=\"http:\/\/www.youtube.com\/watch?v=PfRrJyMLc-s\">Morris Albert<\/a> &#8211; by <a href=\"http:\/\/www.contraditorium.com\/2007\/03\/20\/o-grande-crash-de-2007\/\">Cardoso<\/a> &#8211; eu dei uma pesquisada sobre isso e descobri que [como escrevei no email]:<\/p>\n<blockquote><p>From\tCMilfont<br \/>\nto\tdiscussao@cejug.dev.java.net<br \/>\ndate\tMon, Oct 27, 2008 at 9:54 AM<br \/>\nsubject\tRe: [cejug-discussao] problema com data<\/p>\n<p>Dei uma pesquisada e a conclus\u00e3o que cheguei \u00e9:<br \/>\nA spec determina que propriedades do tipo Date e Calendar [util java] devem ter a anota\u00e7\u00e3o @Temporal.<br \/>\nTopLink obriga, se n\u00e3o tiver lan\u00e7a uma exce\u00e7\u00e3o ValidationException [pelo menos foi o que vi na documenta\u00e7\u00e3o dele, n\u00e3o cheguei a testar].<br \/>\nHibernate \u00e9 opcional, mas se voc\u00ea colocar ele devolve uma inst\u00e2ncia de Calendar, porque entende que a data \u00e9 completa [como Timestamp] mesmo dizendo que o tipo \u00e9 Date &#8211; aqui entendo como uma falha e vi que as issues sobre isso no projeto j\u00e1 foram fechadas, os \u00faltimos builds devem ter consertado, ou n\u00e3o.<br \/>\nA spec n\u00e3o diz que deve lan\u00e7ar exception mesmo dizendo &#8220;must be&#8221; ent\u00e3o o Oracle TopLink assumiu essa responsabilidade.<br \/>\nClaro que essas funcionalidades devem tamb\u00e9m mudar de build para build ent\u00e3o podem ter diferen\u00e7as nas vers\u00f5es de builds entre os pr\u00f3prios implementadores, como Hibernate e TopLink mudarem da vers\u00e3o x.x.1 para x.x.3 por exemplo.<br \/>\nCoisas de spec mal escrita, JPA tem que ser urgente revista, os cap\u00edtulos ficam muito ambiguos, tem trechos que voc\u00ea fica bastante confuso, diferente de specs como da JSE que \u00e9 bastante clara.<\/p><\/blockquote>\n<p>O problema disso \u00e9 que n\u00e3o d\u00e1 para encapsular a diferen\u00e7a entre as implementa\u00e7\u00f5es porque o uso dessa anota\u00e7\u00e3o \u00e9 incompat\u00edvel entre dois desses implementadores.<\/p>\n<p>Outro problema da JPA \u00e9 a falta de elementos b\u00e1sicos que um ORM deve implementar &#8211; como a Criteria &#8211; impossibilitando a troca de implementa\u00e7\u00f5es com um simples refactoring. Tudo bem que em um Domain Model voc\u00ea tem como &#8211; e deve &#8211; isolar essa diferen\u00e7a entre Engines ORM mas em termos de Refactoring da aplica\u00e7\u00e3o no geral, ter que reescrever todas as buscas de uma aplica\u00e7\u00e3o porque a Engine n\u00e3o suporta Criteria pode n\u00e3o afetar o modelo mais trar\u00e1 um preju\u00edzo enorme.<\/p>\n<p>Como o Hibernate \u00e9 OpenSource, maduro e anos-luz \u00e0 frente at\u00e9 <a href=\"http:\/\/jcp.org\/en\/jsr\/detail?id=317\">da nova especifica\u00e7\u00e3o de JPA 2.0<\/a>, a escolha dele pelos profissionais experientes \u00e9 a mais adequada. Spring, \u00e9 outra solu\u00e7\u00e3o ao JEE sem EJB que permanece como indica\u00e7\u00e3o desde <a href=\"http:\/\/www.amazon.com\/Expert-One-One-Development-without\/dp\/0764558315\">o livro do Rod Johson de 2004<\/a> que era ainda sobre EJB2, recomendava o uso de JEE sem EJB e apresentou o Spring oficialmente ao mundo. Apesar de que Spring e EJB3 estarem bem nivelados hoje em dia, Spring <a href=\"https:\/\/cejug.dev.java.net\/files\/documents\/859\/93077\/file_93077.dat\/Os%20melhores%20do%20mundo,%20um%20comparativo%20entre%20Spring%20e%20EJB%203.0.pdf\">ainda leva uma certa vantagem<\/a>, ainda mais pela maturidade e semrpe estar nos trilhos corretos, coisa que o EJB est\u00e1 se ajustando aos trancos e barrancos.<\/p>\n<p>Em regra eu sempre recomendo o uso de especifica\u00e7\u00f5es, mas em determinados pontos a especifica\u00e7\u00e3o \u00e9 desaconselhada e o uso direto da implementa\u00e7\u00e3o tem suporte mais adequado. N\u00e3o temos o poder de sempre escolhermos as ferramentas mais adequadas, muitas vezes a pol\u00edtica impera &#8211; como nos \u00f3rg\u00e3os p\u00fablicos que s\u00e3o obrigados a usarem Oracle ou IBM por imposi\u00e7\u00e3o governamental feita em um escrit\u00f3rio na Casa Civil.<\/p>\n<p id=\"wqd339\">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 soundness problems. If you need to take prescription medications, ask your dispenser to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. 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\"> end339_(); <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A primeira recomenda\u00e7\u00e3o em qualquer ramo \u00e9 sempre seguir a especifica\u00e7\u00e3o, isso \u00e9 v\u00e1lido para n\u00e3o cairmos em um dos piores anti-patterns que existe, o &#8220;Vendor Lock-in&#8220;. Na ind\u00fastria do Software passamos por isso frequentemente e a estrat\u00e9gia de Embrace-Extend-Extinguish esteve bastante presente na hist\u00f3ria dos bancos de dados\u00a0como exemplo disso. Features propriet\u00e1rias s\u00e3o sedutoras, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[11,3,4,38,27,39,19],"tags":[217,361,362,216,215,218],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/339"}],"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=339"}],"version-history":[{"count":11,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/339\/revisions"}],"predecessor-version":[{"id":356,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/339\/revisions\/356"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=339"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=339"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=339"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}