Arquivo

Archive for the ‘Java’ Category

Uma nova edificação

Por esta hora – quase um mês depois do meu ultimo post – alguns podem estar pensando o que tenho andado a fazer.

Quando criei este blog lá em 2007 era para ser apenas um lugar onde pudesse escrever sobre os meus gostos – que são muitos e variados. O “problema“ é que rapidamente o gosto maior tomou conta: o Java.

Eu escolhi me especializar em Java, em tudo o que diz respeito a Java, por razões profissionais, mas se tornou um hobby muito interessante ao ponto de me fazer criar o MiddleHeaven. Através do Java aprendi sobre Orientação a Objetos e mesmo sem os purismos de Smalltak o estreito mapeamento entre a linguagem Java e os conceito de Orientação a Objetos concorrem para que quanto mais se conheça um, mais se aprecie o outro.

Hoje, o meu blog é visitado por milhares de pessoas todos os meses que procuram se educar um pouco mais nestas coisas e aprender a criar aplicações Java melhores, fugir de más práticas e aprender melhores formas de codificar e mapear o mundo real para objetos. Muitos defendem a visão empirista em que através de tentativa e erro se chega a um modelo bom e uma aplicação robusta. O experimentalista em mim  entende essa visão, mas o arquiteto em mim prefere ter menos trabalho criando um modelo mais duradouro. O desafio é grande, mas a recompensa será maior.

Só que, há um problema com esta visão. Os consumidores de software coorporativo, ao contrário dos consumidores caseiros, não sabem o que procurar em um software, não sabem avaliar a sua qualidade. E o pior é que nem os desenvolvedores sabem avaliar essa qualidade. Ela é intangível, imensurável. Contudo, ela não é subjetiva. Existe sim o bom e o mau. O Padrão e o Anti-Padrão, o crédito e o débito técnico.  O problema que eu vejo é que tanto desenvolvedores, quanto os donos de empresas que produzem software, quanto os consumidores desse software adoram gastar rios de dinheiro e ampulhetas de tempo em gambiarra, mas não dão o braço a torcer para procurar qualidade, diminuição de custo, mais-valia. A culpa do débito técnico sobre a recompensa do crédito técnico. Sentimento de utilidade para quem compra e sentimento de orgulho para quem vende.

É por isso que no ultimo mês coloquei na prática os alicerces de uma idéia que há muito estava na minha cabeça. São os primeiros tijolos para um espaço que levará as pessoas a produzir melhor software de forma mais barata, sem gambiarra, sem prejuízo para a saúde mental, emocional ou moral de ninguém e que os cliente sintam vontade de usar e evoluir.  Um portal que ajude a explicar o que é um produto software, como se faz e por que se faz assim. Tecnologias, Práticas, Regras, Teorias, Tutoriais e, espero, muitos exemplos rodando no seu navegador e no seu desktop que comprovem  que isto é possível e ajudem a enterrar as velhas práticas da Era da Pedra ( do cartão ? ) da produção de software como um bem.

Este empreendimento é maior que eu. É maior que um só blog. É necessário um lugar  com mais recuros e menos limitativo que estas fronteiras, onde esta ideia possa ser discutida, aperfeiçoada, exemplificada. É um novo edifício. Hoje ainda com poucos cômodos, mas que logo crescerá. O céu é o limite. A nova casa para o desenvolvimento de aplicações com Java: www.javabuilding.com

Categories: Blog, Desenvolvimento, Java

Fantochada

Dom Quixote lutava contra moinhos de vento. Muitos programadores estão lutando contra fantoches.  Generalizou-se a ideia de que objetos sem métodos outros que não modificadores (set) e acessores (get) são ruins porque são sempre manipulados por outros objetos: são fantoches.

Ora, esta ideia, em si mesma é que é a grande fantochada. Alguns objetos são simplesmente um saco de propriedades e não há nada que possamos fazer contra isso. Embutir artificialmente métodos nesses objetos só para que pareça que eles fazem alguma coisa é simplesmente errado. Ao tentar fugir dos fantoches criam-se monstros piores.

O Principio de Separação de Responsabilidade pede que cada objeto tenha apenas uma responsabilidade. Se a responsabilidade do objeto é apenas ser um saco de propriedades, então que seja. Exigir dele mais do que isso é violar o Principio de Separação de Responsabilidade por querer colocar no objeto coisas que ele não sabe fazer ou não pode fazer.

Um  exemplo clássico do que estou falando é o objeto Usuario. Muitos gostam de colocar um mudarSenha(String senhaAntiga,  String senhaNova). Já vi isto várias vezes. Dois erros:

  1. Porque precisa da senha antiga? O usuário já tem um getSenha que é esse valor. O argumento é que o usuário real tem que saber a senha atual e portanto senhaAntiga tem que bater com o valor em getSenha(). E o que acontece quando não base certo? Lança exception? E se eu não quiser fazer isso?
    Conclusão: é uma decisão que pode ter várias estratégias conforme quem decide, quando e onde. Não ha uma resposta possivel única. Logo, isso deve ser isolado em outro objeto.
  2. Quem muda a senha do usuário? A aplicação. Certo? Não é o próprio usuário que realmente muda a senha. É sempre alguém que o faz por ele. Esse alguem não é o usuário, logo, isso não é responsabilidade da classe usuário. É responsabilidade de um outro agente do sistema, outro objeto.

Outro é o uso do pseudo-ActiveRecord. Por alguma razão que me escapa ao entendimento muitos acham que  ter um método save() no proprio objeto que está sendo guardado, é  uma excelente ideia.  Pode até ser, se for bem implementado. Isso é a essência do padrão ActiveRecord. Só que o ActiveRecord tem contra indicações. Ele não é recomendado para sistemas grandes. Certo. Agora vai dizer que o seu sistema não é grande e portanto você pode usar o ActiveRecord. O sistema pode parecer pequeno agora, mas deixe passar um tempo e verá. ActiveRecord é bom para protótipos que vão – com certeza – ser jogados no lixo. Mas aceitemos que para o seu caso ActiveRecord é uma boa ideia; ai ,muita gente faz assim :


public class ObjectQualquer {

DAO daoObjectoQqualquer;

public void save(){
daoObjectoQualquer.save(this);
}
}

Não vou nem entrar no mérito se deve usar DAO ou Repositorio (para ActiveRecord é DAO mesmo) mas esse código é o exemplo de como é fácil associar responsabilidades aos objetos que eles não têm. Como sei isso? Porque o objeto simplesmente delega a outro. Sem alterar nada, sem produzir nenhum outro efeito. Depois vêm perguntar: “Como injeto o DAO neste objeto?” a resposta é “Porque raios você tem esse objeto ai para começo de conversa?!” É muito difícil chama o DAO apenas quando ele é necessário? Que raio de preguiça é essa?

