Arquivo de August, 2009
DDD – Fabricando e Encontrando Objetos
por Rodrigo Allemand em Aug.17, 2009, em DDD
Antes de mais nada, este post não é – como nenhumk dos outros desta série – focado extritamente em DDD. Leia o primeiro post da séries para entender melhor…
Em qualquer sistema OO, vc trabalha com….. objetos (ohhhhhhhh)
Qualquer objeto ‘precisa’ ser….. criado antes de ser utilizado…. (ohhhhhhh)
Qual a melhor maneira de se criar objeto? (errr…. humm….. bem…….)
Muitas são as maneiras… usando um construtor, por DI (Dependency Injection), por fábricas, etc.
O mais utilizado são as fábricas, ou Factories conforme catalogado pelo GoF, ou Gang of Four.
Resumidamente, “o padrão Factory fornece uma interface para a criação de famÃlias de objetos correlatos ou dependentes sem a necessidade de especificar a classe concreta destes objetos”.
Diversos exemplos de fábricas existem espalhados pela internet, e eu não vou colocar mais um aqui. Procure, rs!
A motivação inicial do padrão era a criação de objetos complexos, fazendo com que a lógica estivesse toda em um unico lugar… princÃpio de DRY nos promórdios da Arquitetura de Software!
Porém, certos objetos alem de serem complexos, precisavam de um processo de construção demorado. Algumas tecnicas para a sulução deste problema era ‘reter’ o objeto contruido e utilizá-lo como um ponto de acesso único, otimizando assim o processo de construção.
Com isso, por muitas vezes os desenvolvedores juntavam dois padrões de projetos para sanar o problema de contrução complexa e demorada, utilizando Factory e ‘Singletons’ para colocar objetos a disposição do ‘domÃnio’.
Colocar fábricas a disposição dos desenvolvedores, por muitas vezes, mascarava onde realmente estes objetos deveriam ser criados. Poderiam existir inúmeras fábricas em um único projeto, como eu já presenciei num passado não muito distante. Era DaoFactory pra cá, AbstractDaoFactory pra lá, ReportFactory aqui e ServiceFactory acolá! Uma verdadeira macarronada de factories!
Então, como manter um ponto único de acesso para ‘encontrar’ os objetos?
Fowler resolveu colocar tudo em um unico padrão e o nomeou de Registry, ou Registro.
De acordo com Fowler, Registry é
Um objeto conhecido que outros objetos podem usar para encontrar objetos e serviços comuns.
A função do Registro é:
- Criar objetos
- Encapsular complexidades de criação
- Reter objetos criados
- Funcionar como ‘local dos objetos’
Com isso, se você quizer saber ou precisar de um objeto e o seu sistems tem um Registro, pergunte a ele!
Normalmente os Registros são factories e singletons mesclados, conforme o exemplo abaixo:
public MyDomainRegistry{
   private static MyDomainRegistry INSTANCE = null;
   private MyDomainRegistry(){
      loadVariables();
   }
   private static MyDomainRegistry instance(){
      //Coloque aqui a sua implementação de Singleton
      return INSTANCE;
   }
//Posso usar SubDomains
   private ConsultarSubDomain consultarSubDomain;
   //Posso usar Services Services
   private ConversaoService conversaoService;
   //Qualquer objeto que eu queira localizar!
   private MyRepository myRepository;
private void loadVariables(){
      //Aqui vc deve criar os seua objetos como achar melhor
      this.consultarSubDomain = new ConsultarSubDomain();
   }
//Aqui vc coloca os métodos estáticos para retornar
//os objetos que o registro precisa controlar
   public static ConsultarSubDomain consultarSubDomain() {
      return instance().consultarSubDomain;
   }
}
Bem simples, não?
Agora, para você utilizar um objeto, basta solicitar ao registro, assim.
public class FachadaDoDominio {
   private FachadaDoDominio() {
   }
   public static ConsultarSubDomain consultar(){
      return MyDomainRegistry.consultarSubDomain();
   }
}
Comente e Recomende!
De Padawan a Jedi
por Rodrigo Allemand em Aug.10, 2009, em Desenvolvimento
Recentemente um desenvolvedor da minha equipe e eu estavamos conversando sobre como dar soluções bem feitas. Ele se queixava de demorar muito para achar uma solução, construindo e re-construindo por muitas vezes um determinado pedaço de código até chegar a uma solução realmente boa. Refactoring é a saida para um bom código, mas existem outos pontos de falha na sua maneira de programar.
O conhecimento hoje é uma jóia que está a apenas alguns cliques de todos nós. Hoje em dia se aprende desde a fazer arroz a até uma bomba nuclear. Mas como adquirir conhecimento na nossa área? Como programar melhor? Como otimizar o seu tempo de desenvolvimento? Muitas dessas respostas estão a disposição de todos os programadores desde o inicio do ano 2000, numa das melhores -senão a melhor – compilações de boas práticas para a área de desenvolvimento de software.
Trata-se do livro The Pragmatic Programmer, From Journeyman to Master, de Andrew Hunt e David Thomas. Eu já li o livro pelo menos umas duas vezes (falando nisso, preciso entregar o livro ao dono!) e recomendo a quem não leu ainda, seja ele junior ou sênior.
O livro traz uma série de dicas sobre como se tornar um bom programador. Segue um pequeno resumo.
- Preocupe-se em fazer um código bom
- Pense!! Critique o seu trabalho
- Dê opções, não dê desculpas.
- Conserte falhas ao encontrar a falha
- Seja um catalizador de mudanças
- Lembre-se o ‘porquê’ do projeto
- Faça da qualidade um requerimento
- Invista regularmente no seu portifólio de conhecimento
- Analise e critique o que você ouve e vê
- É o que você fala e COMO você fala
- DRY – Don’t Repeat Yourself
- Faça facil para ser reutilizavel
- Elimine efeitos entre coisas não relacionadas
- Não existem decisões finais
- Use traçantes para achar o alvo
- Prototipar para aprender
- Programe para o problema do domÃnio usando a linguagem do domÃnio
- Estime para evitar supresas
- Itere o cronograma com o código
- Deixe o conhecimento em arquivos textos
- Use o poder das linhas de comando
- Use BEM apenas um editor
- Sempre use um controlador de versão
- Resolva o problema, não a culpa
- Não entre em pânico ao debugar
- O problema normalmente não é no ’select’
- Não assuma algo, prove!
- Aprenda uma linguagem de manipulação de texto
- Excreva código que escreva código
- Não, você não pode escrever softwares perfeitos. Proteja o seu código.
- Desenhe soluções baseadas em contratos
- Pegue os problemas precocemente. Teste desde o inicio.
- Use asserções para prevenir o impossivel
- Use exceções apenas para o excepcional
- Termine o que começou
- Minimize acoplamentos entre módulos
- Configure! Não integre!
- Coloque abstração no código e detalhe no metadata
- Analise o workflow para melhorar a concorrências
- Desenhe usando serviços
- Sempre desenhe pensando em concorrência
- Separe a visão do modelo
- Desenhe e conheça o fluxo da informação
- Não programe por concidência
- Estime a complexidade dos seus códigos
- Teste as suas estimações em unidades reais
- Refatore frequentemente, agora e sempre!
- Desenvolva para os testes
- Teste o seu software, ou os usuários testarão
- Não use geradores de código que você não entenda o que foi gerado
- Não apenas leia os requisitos. Mergulhe neles. Escave eles!
- Trabalhe com um usuário para pensar como um usuário
- Abstrações sobrevivem mais do que os detalhes
- Crie um glossário de projeto
- Ache, pense e pese as ‘necessidades’
- Comece quando estiver pronto!
- Algumas coisas são melhores prontas do que descritas
- Não seja escravo da formalidade
- Ferramentas caras não produzem as melhores arquiteturas
- Organize o time por funcionalidades, e não por funções.
- Automatize o que puder ser automatizado.
- Teste frequentemente e automaticamente
- Só está pronto quando o teste roda com sucesso
- Use sabotadores para testar o seu teste
- Não teste apenas o código. Teste as situações do domÃnio
- Ache erros apenas uma vez
- Escreva documentos com os mesmos princÃpios que vc escreve código
- Não separe tanto a documentação do código
- Exceda a espectativa do seu cliente
- Assine o seu trabalho
PS: Qualquer duvida, só comentar que eu detalho os itens.
Comente e Recomende!!