<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CMilfont &#187; Test-Driven development</title>
	<atom:link href="http://www.milfont.org/blog/archives/category/test-driven-development/feed" rel="self" type="application/rss+xml" />
	<link>http://www.milfont.org/blog</link>
	<description>Ultrapassando os limites da web!</description>
	<lastBuildDate>Sun, 03 Apr 2011 15:25:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Meu ambiente de desenvolvimento</title>
		<link>http://www.milfont.org/blog/archives/132</link>
		<comments>http://www.milfont.org/blog/archives/132#comments</comments>
		<pubDate>Tue, 03 Jul 2007 17:41:44 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Test-Driven development]]></category>

		<guid isPermaLink="false">http://www.milfont.org/blog/archives/132</guid>
		<description><![CDATA[Sou questionado constantemente na C&#233;lula JAVA da faculdade LourenÃ§o Filho (da qual fomos os fundadores, eu e o Handerson), sobre o ambiente que uso para desenvolver. Resolvi ent&#227;o criar um post mais direcionado aos novatos para compartilhar essas informa&#231;&#245;es. Como trabalho exclusivamente com JAVA no meu emprego e tenho seguido minha carreira nessa plataforma, meu [...]]]></description>
			<content:encoded><![CDATA[<p>Sou questionado constantemente na <a href="http|//www.milfont.org/blog/?page_id=54">C&eacute;lula JAVA</a> da faculdade <a href="http://www.flf.edu.br/">LourenÃ§o Filho</a> (da qual fomos os fundadores, eu e o Handerson), sobre o ambiente que uso para desenvolver. Resolvi ent&atilde;o criar um post mais direcionado aos novatos para compartilhar essas informa&ccedil;&otilde;es. </p>
<p>Como trabalho exclusivamente com <a href="http://java.sun.com/">JAVA</a> no <a href="http://www.seplag.ce.gov.br/content/aplicacao/sead/pagina_inicial/gerados/pagina_inicial.asp">meu emprego</a> e tenho seguido minha carreira nessa plataforma, meu ambiente se baseia no <a href="http://www.eclipse.org/">Eclipse</a>, a melhor <a href="http://pt.wikipedia.org/wiki/Ambiente_de_Desenvolvimento_Integrado">IDE</a> java do mercado.</p>
<p>No trabalho uso o Windows como S.O. e em casa a dobradinha win/lin dual boot, a maioria dos softwares aqui mencionados funcionam nos dois.</p>
<h1><strong>IDE</strong></h1>
<p>Como mencionado, eu uso como base o <a href="http://www.eclipse.org/">Eclipse</a>. Essa <a href="http://pt.wikipedia.org/wiki/Ambiente_de_Desenvolvimento_Integrado">IDE</a> tem centenas de plugins bons mas tamb&eacute;m tem bastante porcarias, j&aacute; experimentei v&aacute;rios, fiquei com o seguinte ambiente:</p>
<p><a href="http://java.sun.com/javase/downloads/index.jsp">Java 6</a>. Sempre instalo a &uacute;ltima vers&atilde;o, j&aacute; conhe&ccedil;o as novidades e fa&ccedil;o &quot;<a href="http://pt.wikipedia.org/wiki/Programa_Ol%C3%A1_Mundo">rÃªlouordis</a>&quot; para ficar antenado, essa de ficar com java 1.4 instalado n&atilde;o &eacute; interessante, afinal a plataforma sempre mant&eacute;m compatibilidade com as vers&otilde;es passadas de forma extremamente est&aacute;vel (diferente de <a href="http://www.microsoft.com/brasil/msdn/framework/default.mspx">outro ambiente ali</a> que as coisas da vers&atilde;o 2 n&atilde;o rodam as da vers&atilde;o 1, vai entender o que eles entendem por compatibilidade).</p>
<p><a href="http://www.eclipse.org/">Eclipse</a> como IDE base.</p>
<p><a href="http://www.myeclipseide.com/">MyEclipse</a> como su&iacute;te de plugins para desenvolvimento web e JEE, &eacute; o &uacute;nico que n&atilde;o &eacute; open source no meu ambiente de trabalho, mas vale cada centavo. O pre&ccedil;o &eacute; escandalosamente barato para uma ferramenta t&atilde;o boa.</p>
<p><a href="http://www.aptana.org/">Aptana</a>, <a href="http://labs.adobe.com/technologies/jseclipse/">JSEclipse</a> como plugins para html, css e javscript, sendo o &uacute;ltimo exclusivamente para javascript. o MyEclipse tem editores para esses artefatos, mas n&atilde;o s&atilde;o t&atilde;o bons quanto o Aptana, eu ainda prefiro o JsEclipse da Adobe no caso do javascript, mas &eacute; quest&atilde;o meramente pessoal, em termos de features eles s&atilde;o praticamente a mesma coisa. Ultimamente testei o <a href="http://www.spket.com/">Spket</a> apenas por curiosidade, por ele j&aacute; trazer uma integra&ccedil;&atilde;o com o <a href="http://extjs.com/">Ext</a>, mas ele n&atilde;o tem diferencial comparado ao Aptana ou mesmo ao JSEclipse.</p>
<h1><strong>Container JEE</strong> </h1>
<p><a href="http://tomcat.apache.org/">Tomcat 6</a> como container web <a href="http://java.sun.com/javaee/">JEE</a>. Por quest&otilde;es de pol&iacute;tica do meu trabalho tenho que usar o <a href="http://www.oracle.com/appserver/index.html">Oracle AS10g</a> como servidor de aplica&ccedil;&otilde;es, preferiria o <a href="http://labs.jboss.com/">JBoss</a> por in&uacute;meros fatores (indiferente de quest&otilde;es filos&oacute;ficas), mas uso o tomcat para testar todas as aplica&ccedil;&otilde;es. Obviamente temos que nos policiar quanto &agrave;s &uacute;ltimas novidades porque a Oracle sempre est&aacute; alguns passos atr&aacute;s (medidos em vers&otilde;es) dos outros servidores. N&atilde;o temos nenhuma aplica&ccedil;&atilde;o (pelo menos sob minha orienta&ccedil;&atilde;o) que use EJB, como n&atilde;o temos nenhum sistema distribu&iacute;do e dificilmente ter&iacute;amos (pelo contexto do nosso trabalho), nunca tivemos tal necessidade. </p>
<h1><strong>Banco de dados</strong></h1>
<p><a href="http://www.oracle.com/database/index.html">Oracle 10g</a>. Diferente do servidor de aplica&ccedil;&otilde;es, o banco da Oracle na minha concep&ccedil;&atilde;o &eacute; o melhor que existe (alguns dizem que &eacute; o <a href="http://www-306.ibm.com/software/data/db2/">IBM DB2</a>, mas eu acho o Oracle). Mas mantenho o brinquedo <a href="http://www.mysql.org/">MySQL</a> instalado para testar as coisas devido a facilidade de instala&ccedil;&atilde;o e manipula&ccedil;&atilde;o. </p>
<p>Uso o programa <a href="http://www.dbvis.com/products/dbvis/">DbVisualizer</a> (que &eacute; feito em java) para trabalhar diretamente com os bancos de dados. Ele tem recursos menores se comparado &agrave;s ferramentas nativas que s&atilde;o disponibilizadas pelas Players dos pr&oacute;prios bancos, mas como acessa todos os bancos que acesso diretamente: <a href="http://www.microsoft.com/brasil/servidores/sql/default.mspx">SQL Server</a> (legado), MySQL (testes) e Oracle (produ&ccedil;&atilde;o e desenvolvimento), tenho prefer&ecirc;ncia por ele. </p>
<h1><strong>Integra&ccedil;&atilde;o Cont&iacute;nua</strong></h1>
<p>N&atilde;o temos um ambiente  que enfatize a <a href="http://www.improveit.com.br/xp/praticas/integracao">integraÃ§Ã£o contÃ­nua</a> e <a href="http://www.improveit.com.br/xp/manifesto_agil">metodologias Ã¡geis</a>, nossa metodologia tem como base ainda se espelhar no <a href="http://www-306.ibm.com/software/rational/">IBM</a> <a href="http://pt.wikipedia.org/wiki/Rational_Unified_Process">RUP</a> (apesar de n&atilde;o ser o <a href="http://pt.wikipedia.org/wiki/Rational_Unified_Process">RUP</a>).</p>
<p>Usamos o <a href="http://www.dotproject.net/">DotProject</a> (provisoriamente) como <a href="http://pt.wikipedia.org/wiki/Ger%C3%AAncia_de_projetos">gerenciador dos projetos</a>. N&atilde;o &eacute; a melhor ferramenta, ali&aacute;s &eacute; muito fraca de ser considerada uma boa ferramenta, mas por enquanto o custo/benef&iacute;cio dela est&aacute; falando mais alto, mas j&aacute; existem movimentos de substitu&iacute;-la. Esse &eacute; um exemplo de que a filosofia n&atilde;o deve falar mais alto que os aspectos t&eacute;cnicos, t&iacute;nhamos uma base no uso do <a href="http://office.microsoft.com/pt-br/project/default.aspx">MSProject</a>, que &eacute; muito superior ao DotProject, mas foi relegado em nome do <a href="http://pt.wikipedia.org/wiki/Software_livre">Software Livre</a> pela desculpa dos custos. Esse &eacute; um ponto onde o SL sempre perde pontos. Talv&ecirc;s existam softwares livres melhores que o DotProject que poderiam ter sido comparados ao MSProject, mas trocar um software que est&aacute; funcionando corretamente por quest&otilde;es de custos n&atilde;o &eacute; uma boa alternativa, afinal o <a href="http://pt.wikipedia.org/wiki/Roi">ROI</a> medido posteriormente desmere&ccedil;a essa troca.</p>
<p>Nosso <a href="http://pt.wikipedia.org/wiki/Sistema_de_controle_de_vers%C3%A3o">sistema de controle de versÃµes</a> &eacute; o velho e fant&aacute;stico <a href="http://pt.wikipedia.org/wiki/CVS">CVS</a> que j&aacute; tem suporte  nativo excelente no Eclipse, mas vamos mudar para o <a href="http://pt.wikipedia.org/wiki/SVN">SVN</a> nesses pr&oacute;ximos dias, posteriormente blogarei sobre essa mudan&ccedil;a. Existe uma equipe que trabalha com o <a href="http://msdn2.microsoft.com/en-us/vstudio/aa718670.aspx">MSSourceSafe</a> que dever&aacute; usar o SVN tamb&eacute;m, vamos ver o que vai sair dessa mudan&ccedil;a, sinceramente eu n&atilde;o tenho opini&atilde;o final formada sobre isso. Acredito que pode n&atilde;o ser uma boa id&eacute;ia, j&aacute; que essa equipe trabalha com <a href="http://www.microsoft.com/brasil/msdn/framework/default.mspx">DotNet</a> e a integra&ccedil;&atilde;o entre o <a href="http://msdn2.microsoft.com/pt-br/vstudio/default.aspx">VisualStudio</a> e o <a href="http://msdn2.microsoft.com/en-us/vstudio/aa718670.aspx">Sourcesafe</a> seja bem melhor (evidente) que com o SVN, vamos ver. </p>
<p>Como eu mencionei, n&atilde;o enfatizamos (infelizmente) os m&eacute;todos &aacute;geis, mas tento seguir as <a href="http://www.improveit.com.br/xp/praticas">boas pr&aacute;ticas</a> do <a href="http://www.improveit.com.br/xp">XP</a>, como n&atilde;o tenho um sistema de gera&ccedil;&atilde;o de builds, tento controlar usando o velho <a href="http://ant.apache.org/">Apache</a> <a href="http://pt.wikipedia.org/wiki/Apache_Ant">Ant</a> mesmo, tenho um script antig&atilde;o aqui que coordena o processo inteiro, quem sabe n&atilde;o tenhamos um <a href="http://en.wikipedia.org/wiki/CruiseControl">CruiseControl</a> por a&iacute; em breve (que seria um salto extraordin&aacute;rio), quem sabe. </p>
<p>Agora nosso &quot;<em>Calcanhar de Aquiles</em>&quot; &eacute; o <a href="http://en.wikipedia.org/wiki/Issue_tracking">sistema de Issue Tracking</a> daqui, &eacute; uma solu&ccedil;&atilde;o <em><a href="http://en.wikipedia.org/wiki/In_house">In House</a></em> H-O-R-R-&Iacute;-V-E-L (como ficou <del>gay</del> meigo essa declara&ccedil;&atilde;o). J&aacute; est&aacute; sendo providenciado outra solu&ccedil;&atilde;o, mas <em>In House</em> tamb&eacute;m o que &eacute; uma pena devido a <a href="http://en.wikipedia.org/wiki/Comparison_of_issue_tracking_systems">enorme lista</a> de sistemas excelentes que existem por a&iacute;. </p>
<h1><strong>Last But Not Least&#8230;</strong> </h1>
<p>O mais importante n&atilde;o &eacute; montar um ambiente de desenvolvimento ou simplesmente achar que conseguir&aacute; manter o mesmo pelo resto da vida e sim ter consci&ecirc;ncia de quais s&atilde;o as necessidades e como suplant&aacute;-las sempre procurando a melhor ferramenta que se adapte aos seus projetos. Espero que esse post ajude aos novatos como um passo inicial para pesquisar sobre aquilo que melhor o satisfaz na busca por um ambiente produtivo. </p>
<p><!--0cce417823d26f15773321a640bece89--><!--08762e7644bc460a8cbc89e709001567--><!--82b7a5df62a8dceedbf5fe1d9de0ed14--><!--dc6ab8f978934b58da552ca26b2f9796--><!--3857825278e84f4ca26edd2d882df0fc--><!--08762e7644bc460a8cbc89e709001567--><!--fb070eaf98f6a84fc807d09b84f00da1--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/132/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Persistencia em um domain model</title>
		<link>http://www.milfont.org/blog/archives/31</link>
		<comments>http://www.milfont.org/blog/archives/31#comments</comments>
		<pubDate>Thu, 18 May 2006 03:24:46 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Test-Driven development]]></category>

		<guid isPermaLink="false">http://www.amigos-list.org/~cmilfont/?p=31</guid>
		<description><![CDATA[Ultimamente estou usando uma abordagem diferente para a persistÃªncia. vinha adotando os pattern de ActiveRecord e Repository alÃ©m do DataMapper popularmente conhecido como DAO. AperfeiÃ§oei com essa dica do CV no guj. Apesar da persistÃªncia ser arquitetural e teoricamente nÃ£o fazer parte do dominio dos seus processos de negÃ³cios, invariavelmente Ã© a maior preocupaÃ§Ã£o na [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estou usando uma abordagem diferente para a persistÃªncia. vinha adotando os pattern de <a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">ActiveRecord</a> e <a href="http://www.martinfowler.com/eaaCatalog/repository.html">Repository</a> alÃ©m do <a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html">DataMapper</a> popularmente conhecido como DAO. AperfeiÃ§oei com essa dica do <a href="http://www.guj.com.br/posts/list/15/20668.java">CV</a> no guj.<br />
Apesar da persistÃªncia ser arquitetural e teoricamente nÃ£o fazer parte do dominio dos seus processos de negÃ³cios, invariavelmente Ã© a maior preocupaÃ§Ã£o na construÃ§Ã£o de um software o &#8220;como&#8221; e &#8220;onde&#8221; um objeto tem que mudar seu estado persistido. Em outras palavras como isolar a persistÃªncia de seu domain model para que a transparÃªncia dessa operaÃ§Ã£o diminua o cÃ³digo sem aumentar os pontos de manutenÃ§Ã£o com alta coesÃ£o e fraco acoplamento.</p>
<p><strong>Estados do objeto</strong><br />
Os objetos do ponto de vista do modelo de um processo apresentam estados, como excluÃ­do, alterado e criado. Podemos adotar o conceito de Active Record no domain model e fazer com que seus objetos implementem uma interface que sem criatividade no momento chamarei de ActiveRecord:</p>
<pre>
public interface ActiveRecord {
	public void carregado();
	public void novo();
	public void alterado();
	public void excluido();
}
</pre>
<p>Podemos entÃ£o criar uma classe abstrata seguindo o pattern <a href="http://www.guj.com.br/java.coluna.7.1.guj">Template Method</a> para criar uma estrutura bÃ¡sica para todos nossos objetos que chamarei de AbstractActiveRecord:</p>
<pre>
public abstract class AbstractActiveRecord < t extends AbstractActiveRecord >
		implements ActiveRecord {

	public void carregado() {
		Repository.carregar(this);
	}

	public void alterado() {
		Repository.alterar(this);
	}
...
}
</pre>
<p>Resolvi chamar o Repository dentro do Template do ActiveRecord para deixar isolado os DAOs da aplicaÃ§Ã£o de criar apenas um ponto de manutenÃ§Ã£o em comum.<br />
O conceito de Repository deixa o sistema isolado da infraestrutura de persistÃªncia funcionando como um espÃ©cie de banco de dados em memÃ³ria que os objetos se dirigem ao perguntar por alguÃ©m (AlguÃ©m esse referente a uma entidade do dominio).<br />
Observe que as classes do meu sistema devem extender a classe AbstractActiveRecord e implentar a interface ActiveRecord, mas isso nÃ£o Ã© se prender a um framework, porque essas classes fazem parte do dominio apesar de existirem para resolver um problema arquitetural, elas sÃ£o do meu sistema, e estÃ£o independente de infraestrutura porque sÃ£o relativos do dominio de qualquer forma.<br />
Uma entidade do meu sistema fica assim:</p>
<pre>
public final class Cliente extends AbstractActiveRecord implements ActiveRecord {
	private int id;
	private String nome;
	private String cpf;
	//gets e sets
}
</pre>
<p>O <a href="http://www.fragmental.com.br">Shoes</a> tinha me dado um conselho de usar o Repository junto com o Active Record e DataMapper a um tempo atrÃ¡s para isolar o modelo da persistÃªncia principalmente na lista de entidades, exemplo:<br />
Cliente cliente = RepositorioClientes.carregaListaClientes();<br />
Mas eu resolvi criar um repositÃ³rio genÃ©rico para todas as entidades e dentro dele inserir uma chamada a uma fÃ¡brica de DAOs apropriado dependendo do tipo o objeto. CÃ³digo do meu Repository:</p>
<pre>
public abstract class Repository {
	public static void carregar(ActiveRecord record) {
		System.out.println("carregou quem? " + record.getClass().getName());
		//faz o trabalho de persistencia... pode fazer injeÃ§Ã£o etc...
		//pode chamar uma Fabrica para criar o DAO a partir da classe
		// FabricaDAO.criarDAO(record.getClass());
	}
...
}
</pre>
<p>realizando um teste simples para ver como se comportaria:</p>
<pre>
public class TransacaoTest extends TestCase {
	public void testTransacao(){
		Cliente christiano = new Cliente();
		christiano.setNome("christiano");
		christiano.setCpf("999.999.999-99");
		christiano.novo();
		assertEquals(1, christiano.getId());
		//acontece mais algumas coisas...
		//e lÃ¡ pelas tantas...
		christiano.setNome("Christiano Martins");
		christiano.alterado();
		assertEquals("Christiano Martins", christiano.getNome());
	}
}
</pre>
<p>O resultado foi como esperado, o processo vai modificando o estado dos objetos durante a transaÃ§Ã£o e tornando o cÃ³digo mais legÃ­vel, evitando chamar DAO dentro do meu modelo ou misturar cÃ³digo de framework como Hibernate ao meu domÃ­nio.<br />
Com exemplos simples em transaÃ§Ã£o praticamente CRUD a coisa funciona legal, quando precisamos alterar ou pra Lazy Loading ou Eager Loading dependendo do padrÃ£o da aplicaÃ§Ã£o (deixo como padrÃ£o lazy), passamos um parÃ¢metro para a estrutura como por exemplo:</p>
<pre>
normal
Cliente cliente = new Cliente(10); // esse construtor jÃ¡ invoca a estrutura e carrega as informaÃ§Ãµes
com lazy Loading
Cliente cliente = new Cliente(10, ActiveRecord.LAZY_LOADING);
...
Construtor normal:
	public Cliente(int id) {
		super();
		this.id = id;
		this.carregado();
	}
Construtor parametrizavel
	public Cliente(int id, int LOADED_PARAMETER) {
		super();
		this.id = id;
		this.carregado(LOADED_PARAMETER);
	}
...
</pre>
<p>De qualquer forma podemos criar uma estrutura de modelo do domÃ­nio do meu processo isolada da arquitetura tecnolÃ³gica facilitando a manutenÃ§Ã£o com padrÃµes de projetos simples, cÃ³digo mais enxuto e transparÃªncia nas transaÃ§Ãµes.<!--a6704c645b4757c59d86220d0229e457--><!--977d552da37d85b8b0399295b39fa09e--><!--8aef7dcd6e13efc1dd871500c9982b88--><!--b3555539e9fc0f280646d3e8ccf974e0--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/31/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Livros, opÃ§Ãµes&#8230;</title>
		<link>http://www.milfont.org/blog/archives/29</link>
		<comments>http://www.milfont.org/blog/archives/29#comments</comments>
		<pubDate>Wed, 12 Apr 2006 17:53:17 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Test-Driven development]]></category>

		<guid isPermaLink="false">http://www.amigos-list.org/~cmilfont/?p=29</guid>
		<description><![CDATA[Caros, venho por meio desta apresentar mais dois livros. Recentemente falei que nÃ£o comprava mais livro traduzido, eis que posso queimar minha lÃ­ngua enorme! O Dalton Camargo do JavaFree participou da traduÃ§Ã£o do livro Spring in Action , veja o link de como comprar na promoÃ§Ã£o. Outro bom material que folhiei recentemente e vou comprÃ¡-lo [...]]]></description>
			<content:encoded><![CDATA[<p>Caros, venho por meio desta apresentar mais dois livros.<br />
Recentemente falei que nÃ£o comprava mais livro traduzido, eis que posso queimar minha lÃ­ngua enorme! O Dalton Camargo do <a href="http://javafree.org/index.jf">JavaFree</a> participou da traduÃ§Ã£o do livro <a href="http://www.amazon.com/gp/product/1932394354/sr=8-1/qid=1144863090/ref=pd_bbs_1/103-1116690-4140602?%5Fencoding=UTF8">Spring in Action</a> , veja o <a href="http://javafree.org/news/view.jf?idNew=2818">link</a> de como comprar na promoÃ§Ã£o.</p>
<p>Outro bom material que folhiei recentemente e vou comprÃ¡-lo Ã© o livro do <a href="http://www.improveit.com.br/vinicius.jsp">VinÃ­cius ManhÃ£es Teles</a>, <a href="http://www.improveit.com.br/livroxp.jsp">Extreme Programming</a>. </p>
<p>Mas como jÃ¡ falei prefiro material gerado no Brasil, por razÃµes simples, o conhecimento Ã© adaptado Ã s nossas realidades, desde que esse material seja bom devo ressaltar, e esse livro Ã© bom&#8230; bom nÃ£o, Ã³timo.<!--c93cad58382aeb9f0a22d2d1e22d19a2--><!--c5e390ee2a8b55a550b6c2766bd7709d--><!--47d1e1384b7e06edf529e4c758bd78eb--><!--1c2391278a8a8a6c679e595fa97bd4cb--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/29/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Applying best practices &#8211; How to develop object-oriented&#8230;</title>
		<link>http://www.milfont.org/blog/archives/25</link>
		<comments>http://www.milfont.org/blog/archives/25#comments</comments>
		<pubDate>Tue, 21 Mar 2006 17:16:33 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Test-Driven development]]></category>

		<guid isPermaLink="false">http://www.amigos-list.org/~cmilfont/?p=25</guid>
		<description><![CDATA[Ultimamente tenho estudado os autores clÃ¡ssicos de desenvolvimento Ã¡gil como Kent Beck, Martin Fowler, Robert C. Martin, etc e sofrido bastante. Tendo revisto meus projetos anteriores vi como minha modelagem se baseava no AnemicDomainModel como citado nesse artigo do Fowler. Todos meus sistemas se pareciam como uma implementaÃ§Ã£o do catÃ¡logo de patterns da SUN como [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente tenho estudado os autores clÃ¡ssicos de desenvolvimento Ã¡gil como Kent Beck, Martin Fowler, Robert C. Martin, etc e sofrido bastante. Tendo revisto meus projetos anteriores vi como minha modelagem se baseava no AnemicDomainModel como citado nesse <a href="http://martinfowler.com/bliki/AnemicDomainModel.html">artigo</a> do Fowler.<br />
Todos meus sistemas se pareciam como uma implementaÃ§Ã£o do catÃ¡logo de patterns da SUN como se aquilo fosse uma interface.<br />
Recentemente tive oportunidade de ser o responsÃ¡vel por todo o ciclo de desenvolvimento de um projeto pequeno com poucos requisitos funcionais, tinha ao todo uns 10 casos de usos tirando o aspecto CRUD da aplicaÃ§Ã£o.<br />
Pude realizar algumas experiÃªncias com conceitos que eu estava estudando a algum tempo e alguns que eu conhecia mas nunca tivera oportunidade de implementar.<br />
Estou planejando um artigo mais elaborado sobre essa experiÃªncia, mas por enquanto posso adiantar alguns sentimentos sobre tudo isso.</p>
<p><strong>Test-Driven Development</strong><br />
Essa prÃ¡tica do XP realmente Ã© muito mais produtivo, eu sempre realizei os testes depois que as classes estavam desenhadas e atÃ© com mÃ©todos implementados, mas nesse sistema eu simplesmente aboli os diagramas de classes da UML, tentei fazer tudo radicalmente, fui separando as classes que eu achava que existiam no dominio da aplicaÃ§Ã£o com cartÃµes CRC, mas depois abandonei os cartÃµes e fui direto para os &#8220;Unit Tests&#8221;, outro princÃ­pio que segui do XP foi fazer os casos de uso importantes primeiro, CRUD eu nem toquei, o banco de dados foi a Ãºltima coisa que fiz. Fui criando os Unit Tests (UT) e os objetos foram surgindo naturalmente a partir dos requisitos funcionais que respondiam pela cerne do sistema, quando terminei o modelo praticamente tinha o sistema concluido, apesar de nÃ£o ter nenhum select implementado. Nesse momento eu nÃ£o sabia como seria a performance ou se teria que refatorar tudo aquilo para se adequar ao banco mas sentia que a aplicaÃ§Ã£o estava terminada, diferente de todas as vezes onde fiz os CRUDs primeiro (que correspodem por cerca de 80% das aplicaÃ§Ãµes ou mais)  e praticamente via um tÃºnel sem fim pela frente.</p>
<p><strong>Domain Model</strong><br />
Meu modelo criou classes que a muito tempo nÃ£o via (acho que desde os sisteminhas de locadora da faculdade). Minhas classes nÃ£o sÃ£o apenas tabelas em memÃ³ria como repositÃ³rio de dados, elas conhecem suas responsabilidades e seus dados como descrito <a href="http://martinfowler.com/eaaCatalog/domainModel.html">nesse</a> pattern do Fowler, acredito que as classes criaram atÃ© sentimentos (risos!).<br />
Minha forma de pensar era um Bean que mais parecia uma tabela e que viajava da persistencia atÃ© o jsp, furando tudo pelo caminho, entÃ£o dessa forma pude testar todo o sistema praticamente de minhas classes de testes no JUnit usando refactoring a todo momento e criando um modelo estÃ¡vel e que realmente estÃ¡ testado e terminado. Minhas classes sabem fazer o que tem que ser feito, ou seja, elas tem suas responsabilidades, olha sÃ³ essa frase:</p>
<p> Procedural code gets information then<br />
 makes decisions. Object-oriented code tells<br />
 objects to do things.<br />
   &#8212; Alec Sharp</p>
<p>Acho que jÃ¡ to programando OO!</p>
<p><strong>Design by contracts</strong><br />
Pude implementar os conceitos DbC nesse projeto, aliÃ¡s quando voce desenvolve criando os testes primeiro isso flui quase que naturalmente, basta uma polida nos conceitos e pronto, um bom lugar para isso Ã© esse <a href="http://fragmental.com.br/wiki/index.php?title=Contratos_Nulos">artigo</a> do Phillip CalÃ§ado sobre o tema.</p>
<p><strong>Futuro</strong><br />
Algumas coisas nÃ£o puderam ser implementadas como Dependency Injection, Aspect Oriented Programming, Pair Programming, Continuos Integration, etc. Esses conceitos vÃ£o ficar para os prÃ³ximos projetos, pretendo adotar Hibernate e Spring na prÃ³xima e ver o que essas boas prÃ¡ticas sÃ£o capazes, vou primeiro tentar convencer minha equipe a adotar o XP como metodologia, aÃ­ veremos, qualquer coisa esses conceitos jÃ¡ me foram uteis, aguardem novidades.<!--8ca05bb49596e922781f36b1d14f8ba1--><!--aa55a5a786c23e6838c98a604deea198--><!--db554559bae17aaa7258c17e3956f852--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/25/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