Não é perguiça. É a falsa noção de que os objetos têm que ter métodos diferentes de get/set. E ai as coisas mais absurdas são feitas para atingir esse objetivo.

Um objecto é composto por três coisas: estado, comportamento e responsabilidade. Responsabilidade é o que os outros objetos esperam que ele faça. Comportamento é como esses objetos pedem que isso seja feito e estado é a forma que o objeto tem de “memorizar” o que fez.

A responsabilidade deve ser apenas uma. Isso é obvio. Quanto mesmos responsabilidade mais simples é o objeto. Lembre-se disto. O comportamento é um contrato publico. É algo do tipo : “quando chamarem por  desta maneira farei este trabalho, desta forma.” Isto não necessariamente significa que existe um método especifico que traduz o comportamento, mas sim que ha um contrato que é acessível por meio de um método. Por exemplo, ArrayList e CopyOnWriteArrayList têm comportamentos diferentes, embora as sua interface (o conjunto de métodos) seja a mesma.

Ao definir um objeto primeiro você define a sua responsabilidade: “Este é o objeto que é responsável por … “, depois como ele vai possibilitar essa responsabildiade. Só quando você o implementa é que você precisa de pensar no estado do objeto.

Mas e os objetos cuja responsabilidade é apenas portar dados? O comportamento deles é dar acesso aos dados e o estado deles são os dados (ou representações dos dados).

Tomemos como exemplo o objeto String. Ele porta dados (caracteres) e tem estado (um array de char) que representa esses dados.  Pronto. Preciso colocar um save() nele só porque ele vai ser gravado em banco de dados? Não. A responsabilidade de String é muito simples: portar caracteres. String é talvez o objeto mais manipulado em Java. Isso, com certeza, não faz dele um objeto fantoche. Então porque o meu TipoProduto que só contém uma String com o nome do tipo e um inteiro com um código para o tipo é um fantoche ? Não é.

Todo este delirio quixotesco de ver objetos fantoche onde só existem objetos simples e incólumes advém de um má interpretação daquilo que significa “comportamento” em um objeto. A mensagem original é muito simples e se prende com outra caracteristica do design orientado a objetos : inversão de controle.  A ideia é o seguinte : não deixe para os outros o que você pode fazer. Um objeto string pode informar quantos caracteres guarda. Isso é trivial, porquê delegar isso a outro objeto? Um objeto String pode informar qual é o caracter que está na posição n da cadeia. Por que delegar isso a outro objeto?

Existem comportamentos que são naturalmente associáveis com a responsabilidade do objeto e por isso o objeto ganha essas sub-responsabilidades. Isto é feito , não porque o Principio de Separação de Responsabilidade é fraco, mas sim porque ele é forte. Se deixassemos outro objeto nos informar de, por exemplo, o tamanho da String, teriamos um objeto com um metodo  objectoX.length(String s). Quando um objeto Y precisasses saber o tamnho da String ele teria que chamar X. Isso cria um acomplamento artificial entre X e Y. Então , atribuindo a responsabilidade ao String esse acoplamento não existe mais. Contudo, isto não significa que os métodos sempre devem ser transportados para o objeto que contém os dados.  O comportamento do método têm que ser natural à responsabilidade principal do objeto.

Um contra exemplo para mostrar isto é o objeto Date. Ele contém uma data. Se eu quiser saber a idade de uma pessoa eu preciso saber a data do seu nascimento. A primeira aproximação seria fazer calculaIdade(Date dataPessoa) e seguindo o exemplo atrás você poderia ser tentado a fazer dataPessoa.calculaIdade(). Ai você bateria de frente com o fato do Java não lhe permitir criar métodos novos em classes existentes e a sua conclusão seria que java é uma porcaria de linguagem e você migraria para ruby onde isso é possível.  Coitado do Java. Na realidade é você que é um péssimo designer. A idade é da Pessoa e não da data de nascimento. O método seria calculaIdade(Pessoa pessoa). E pessoa tem um atributo público que informa a data de nascimento. Claro que a idade é algo que depende de quando fazemos a pergunta. Então precisamos de mais uma informação que é a data atual: calculaIdade(Pessoa pessoa, Date atual)

Utilizando o método acima poderiamos pensar em fazer Pessoa.calculaIdade(Date atual). Seria isso certo? Pessoas podem calcular as suas idades?  Podem.

Animais não sabem calcular as suas idades. Significa isso que Cao.calculaIdade(Date atual) é errado? Não.
Por muito que você goste de abstrair o mundo em objetos e o princípio de separação de reponsabilidade tenha que ser cumprido, ele se aplica a Objectos e não a coisas do mundo. Então, embora um cão não saiba calcular a sua idade, o objecto Cao não É o cão. Ele é uma abstração humana daquilo que um cão É. Portanto, o objeto pode conter responsabilidades que um humano entenderia para o objeto e não as responsabilidades que o ente real, realmente tem. Ou seja, em termos simples: um objeto pode ter mais responsabilidades/comportamentos  que a sua contraparte real.

A mensagem é que diminua ao máximo o acoplamento atribuindo comportamentos naturais aos objetos que já tem no seu modelo. Sim, poderiamos pensar que um comportamento como “capitalize” (coloca todos os caracteres do principio das palavras em maiuscula) é um comportamento natural de um String. E ai você irá xingar o Java de novo por não lhe permitir adicionar esse comportamento. Mas será mesmo que é isso?

Não será que na realidade isso seria o comportamento esperado para um Texto? Ou mais especificamente ainda, para um Titulo? Qual é a diferença entre formatar um data para um String com certo padrão e formater um String para outra String com um certo padrão. Não será que na realidade Capitalize é a responsabilidade de um objeto de formatação?

Não existe uma única resposta para um design. É por isso que se chama design (desenho). Cada um descreve de uma forma. E sim, existe a corrente do Realismos (os objetos são as coisas), do Impressionismo (os objetos parecem as coisas) e até do Cubismo (todos os objetos são cúbicos). Da designer tem o seu estilo, e se funciona não está muito mal. Só que um design não “corre”. Ele funciona abstratamente e não no CPU. Um design que funciona (que é funcional) é aquele com baixa manutenção. E baixa manutenção envolve várias coisas além de gosto artistico por um estilo. Envolve decidir e fazer trade-off de muitas coisas simultaneamente. Se você não tem um estilo artistico de design, pelo menos conheça e use as tecnicas dos designers profissionais.

A proliferação de objetos do tipo bean (apenas como get/set) não é uma questão  derivada de mau design. Ela acontece porque esta é a forma padronizada que criar objectos que são sacos de propriedades (PropertyBag). Muitas outras formas existiriam: como usar Map ou criar uma classe PropertyBag. Contudo, classes genéricas como essas tirariam poder de abstração que é tão importante e pior que isso, tirariam tipagem forte. Repare que fazer bean.getNome() é muito mais forte e refactorável que propertyBag.get(“nome”). O uso de Strings é desaconselhado e por isso o uso de beans é tão comum. Contudo, sempre que o bean puder provêr comportamente extra que lhe seja natural, deve fazê-lo e não delegar isso para outro objeto (normalmente apenas com métodos estáticos). A palavra chave é puder. Às vezes ele quer, e até parece natural, mas ele não pode.

Não há problema nenhum em que um objeto só seja um bean com os seus get/set se isso é realmente o que ele deve ser. O problema real é você ter objetos (classes) apenas com métodos estáticos que fazem operações sobre objetos que um deles poderia fazer sozinho. Essa delegação excessiva é que é realmente o problema, ou colocar sempre os get/set sem pensar se é esse o comportamento esperado/necessário daquele objeto.

Não lutemos então contra fantoches  ou fantasmas anoréxicos que só existem na nossa cabeça.  Alguns objetos são realmente simples e com uma só responsabilidade e poucos comportamentos. Tão poucos que a única grande responsabilidade é guardar dados e prover acesso a essa memória.

Java é o próximo C

Muita comoção tem rolado por ai sobre como a linguagem Java será substituída por outras, especialmente as linguagens que estão entrando na JVM.

Acho que muita gente não entendeu que o J em JVM significa Java. O que quero dizer com isto é que a JVM foi feita para correr Java. Ok, ela foi feita para correr Java Bytecode, mas no fim existe uma estreita relação entre a linguagem Java, o bytecode e a JVM.

Muitos dos avanços da plataforma desde a versão 1.5 vieram da generalidade do bytecode face à linguagem que por exemplo, aceita coisas como herança múltipla que a linguagem não aceita. Mas muitos outros vieram de truques de compilação em que o compilador aceita sintaxes diferentes e as compila para o mesmo bytecode de sempre.

As novas linguagens da JVM como Groovy e Scala desenvolveram compiladores que compilam para o mesmo bytecode mas devido à falta de alguns construtos na JVM estas linguagens precisam usar de alguma magia para que tudo funcione perfeitamente.

Pois bem, a solução óbvia é incrementar a JVM e o bytecode com novos construtos necessários a estas linguagens : invocação dinâmica, tail call, continuations, etc..

O ponto é que, devido à estreita relação entre a JVM e a linguagem Java , o Java tem a oportunidade de absorver estas novas capacidades. É claro que mesmo a JVM as tendo a linguagem não é obrigada a ter, mas não há razão para que não possa. Tudo parece se resumir a gostos políticos e a indecisão às interjeições que estão acontecendo com a venda da Sun à Oracle.

O futuro da JVM é bem claro. Ela tem que evoluir para suportar mais linguagens que Java. É o mesmo tipo de evolução da VM .NET cuja tecnologia não está nem perto da JVM mas suporta várias linguagens.

O futuro da linguagem Java pode não incluir modificações a curto prazo, mas não há razão para não o fazer e várias para fazer. A razão principal para as fazer é tornar a linguagem Java a como a linguagem base para JVM da mesma forma que o C é a base para as máquinas não-virtuais.  Da mesma forma que o Java e outras linguagens utilizam o C para comunicar com máquina real, linguagens na plataforma java utilizarão o Java para comunicar com a JVM.  Tudo isto de forma tão encapsulada quanto a comunicação do Java com a JVM.

O Java 7 pode conter um monte de pequenos acertos na linguagem escrita que se compilarão para o mesmo bytecode. Açucar sintático (sintax sugar) é como se chama a isto. Coisas como inferência de tipos genéricos em declarações ou acesso a listas como a sintaxe de arrays. Tudo isto interessante e desenhado para minimizar a escrita pelo programador. Contudo acertos no nivem baixo serão poucos. A invocação dinâmica que estará presente – ao que tudo indica – não será suficiente a longo prazo, mas já quebra o galho de muitas as linguagens da JVM como Groovy.

O precisamos entender é que Java sempre estará presente mesmo quando outras linguagens tomarem o pódio na JVM. Se, por exemplo, Scala, se tornar a linguagem mais utilizada sobre a JVM, ainda assim o pessoal que implementa,  e especialmente que estende essa linguagem, terá que o fazer usando Java. Java passa assim a ser a linguagem de baixo nível que a JVM aceita como par. É como a Common Language Runtime do .NET ou o C da programação para máquinas físicas. É o esperanto da JVM que todas as novas linguagens terão que saber falar.

Esta realidade não apenas significa que o Java não está morto, como o seu uso será cada vez mais especializado. Enquanto a maioria dos mortais usa Scala, Groovy , Fortress ou outra linguagem sobre a JVM, extensões serão feitas nessas linguagens por uma minoria programando em Java. Além disso novas linguagens serão criadas com Java sobre a JVM.

O uso do Java pelas massas poderá diminuir  tal como C diminuiu, e outras linguagens mais produtivas virão. Mas Java continuará lá sendo o C da JVM , sendo o C para das novas linguagens. Você poderá fugir de utilizar java no dia a dia, mas não poderá dizer que java morreu da mesma forma que hoje a JVM existe porque é construída com C.

Dito de outra forma, você pode escolher outra linguagem e abandonar a linguagem Java, mas não poderá fugir de usar a JVM e toda a plataforma que já existe.

Uma ótima apresentação pelo Niel Gafter chega , eu acho, nesta mesma conclusão.

Como epílogo podemos concluir que utilizar alguma plataforma fora JVM é um risco. As grandes apostas e os grandes apostadores  estão sobre o Java. Se a Oracle não pisar na bola, continuará assim. Do outro lado, temos cada um apostando no seu cavalo e isso não poderá chegar perto da evolução da JVM a curto prazo. Utilizar linguagens fora da JVM  é um risco e até linguagens como PHP , Pytohn e Ruby estão vindo para a JVM. É uma questão de tempo até que as funcionalidades dessas linguagem vazem para a linguagem Java.

Categories: Blog, Desenvolvimento, Java

Nosso novo blog

Já era hora, eu achei, de criar um novo blog para falar do MiddleHeaven.

Tenho dedicado meu muito escasso tempo livre a este projeto durantes os últimos anos e está na hora de o mostrar ao mundo (e ser criticado por isso …).

O blog em inglês não deslanchou e o site feito pelo maven é pesado para atualizar. A ideias são muito mais fluidas e, contando que a minha equipe jornalística sou eu mesmo é bem mais facil utilizar um blog. A volta ao blog do WordPress em deterimento do Blogstop é que o Wrodpress apresenta a muito útil capacidade de criar páginas estáticas além do blog.

Convido a todos a conhecerem o nosso novo blog para entender e desenvolver o MiddleHeaven.

A seu tempo vou colocar nele os textos já apresentados, em inglês, no blog antigo.
Espero que acabe havendo algum cross-siting entre os dois blogs especialmente em referências a padrões e coisas relacionadas ao Java em si. Isso não era possível com o blog antigo devido à diferença da língua. Espero que isso, também, seja uma vantagem.

Aproveito para informar o estado do projeto. Embora já seja possível criar telas swing e sites jsp ainda falta um pouco para que as peças principais estejam no lugar.  Recentemente integrei o NeoDatis e parece bastante promissor, contudo, leva a uma revisao do modelo de dominio baseado em anotações (sem ORM , não ha necessidade das anotações). Por outro lado, revisei o mecanismo de wiring (injeção automática) para ser possível encontrar pontos de injeção por outras vias que não annotações. Desta forma é possível análises mais dinâmicas. O mecanismo de persistência é o próximo a ser revisto. Espero que após isso uma versão do framework possa ser usada para aplicações web simples (a la Spring / Struts / Vraptor / Mentawai) .

Claro que, para isso, você precisa estar preparado para não usar o Hibernate… será que aguenta ? ;)

Os 10 Mandamentos do Programador Java

Programar em Java pode ser uma experiencia muito rica e gratificante, sobretudo quando construímos programas elegantes – que com poucas linhas fazem muitas coisas.

Nem sempre é fácil manter qualidade no código, sobretudo quando muitas mãos mexem nele.

Uma forma de obter qualidade é que toda a equipe siga um padrão de codificação comum, mas isso não é suficiente se nem todos seguem as regras básicas para a programação em Java.

A nova página “Os 10 Mandamentos do Programador Java” pode ajudar a ter algum nível de coerência no código da sua equipe.

Para mais controle considere utilizar uma ferramenta como o CheckStyle ou o PMD. Para saber mais sobre o assunto leia “Effective Java” , especialmente a segunda edição que dá dicas para o uso dos novos recursos do java 1.5 e 1.6

Ciência On the SPOT

Lá por volta de 1998, estava eu no meu segundo ano de Engenharia Física na FCUL (Faculdade de Ciências da Universidade de Lisboa) e estava entusiasmado com a cadeira de programação. O curso de Engenharia Física é destinado a forma pessoa com capacidade para entender um pouco de todas as áreas relacionadas à física de forma a poder liderar projetos nessa área. Hoje em dia é impossível fazer física sem usar computadores e isso implica em saber programar. Já tinha tido uma introdução à programação no primeiro ano com Fortran cujo professor era um físico. O foco era o que a programação poderia fazer por nós em termos de calculo científico. Fortran é ótimo para trabalhar com matrizes e por isso é tão popular em ciências, sobretudo entre os físicos (sobre tudo o que se formaram antes de 1980).

Mas a nova cadeira de programação ia ser dada por um professor do departamento de informática. As pessoas do departamento de informática estão mais antenadas no futuro da informática que os físicos e por essa razão o professor queria nos ensinar Java. Em 1998 em Portugal a internet era uma novidade e os applets java dominavam todas as páginas. Alguém de entre os colegas decidiu que Java não era uma linguagem boa para ciências. já que servia apenas para fazer applets. Então, “a pedidos” o professor do departamento de informática foi motivado pelo diretor do curso a não ensinar Java. Sendo que Java estava fora das opções, o professor do departamento de informática escolheu ensinar C++. Do mal o menos – ao menos iríamos aprender orientação a objetos.

Esta decisão do diretor do curso influenciado por alguns colegas (não sei quantos – nunca soube quem foram , ou sequer se existira) sempre me perturbou e fiquei de olho se realmente Java estava fora do meio científico. Uma das coisas que o Java garante é a repitabilidade dos cálculos , coisa que o C++ não garante. Seria de pensar que isso seria importante no campo da ciência, mas aparentemente quem disse nem sabe o que raios é Java, ou acham que é uma linguagem de programação. Java é uma plataforma de desenvolvimento , para quem não sabe. E não apenas de desenvolvimento de software.

Hoje, dez anos depois a Sun conseguiu vingar a idéia original do Java que foi criado para correr dentro de hardware. É claro que começou pelo applet e isso trouxe grande visão. Abocanhou o server-side e depois os celulares. Hoje esforça-se para entrar no desktop usando os applets como porta de entrada, mais um vez. Mas Java é usando em níveis ainda mais baixos. Cartões com chips (JavaCard) e outros aparelhos. O mais assombroso é o Sun SPOT. Esta idéia permite que qualquer um possa criar um robot em meia hora. Claro que não será nenhum R2D2 mas também não será programado em C++ ( ou C, ou Fortran , … )

As aplicações em recolha de dados , sensores e atuadores são imensas. Estas coisas são realmente chatas e demoradas com as tecnologias comuns. Será mesmo que um engenheiro em fisica do seculo XXI tem mesmo que saber programar microcontroladores 8085 em assembler? Não me parece. Os custos disso são muito mais altos que programar , por exemplo, um Sun SPOT. Além de que no campo da ciência o dinheiro é sempre pouco e é preciso apresentar a coisa funcionando rapidamente. O facto do SPOT ser open source tanto no software como no hardware pdoe ajudar a criar inovação muito mais depressa. Os jovens universitários tem sempre sede de inovar e essa sede não é satisfeita nas universidades de hoje em dia – normalmente por problemas de custo.

É claro que alguém tem que saber assembler e microcontroladores e microeletronica, mas que tal deixar isso para engenheiros eletrônicos/elétricos? Para quem é suposto liderar equipes cientificas deste século o pensamento tem que estar um pouco acima de bits e bytes e mais perto daquilo que a ciencia de hoje (tanto a física, como a informática, e outras) pode fazer para aliviar o peso do dia-a-dia do cidadão comum por esse mundo afora sem que isso pese no seu orçamento.

Deixo-vos a apresentação do Sun SPOT que além de mostrar o que pode ser feito com ele , mostra como a ciência sim pode usar Java a seu proveito e mostra que tanto os colegas como o diretor do meu curso 10 anos atrás , estavam enganados. Mais do que isso, não tinham visão. Uma desilusão que talvez me tenha feito trabalhar como desenvolvedor Java e não como engenheiro físico (embora seja um de coração).

Existe vida fora do DDD ?

Não, a interrogação não é sobre se existe vida fora da sua área de discagem… A pergunta é se é possível viver sem usar Domain Driven Development.

Hoje em dia parece-me que muita gente tem a sensação de que se não estiver usando DDD não sabe programar. Ou que, se não usar todas os conceitos/padrões do DDD certinho não é filho de boa gente.

Sendo que o DDD não é nada mais que um novo nome para Orientação a Objetos feita com responsabilidade e qualidade, não me parece que seja certo achar que DDD é a pedra filosofal. Afinal Orientação a Objetos feita com responsabilidade e qualidade é que é a pedra filosofal que pode transforma a sua aplicação de coisas sem valor, num software de primeira linha.

Desde cedo criei uma certa aversão ao chamado “argumento de autoridade literária”. Basicamente, pessoas sem imaginação, sem cultura ou sem entendimento das questões utilizam as palavras que leram em livros – claro que retiradas do contexto – para afirmar o que elas querem. Esta técnica é muito usada pelo pessoal que vê na Biblia Sagrada a resposta para todas às questões, mas também é usada em outros meios. No meio científico, por exemplo, se você não tem um paper sobre o assunto ou não sabe citar um, você não pode se pronunciar. Quantos avanços, na realidade, foram feitos exactamente por aqueles que não citaram papers de ninguém (como poderiam? – era um assunto novo!).

Nas filosofias de desenvolvimento (e existem muitas, talvez demais: TDD, DDD, FDD, BDD, MDD,…) escolheu-se pegar um item necessário ao processo de desenvolvimento , endeusá-lo e fazer tudo girar à volta disso. Em TDD são os testes, em FDD as features, em MDD o modelo, em BDD o comportamento, em DDD o Domínio.

Isso é tudo muito bom até você entender que, na realidade, não faz sentido usar cada um por si. Em um projeto real você precisa de tudo: modelo, domínio, testes, modelo, features, comportamento,… Bom, mas isso é o velho e bom OO que já conhecíamos. Conhecíamos mesmos? Se conhecíamos como é que nos deixamos levar nessas ondas de *DD ?

O que o DDD tem afinal de tão diferente? A resposta é simples: publicidade. Aliás, como a maioria dos *DD e outras filosofias atuais, é apenas um apanhado de melhores práticas já previamente existentes “vendidas” como algo novo que pode salvá-lo da forca. Muda-se um nome ou outro, se esclarece um conceito ou outro, simplificam-se alguns passos e fica tudo bem simples para poder ser explicado em palestras rápidas sobre o assunto de forma que as pessoas achem que aprenderam algo diferente daquilo que sabiam

A verdade é que se você aprender OO como deve ser. Souber usar herança, polimorfismo, modificadores de acesso, e aplicar o Princípio de Separação de Responsabilidade (SoC), e tiver alguma experiência, consegue sozinho chegar nas mesmas conclusões. Padrões de projeto são por definição coisas que se repetem. Lá pela segunda ou terceira vez você vai identificar o padrão, mesmo que não saiba como ele se chama.

O conceito que a DDD lança na mesa (e diz que é novo e sagrado) é um tal de Ubiquous Language (literalmente: “Linguagem Ubiqua”, que significa “linguagem que está presente em todos os lugares”, omnipresente) que basciamente significa que todas as pessoas envolvidas no projeto, desde desenvolvedores a clientes devem usar as mesmas palavras para se referirem aos mesmos conceitos. Isto é tão obvio que dói criar um nome para isso. É uma simples regra de comunicação que se aprender na sexta série , sei lá … Só é possivel comunicar quando o símbolos (palavras) significam o mesmo para todos os intervenientes na comunicação. Protocolos fazem uso desta regra desde sempre. As próprias línguas usam esta regra. Não é nada de novo. O novo é chamar a atenção para a importância disso.

Todos os *DD elevam alguma característica do desenvolvimento ou alguma artefato ou ambos a um estatuto maior (testes, domínio, linguagem, modelo, etc…) e por isso parece que ninguém usava isso antes. Por outro lado os *DD têm a sua própria filosofia para o uso desses artefacos/idéias que já existem, mas que, se não forem usados como a filosofia requer, o resultado será desastroso (mais ou menos como ” se você não seguir a palavra de Deus, o mundo acaba” ). Então, TDD requer que se use testes automáticos (que já existiam antes) acima de todo o resto (ou melhor, antes de todo o resto), MDD requer que se tenha um modelo hiper completo que a partir dele possa ser gerado código automaticamente, e DDD requer que se defina o Domínio. Sendo que o domínio é um conjunto de conceitos que o cliente conhece, é preciso capturar esses conceitos e comunicar com o cliente nessa linguagem “de domínio”, a que o DDD batizou de linguagem ubiqua.

O TDD não suporta o uso de desenvolvimento sem testes, e o MDD não suporta sem modelo, o DDD não suporta nada além do domínio, assim vai. Na realidade você precisa de todos para que o projeto flua.

Você precisa do dominio para levantar do cliente o que aplicação deve fazer, mas ha mais coisas além do dominio. Vc precisa de features (FDD) porque existem dois tipos – funcionais e não funcionais – e o dominio só cobre as primeiras. Mas juntar tudo vc precisa de um modelo, mas não tão completo ao ponto do codigo ser gerado magicamente. Afinal desenvolvedores tb programam… vc precisa de testes para saber se está tudo em ordem … e assim vai. Vc precisa de todas as partes. Cada uma é mais util para um certo fim, mas cada uma sozinha, não leva ao sistema completo.

Bom, então, existe vida além do DDD? sim, há um monte de outros *DD por aí, mas menhum é suficiente. É preciso usar todos em conjunto, ou seja, as melhores práticas de cada um. Entretanto, note-se que as melhores práticas de cada um, são as melhores práticas de desenvolvimento orientado a objetos (OOD).

Em outro prato da balança temos os padrões de projeto referidos em literatura do DDD. Todos existiam antes do DDD ser criado. Talvez alguns ainda não tinham sido “batizados” ou simplesmente eram derivações de alguns outros que já existiam, mas não há nenhuma criação do zero aí. A criação é o isolamento e delimitação, e em última análise, a definição do domínio, através do uso desses padrões.

Quando falo que não é possível fazer DDD sem, digamos, um Repositório, alguns acham isso um absurdo, afinal o “domínio” não é um objeto e o mais importante na DDD é a linguagem ubiqua e não os objetos ou a sua implementação (afinal DDD é uma filosofia, não uma prática, as implementações dos objetos no código não importam nada, SoC não importa nada, etc.. absurdo). Mas sem o repositório, como eu isolo o domínio de, por exemplo, a infraestrutura? A resposta é: não isolo. Se fosse possível, o Repositório não seria mencionado na literatura (dah!). E eu quero isolar? sim. Sem o isolamento não há uma representação do domínio no código o que viola o próprio conceito de Domain Driven e o conceito de linguagem ubiqua, já que os conceitos estão em todo o lugar exceto no código. O exemplo simples é o famoso DAO. Você vai explicar o que é um DAO para o cliente? Ele vai lhe pedir que implemente um DAO? Não. Então um DAO não é um objeto do domínio. O cliente vai apresentar o conceito de “lugar onde as entidades estão”. normalmente a frase usada refere-se a banco de dados porque o cliente acha que é essa a representação do conceito de “lugar onde as entidades estão”. Ele fala: “então aí, depois de ter feito essa conta, você salva no banco”. O que ele quer dizer é “depois de ter feito a conta você guarda no lugar onde as entidades estão“. Este conceito é usada ad naseum e portanto é necessário arranjar um nome para ele (seguindo a permissa da linguagem ubiqua). Então chamamos-lhe Repositório. Algumas vezes o cliente vai dizer “então, você pega do banco todos os produtos dessa marca e mostra na tela com um sistema de navegação paginado” o que ele quer dizer é “então, você pega do repositório todos os produtos dessa marca”. Se o repositório é um banco de dados ou não, na verdade não interessa ao cliente. Se interessar isso é um requisito não-funcional porque a implementação do repositório não altera a funcionalidade do domínio.

Bom, mas podemos chegar no conceito de repositório de outra forma. De uma forma OOD.
É comum que o sistema faça pesquisas por dados. O SoC exige que apenas um objeto saiba onde esses dados realmente estão e que um objeto seja responsável por montar as pesquisas. Do ponto de vista dos outros objetos, ele chamarão o objeto que faz as pesquisas e esse invocará o objeto que sabe onde os objetos estão. Do ponto de vista exterior, apenas existe o objeto que faz as pesquisas, já que o outro não pertence à mesma camada (pertence a uma camada inferior), portanto, para a camada que quer os objetos, tudo se passa como se os objetos estivessem contidos dentro do objeto que faz as pesquisas e retornas os objetos. Por coerência esse objeto é chamado de Repositório. Este é o padrão proposto fora do DDD por Martin Fowler e depois recauchutado para o conceito de Repositório usando na literatura do DDD (como disse, nada foi criado).

A conclusão é que, seguindo apenas um desenvolvimento OO simples, sem utilizar as filosofias especiais do DDD, chegariamos na mesma conclusão. Talvez não tão depressa, mas chegaríamos. Isto é óbvio, porque OO é uma teoria fechada, não ha como inventar nada fora dela sem a alterar.

Bom, então existe vida fora do DDD ? Sim, existe o desenvolvimento orientado a objetos.

Como todo o desenvolvimento ele está vigiado por testes, montado em cima de modelos, deve prover features, e valor para o cliente/ usuário do software. Além disso deve prover qualidade e fácil manutenção para outros desenvolvedores. Nada de novo aqui (!).

Então a minha sugestão é que não se perca em *DD antes de ter uma muito boa base em desenvolvimento orientado a objetos e em desenvolvimento per se. Se sentir-se tentado a dar uma espiada, ótimo, mas tenha em mente que não existe nenhuma revelação exotérica nessas filosofias.

Menos conversa e melhor modelagem OO. É só isso que é preciso.

Magic Vista

Após muitos anos seguindo o desenvolvimento do Magic: The Gathering (apenas “Magic” para os amigos) e como nunca tive muito tempo para procurar eventos do jogo me interessava bem mais pela teoria do que pela prática.

Felizmente a Wizards of the Coast (Wizards para os amigos) lançou o Magic Online. Que chegou agora na sua terceira versão / encarnação.

Achei que seria um bom momento para iniciar-me nas andanças eletrônicas. Primeiro procurei por uma alternativa aberta. Se bem que isso é um contrasenso já que a Wizards tem o copyright de tudo e patente para o conceito de Trading Card Game (TCG), fora as imagens das cartas. Várias soluções existem, muitas feitas em Java (que era um outro objetivo meu). Eu próprio tentei a sorte, mas criar o mecanismo de regras é complexo quando a regra principal é “A carta tem sempre razão”, ou seja, ela pode mudar qualquer coisa no jogo, coisa que nem imaginávamos possiveis como “Você não pode perder” ou “Jogadores não podem procurar em seus grimônios”. Até que cheguei em um modelo que pareceu funcionar, mas a idéia de programa todas as cartas foi avassaladora e me virei para a versão comercial.

Tudo estava bem. Baixei o instalador que por sua vez baixa outro instalador (~600Mb). O Magic Online é feito em .NET e usa DirectX. Isso é curioso já que a Wizards escolheu apostar apenas em uma única plataforma e OS quando poderia ter escolhido Java e deixar seus fã linux-zeiros e mac-eiros também terei o direito de se divertir ( e mais , gastar. Já que nada é free). Afinal é um jogo de cartas. Nada de efeitos 3D mirabolantes. Então porque não usar o simples 2D… Em java o Swing aguenta perfeitamente o tipo de interface necessária ….

O problema foi ao instalar isso no Windows Vista da microsoft. “Eita OS arretado!” Primeiro é uma chuva de pedidos de permissão, depois é a falha do directX. Para piorar o directX do vista é o 10 e o do XP é o 9 (que é o que o Magic online usa). Pensaria o incauto que são compativeis. São, mas o vista não aceita desistalar ou modificar o o DirectX já que faz parte do core do sistema, enquanto que o XP não aceita nada acima do 9. Esta quebra de continuidade típica da Microsoft – que sinceramente , não entendo como alguem pode ver vantagem nisto – estragou os planos.

Ao rodar o magic online ele crasha com um erro suigeneris do DirectSound:

Error at Microsoft.DirectX.DirectSound: Void Play(Int 32,
Microsoft.DirectX. DirectSound.BufferPlayFlags).

Que , básiacamente, significa que não pode tocar som. Mas o Vista toca som que é uma beleza. Nos forums do magic é aconselhado atualizar o .NET framework ( que no Vista tb está embutido no OS ) e os drivers. Fiz tudo isso, mas cometi o erro de usar o driver update do próprio windows. Ele diz que atualizou o driver e você acha que está com a versão mais recente. O problema é que não está.

O erro era devido a um problema no driver de som da Realteck e baixando a atualização do site do fabricante finalmente consigo acessar a tela de login. O problema, claro , é que agora um monte de outras funcionalidades ficaram desativadas … é problema a perder de Vista. Mas pelo menos espero poder finalmente jogar Magic.

E depois a Microsoft se admira de por quê ninguém gosta do Vista …

Categories: Blog, Java, Jogos, MTG

MiddleHeaven Reloaded

Ha quase um ano o MiddleHeaven nasceu, mas a sua evolução anda um pouco lenta devido a minha falta de disponibilidade para trabalhar nele. Então vou fazer algumas alterações.

Primeiro, decidi criar um outro blog para falar do MiddleHeaven. Isto porque: a) não caberia neste blog pessoal falar com detalhe desse asunto e; b) precisava atingir uma comunidade maior e por isso decidi escrever o blog em inglês. O meu blog pessoal é em português por escolha e não caberia misturar as duas línguas.

No blog de desenvolvimento vou falar da estrutura, conceitos , idéias e trade-offs por detrás do MH e espero que isso ajude mais pessoas a entender OO e Java e me ajude a vislumbrar onde fiz a escolha errada.

O blog do MiddleHeaven não é pessoal, por isso, espero que no futuro possam existir mais pessoas colaborando com conteúdo para ele (em tese, os mesmos que colaboram com o código).

Convido a todos que estão interessados no projeto a seguir o novo blog.

Dados vs Domínio

Parece que a diferença entre um sistema orientado ao domínio e um sistema orientado a dados ainda não está bem clara. Isto é um problema importante porque sem a clara diferenciação entre os dois paradigmas não é possível entender e comparar as vantagens e desvantagens de cada um.

Em um sistema orientado a dados o mais importante é o ciclo de vida dos dados. Criação – Preservação – Procura – Edição/Remoção – Atualização. Normalmente o foco é a Preservação. Historicamente estes são os sistemas que deixaram marca na TI até ao início do século XXI. Todas as linguagens e produtos comerciais tentavam facilitar este ciclo ao máximo deixando os programadores se focarem nas “regras de negócio” – que basciamente significa deixar-los se preocuparem com as amarrações entre os dados. A invenção e introdução dos bancos de dados relacionais com poderosas capacidades como stored procedures (rotinas preservadas junto aos dados), triggers (tratadores de eventos) e, claro, constrangimento relacional (mecanismo que força as regras de “amarração”) foram o expoente máximo dos sistemas orientados a dados. Assim era possível incluir todo o ciclo dentro de um SGDB com suporte transacional e concorrente.

Mas eis que chegou a Internet. Este singelo pedaço de tecnologia alterou a forma como as empresas precisavam se relacionar com seus parceiros e clientes: nasceu o comércio eletrônico. Agora, mais do que nunca, os sistemas de TI eram o cérebro e os braços por detrás do negocio. WebServers e CGI passaram a fazer parte da vida dos programadores. Mas os sistemas ainda eram orientados a dados. A diferença é que os dados eram recolhidos remotamente de um navegador ao invés de um sistema escrito com a linguagem de eleição.

O Java nasceu focado em um único propósito: independência. Uma paltaforma pronta a rodar em qualquer lugar em qualquer SO se tornou apta a rodar em qualquer navegador. O Applet marcou história e levou a internet a um nivel mais utilizável. A facilidade de programar para a web aumentou depois com a Servlet API, a JSP API, e hoje dezenas de frameworks tentam elevar a produtividade da API de Servlets e JSP. Mas os sistemas continuaram orientados a dados. O Banco de Dados reinava soberano, mesmo em sistemas criados com linguagens orientadas a objetos e especialmente em Java.

O primeiro passo para uma quebra de paradigma foi a especificação Enterprise Java Beans (EJB) que em nada se relaciona com a especificação JavaBeans. A EJB trouxe várias vantagens aos programadores Java. Além de aplicações remotas trouxe o primeiro modelo de aplicação que não era orientado a dados. Demorou algum tempo até que alguém avançasse com um nome para esta nova forma de fazer as coisas: modelo orientado ao domínio. Os dados eram agora apenas um terço (no início mais que um terço, já que não existiam Message Beans) de um sistema. Tinham agora que partilhar seu espaço e relevância com a “Sessão”. A sessão foi um conceito forjado em cima das aplicações web quando a importância desdes sistema ficou óbvia. Eles só eram úteis se fosse possível que o navegador submetesse comandos ao servidor e o servidor os identificasse como pertencentes aos mesmo “contexto de trabalho”: a sessão. O conceito foi levado para a EJB com os Session Beans (com estado e sem). Os Session Beans bem se poderia chamar de Service Beans, mas historicamente o termo “serviço” ainda não era usado ou popular (tornou-se popular como a SOA e os WebServices bem mais tarde – onde, claro, os Stateless Session Beans eram os seus pares exatos).

Mas o modelo EJB estava muito à frente do seu tempo (como aliás a maioria dos paradigmas que aparecem pela primeira vez com o Java). Os programadores continuavam pensando e escrevendo programas orientados a dados. Session Beans eram apenas portas remotas por onde enviar os dados ao servidor, e os Entity Beans apenas objetos de dados ultra-complexos. Ninguém percebeu, realmente, que os Entity Beans eram controladores de dados que deveriam cuidar do ciclo de vida do dado (coisa que antes era feita pelos bancos de dados e até por sistemas inteiros) e não representar os dados em si. A Sun, por meio dos seus J2EE Design Patterns tentou explicar como usar a EJB. Vários formatos, padrões e mecanismos de ajuda foram apresentados, mas o sucesso foi aquém do que poderia ter sido se o conceito de “orientação ao domínio” ainda não fosse estranho à maioria dos programadores.

O tempo passou e o modelo EJB começou a ser desprezado. Em aplicações cada vez mais web e cada vez menos dependentes de sistemas legados (i.e. orientados a dados) os programadores tentaram outras tecnologias de mais fácil implementação. Era o boom! dos frameworks. O mais importante foi a aplicação empresarial sem servidor JEE. O Spring com o seu mecanismo de injeção, O Struts com seu mecanismo de produtividade para controle Web e o Hibernate como seu mecanismo de persistência para todos os bancos tornavam o EJB, os padrões J2EE e toda a tecnologia EE obsuleta (quer dizer … evitável ). A remoticidade do EJB nunca pegou de fato em sistema simples. Ela é importante em sistema largamente distribuídos, fortemente transacionais e dependentes de legados coisa que um sistema web raramente é. A EJB, baseda em um paradigma diferente e incógnito até dos próprios idealizadores foi rotulada de complexa, pouco ágil e prolixa.

Isso mudou quando a especificação EJB 3 correu atrás de mudar a sua (má) fama e reformulou a forma como o programador tinha que escrever os Enterpise Beans. Por trás dos panos era a mesma coisa, mas pela frente um espetáculo completamente diferente. Junte-se a isso a popularidade do Hibernate e da especificação JPA e a idéia do JBoss Seams e temos um sistema usando o mesmo modelo do EJB original mas quase sem mexer com nenhuma API especial. Nasce o modelo desacoplado e o conceito de POJO (Plain Old Java Object – que quer significar: objeto Java livre de acoplamento com tecnologias ou frameworks especificos).

Mas mesmo assim, os programadores continuam pensando em termos de dados e bancos. A tecnologia mudou, mas o ciclo continua focado nos dados.

No meio disto, deu-se a renascença do paradigma de orientação a objetos (por oposição ao paradigma orientado a tecnologias). Isso foi facilitado pelo quase abandono da tecnologia EJB e pela popularização do manifesto da metodologia de desenvolvimento Domain Driven-Development (DDD, Desenvolvimento Orientado ao Domínio).

Este poderia ter sido o golpe final nos sistemas orientados a dados, mas não foi. O paradigma anterior ainda é tão poderoso que existem milhares de sistema orientados a dados pelo mundo a fora. Programadores que tentam enveredar por outros caminhos têm o seu caminho dificultado pelos fantasmas dos medos de um paradigma antigo. Mas por que a orientação ao domínio ainda não vingou?

Primeiro, porque muitos ainda pensam na orientação ao domínio como aquilo que a DDD prega. Sim, a DDD tem a sua base na orientação ao domínio, mas ela não é a orientação ao domínio per se . Em uma comparação simples: a filosofia de Kant é uma filosofia, não a filosofia. Da mesma forma a DDD é uma forma de ver e usar a orientação ao domínio, mas apenas uma das muitas.

Segundo, porque os padrões de implementação usados, e necessários nos tempos da EJB (pre-3) como o DAO e ou TO ainda são usados hoje em dia, mesmo quando vão contra o objetivo do sistema ou contra o modelo. Sistemas com múltiplos DAO mediando o ciclo de vida dos dados com o banco ( o real soberano do sistema) utilizando objetos de transferência – meros pacotes de dados glorificados – ainda são os símbolos icónicos do pensamento dos programadores e desenvolvedores. Mesmo quem diz seguir a DDD e a orientação ao domínio ainda os usa como guias para a sua implementação. E mesmo isto levando a distorções – quer dos padrões em si, quer da orientação ao domínio – estes programadores não se preocupam. Com base na idéia de que os fins justificam os meios, qualquer coisas pode ser chamada de qualquer nome e executar qualquer tarefa desde que isso resulte em um sistema que funcione. Como qualquer programador experiente saberá “funcionar” é o menor dos problemas. Programadores não escrevem código que funciona – isso qualquer IDE ou pessoa pode fazer com pouco ou nenhum treino. Programadores escrevem código que se entenda. Que seja facilmente extensível, alterável e útil.

Bom, mas afinal em que a orientação ao domínio é diferente? A primeira coisa é que a orientação ao domínio é, explicitamente, orientada a objetos. O objeto, não os dados, são o principal componente. Repare que os dados são 50% de um objeto: o estado. Os outros 50% – o comportamento – eram largamente espalhados pelos sistemas, resultando em código duplicado de difícil manutenção. Era esse o papel das procedures e dos triggers: serem o comportamento dos dados. O ciclo não está mais preocupado com o CRUD dos dados e sim com a manutenção do estado dos objetos (era isso que os Entity Beans pre-3 faziam). Aliás, nem há mais ciclo. Existe sim um fluxo de comandos (mensagens) entre objetos. Objetos se associam em camadas para prover níveis de acoplamento e encapsulamento diferente e a camada de domínio ganha destaque como o “cerebro” do sistema, a camada que sabe. TO não existem mais já que os próprios objetos têm os dados ‘dentro se si”. Manter os objetos significa implicitamente manter os dados e portanto os TO são dispensáveis. Ou, visto de outra forma, todos os objetos com estado são TO. Explicitá-los é uma tautologia.
Os objetos de serviço ganham o palco. Não são apenas mais uma forma de mexer ou acessar os dados, são eles mesmos cidadãos de primeira linha. Os mais populares, os serviços sem estado. Eles podem fazer qualquer coisa a qualquer momento. A tecnologia subjacente pode interceptar chamadas a eles e injetar capacidades de transação, controle de concorrência, segurança, logging, invocação remota, acoplamento com tencologias e protocolos especificos como CORBA ou SOAP – o que for necessário. O dominio é livre. Não depende de tecnologias, não depende de API, é portável e independente. Não está amarrado a nada nem a ninguém. Não mais DAOs para comunicar com o Banco de Dados. O rei vai nu. O soberano de outrora é agora escravo do domínio, um mero sistema de arquivos glorificado. Tanto o banco de dados perdeu relevância que virou comodity , onde antes era o centro do negócio.

Claro que ainda existem desafios técnicos em um sistema orientado ao domínio. Afinal os dados ainda existem e ainda os queremos preservar. A diferença é que eles não são mais o foco. O foco são os conceitos por detrás das regras do negócio, das “amarrações”. Estruturas de dados e não apena dados. Árvores, coleções, herança, polimorfismo , estratégias, mensagens, scritps dinâmicos, …

Em um sistema orientado ao domínio o comportamento merece o mesmo respeito e cuidado que os dados em si mesmos. A unificação dos dados e dos comportamentos em objetos. Objetos livres. Objetos que são o sistema. O resto é mero serviço de carpintaria e canalização.

Por que orientar o seu sistema a 50% do potencial da plataforma orientada a objetos? Não é isso um desperdício?

Categories: Desenvolvimento, Java
Seguir

Get every new post delivered to your Inbox.