{"id":6,"date":"2006-05-01T01:14:21","date_gmt":"2006-05-01T00:14:21","guid":{"rendered":"http:\/\/www.dtsato.com\/blog\/default\/Agile\/XP\/?permalink=TDD-em-Combate-Parte-1.html"},"modified":"2006-05-01T01:14:21","modified_gmt":"2006-05-01T00:14:21","slug":"tdd-em-combate-parte-1","status":"publish","type":"post","link":"https:\/\/www.dtsato.com\/blog\/2006\/05\/01\/tdd-em-combate-parte-1\/","title":{"rendered":"TDD em Combate &#8211; Parte 1"},"content":{"rendered":"<p>Voc\u00ea j\u00e1 ouviu falar em <b class=\"bold\">Desenvolvimento Orientado a Testes<\/b> (ou TDD)? J\u00e1 escreveu testes antes do c\u00f3digo? Esta \u00e9 a primera parte de uma s\u00e9rie onde aplicaremos as id\u00e9ias de TDD num exemplo pr\u00e1tico, desenvolvendo um cl\u00e1ssico jogo de tabuleiro que n\u00e3o depende da sorte, mas sim da estrat\u00e9gia: <b class=\"bold\">Combate<\/b>.<\/p>\n<h3 class=\"heading-1\">Introdu\u00e7\u00e3o<\/h3>\n<p class=\"paragraph\"\/>Conforme eu adiantei no <span class=\"nobr\"><a href=\"http:\/\/www.dtsato.com\/blog\/default\/Agile\/XP\/?permalink=Design-Incremental-em-XP.wiki&#38;smm=y\">\u00faltimo post<\/a><\/span>, come\u00e7aremos hoje um exemplo de aplica\u00e7\u00e3o de <span class=\"nobr\"><a href=\"http:\/\/www.testdriven.com\">TDD<\/a><\/span> num exemplo pr\u00e1tico. Essa id\u00e9ia come\u00e7ou quando um colega de trabalho, Rodrigo (mais conhecido como <i class=\"italic\">RBP<\/i> ou simplesmente <i class=\"italic\">R<\/i>), sugeriu fazermos uma r\u00e1pida sess\u00e3o de <span class=\"nobr\"><a href=\"http:\/\/www.pairprogramming.com\">Programa\u00e7\u00e3o Pareada<\/a><\/span>, para que eu mostrasse na pr\u00e1tica como programar os testes antes do c\u00f3digo. Desde ent\u00e3o, discutimos alguns problemas simples, por\u00e9m interessantes (e por que n\u00e3o divertidos?), que poder\u00edamos utilizar no nosso exemplo, chegando ao cl\u00e1ssico jogo de tabuleiro <span class=\"nobr\"><a href=\"http:\/\/www.ludomania.com.br\/Modernos\/combate.html\">Combate<\/a><\/span>.<\/p>\n<p class=\"paragraph\"\/>Seguindo o exemplo de <span class=\"nobr\"><a href=\"http:\/\/www.xprogramming.com\/\">Ron Jeffries<\/a><\/span> de ensinar TDD atrav\u00e9s de exemplos (desenvolvendo um programa para calcular o total de pontos em uma <span class=\"nobr\"><a href=\"http:\/\/www.xprogramming.com\/xpmag\/acsBowling.htm\">partida de boliche<\/a><\/span>), come\u00e7aremos hoje falando sobre os princ\u00edpios de TDD e sobre as regras do Combate. Ainda na linha experimental e educativa dessa s\u00e9rie de posts, vou aproveitar os conhecimentos do RBP e aprenderei um pouco de <span class=\"nobr\"><a href=\"http:\/\/www.python.org\/\">Python<\/a><\/span>. Ainda n\u00e3o sabemos quantos posts ser\u00e3o necess\u00e1rios e nem se estamos sendo ambiciosos demais, por\u00e9m nossa id\u00e9ia \u00e9 mostrar o crescimento incremental da aplica\u00e7\u00e3o, podendo at\u00e9 se transformar em algo &#8220;jog\u00e1vel&#8221; (com interface gr\u00e1fica e funcionando em rede).<\/p>\n<h3 class=\"heading-1\">Regras do jogo: TDD &#8211; <i class=\"italic\">Test Driven Development<\/i><\/h3>\n<p class=\"paragraph\"\/>O <b class=\"bold\">Desenvolvimento Orientado a Testes<\/b> \u00e9 uma t\u00e9cnica para programadores (e n\u00e3o para testadores), cujo objetivo \u00e9 a melhoria cont\u00ednua do design. Essa t\u00e9cnica \u00e9 fortemente baseada em testes automatizados, que s\u00e3o escritos antes do c\u00f3digo, influenciando e orientando o design e a divis\u00e3o das responsabilidades entre as classes do sistema. Dessa forma sua aplica\u00e7\u00e3o evolui em passos pequenos construindo apenas o design necess\u00e1rio para atender aos requisitos atuais do sistema. Como efeito colateral, voc\u00ea acaba desenvolvendo uma bateria de testes automatizados que pode ser executada a qualquer momento e que funciona como uma rede de prote\u00e7\u00e3o na hora em que as mudan\u00e7as come\u00e7arem a aparecer (e elas ir\u00e3o aparecer).<\/p>\n<p class=\"paragraph\"\/>Quando desenvolvo com TDD, me vejo muito mais preocupado com decis\u00f5es de design do que quando utilizo uma abordagem diferente para codifica\u00e7\u00e3o. Ao escrever os testes do ponto de vista de um cliente da classe em quest\u00e3o, as preocupa\u00e7\u00f5es com encapsulamento, divis\u00e3o de responsabilidade e colabora\u00e7\u00e3o entre as classes se fazer muito mais presentes. Al\u00e9m disso, ao contr\u00e1rio do que possa parecer, desenvolver os testes junto com o c\u00f3digo traz um aumento na produtividade, pois evita desperd\u00edcios futuros com depura\u00e7\u00e3o, reduz riscos durante a integra\u00e7\u00e3o e melhora o design geral da aplica\u00e7\u00e3o, investindo somente o necess\u00e1rio um pouco antes e um pouco depois da implementa\u00e7\u00e3o (evitando generaliza\u00e7\u00f5es desnecess\u00e1rias).<\/p>\n<p class=\"paragraph\"\/>O <b class=\"bold\">Densenvolvimento Orientado a Testes<\/b> imp\u00f5e um ritmo constante e incremental baseado em passos pequenos. O passo inicial \u00e9 pensar um pouco sobre o que ser\u00e1 desenvolvido e elaborar uma pequena lista dos testes que ser\u00e3o implementados. O ritmo de TDD pode ser resumido num ciclo de itera\u00e7\u00f5es com os seguintes passos principais:<\/p>\n<ol>\n<li><b class=\"bold\">Vermelho<\/b> &#8211; Escreva um teste que falha (execute-o e veja falhar, para garantir que estar\u00e1 implementando algo relevante)<\/li>\n<li><b class=\"bold\">Verde<\/b> &#8211; Rapidamente, fa\u00e7a o teste passar (Escreva apenas o c\u00f3digo necess\u00e1rio para que o teste passe, lembre-se: n\u00e3o se preocupe com o que <span class=\"nobr\"><a href=\"http:\/\/www.c2.com\/cgi\/wiki?YouArentGonnaNeedIt\"> voc\u00ea n\u00e3o vai precisar<\/a><\/span>)<\/li>\n<li><b class=\"bold\">Refatore<\/b> &#8211; Refatore para eliminar duplica\u00e7\u00e3o e aumentar a expressividade do c\u00f3digo. Evolua em dire\u00e7\u00e3o ao design simples, reduzindo o acoplamento e aumentando a coes\u00e3o.<\/li>\n<\/ol>\n<p>Por fim, algumas recomenda\u00e7\u00f5es: <b class=\"bold\">nunca<\/b> escreva mais de um teste por vez e <b class=\"bold\">nunca<\/b> refatore no vermelho.<\/p>\n<h3 class=\"heading-1\">Regras do Jogo: Combate<\/h3>\n<p class=\"paragraph\"\/><b class=\"bold\">Combate<\/b> (ou <span class=\"nobr\"><a href=\"http:\/\/en.wikipedia.org\/wiki\/Stratego\">Stratego<\/a><\/span>) \u00e9 um jogo de estrat\u00e9gia, jogado num tabuleiro de 10&#215;10 entre 2 jogadores, cada um com 40 pe\u00e7as representando os oficiais de um ex\u00e9rcito (e suas respectivas patentes). As pe\u00e7as s\u00e3o posicionadas de qualquer forma nas primeiras 4 fileiras de cada jogador, de forma que o advers\u00e1rio n\u00e3o saiba distinguir o valor de cada pe\u00e7a. O objetivo do jogo \u00e9 capturar a bandeira do advers\u00e1rio ou deix\u00e1-lo com t\u00e3o poucas pe\u00e7as que n\u00e3o possa se mover no tabuleiro.<\/p>\n<p class=\"paragraph\"\/>Cada jogador move uma pe\u00e7a no seu turno (tanto na horizontal quanto na vertical). Todas as pe\u00e7as, com exce\u00e7\u00e3o dos <i class=\"italic\">soldados<\/i>, s\u00f3 podem se mover 1 quadrado por vez. Se uma pe\u00e7a \u00e9 movida para um espa\u00e7o ocupado pelo advers\u00e1rio, suas patentes s\u00e3o reveladas e a mais fraca \u00e9 removida do tabuleiro. Em caso de empate, ambas as pe\u00e7as s\u00e3o removidas. O valor num\u00e9rico determina o vencedor na maioria dos casos, por\u00e9m existem pe\u00e7as especiais: as <i class=\"italic\">bombas<\/i> (n\u00e3o se movem e eliminam qualquer outra pe\u00e7a, exceto o <i class=\"italic\">cabo-armeiro<\/i>), a <i class=\"italic\">bandeira<\/i> (n\u00e3o se move) e o <i class=\"italic\">espi\u00e3o<\/i> (a \u00fanica pe\u00e7a que vence quando ataca o <i class=\"italic\">marechal<\/i>, por\u00e9m perde para qualquer pe\u00e7a que o atacar, incluindo o pr\u00f3prio <i class=\"italic\">marechal<\/i>).<\/p>\n<p class=\"paragraph\"\/>A quantidade de pe\u00e7as de cada jogador, em ordem de patente (da mais forte para a mais fraca), \u00e9:<\/p>\n<p class=\"paragraph\"\/>\n<table class=\"wiki-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n<tr>\n<th><i class=\"italic\">Rank<\/i><\/th>\n<th>&#160;<\/th>\n<th>Pe\u00e7a<\/th>\n<th>&#160;<\/th>\n<th>Qtd<\/th>\n<th>&#160;<\/th>\n<th>Observa\u00e7\u00e3o<\/th>\n<\/tr>\n<tr class=\"table-odd\">\n<td><b class=\"bold\">10<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Marechal<\/i><\/td>\n<td>&#160;<\/td>\n<td>1<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-even\">\n<td><b class=\"bold\">09<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">General<\/i><\/td>\n<td>&#160;<\/td>\n<td>1<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-odd\">\n<td><b class=\"bold\">08<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Coronel<\/i><\/td>\n<td>&#160;<\/td>\n<td>2<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-even\">\n<td><b class=\"bold\">07<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Major<\/i><\/td>\n<td>&#160;<\/td>\n<td>3<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-odd\">\n<td><b class=\"bold\">06<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Capit\u00e3o<\/i><\/td>\n<td>&#160;<\/td>\n<td>4<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-even\">\n<td><b class=\"bold\">05<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Tenente<\/i><\/td>\n<td>&#160;<\/td>\n<td>4<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-odd\">\n<td><b class=\"bold\">04<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Sargento<\/i><\/td>\n<td>&#160;<\/td>\n<td>4<\/td>\n<td>&#160;<\/td>\n<td>&#160;<\/td>\n<\/tr>\n<tr class=\"table-even\">\n<td><b class=\"bold\">03<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Cabo-Armeiro<\/i><\/td>\n<td>&#160;<\/td>\n<td>5<\/td>\n<td>&#160;<\/td>\n<td>Pode desarmar bombas<\/td>\n<\/tr>\n<tr class=\"table-odd\">\n<td><b class=\"bold\">02<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Soldado<\/i><\/td>\n<td>&#160;<\/td>\n<td>8<\/td>\n<td>&#160;<\/td>\n<td>Pode andar mais de um espa\u00e7o por vez (como uma torre no xadrez)<\/td>\n<\/tr>\n<tr class=\"table-even\">\n<td><b class=\"bold\">S<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Espi\u00e3o<\/i><\/td>\n<td>&#160;<\/td>\n<td>1<\/td>\n<td>&#160;<\/td>\n<td>Vence quando ataca o <i class=\"italic\">Marechal<\/i>, por\u00e9m perde para qualquer pe\u00e7a que o atacar, incluindo o pr\u00f3prio <i class=\"italic\">Marechal<\/i><\/td>\n<\/tr>\n<tr class=\"table-odd\">\n<td><b class=\"bold\">F<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Bandeira<\/i><\/td>\n<td>&#160;<\/td>\n<td>1<\/td>\n<td>&#160;<\/td>\n<td>N\u00e3o se move<\/td>\n<\/tr>\n<tr class=\"table-even\">\n<td><b class=\"bold\">B<\/b><\/td>\n<td>&#160;<\/td>\n<td><i class=\"italic\">Bomba<\/i><\/td>\n<td>&#160;<\/td>\n<td>6<\/td>\n<td>&#160;<\/td>\n<td>N\u00e3o se move e elimina qualquer outra pe\u00e7a, exceto o <i class=\"italic\">Cabo-Armeiro<\/i><\/td>\n<\/tr>\n<\/table>\n<p class=\"paragraph\"\/>No ISF (<i class=\"italic\">International Stratego Federation<\/i>) voc\u00ea encontra as <span class=\"nobr\"><a href=\"http:\/\/www.isfstratego.com\/images\/isfgamerules.pdf\">regras oficiais<\/a><\/span> do jogo.<\/p>\n<h3 class=\"heading-1\">A seguir&#8230;<\/h3>\n<p class=\"paragraph\"\/>No pr\u00f3ximo post, iniciaremos a implementa\u00e7\u00e3o da <i class=\"italic\">engine<\/i> do jogo. Nossa id\u00e9ia \u00e9 desenvolver o jogo de forma incremental, ent\u00e3o pensamos nos seguintes passos (lembrem-se, um plano n\u00e3o \u00e9 um comprometimento sobre o que ir\u00e1 acontecer. Mudan\u00e7as s\u00e3o bem-vindas!):<\/p>\n<ol>\n<li>Regras de ataque e de movimenta\u00e7\u00e3o<\/li>\n<li>Controle do estado do jogo e das rodadas<\/li>\n<li>Gerenciar posicionamento inicial das pe\u00e7as<\/li>\n<li>Desenvolver uma interface textual<\/li>\n<li>Desenvolver uma interface gr\u00e1fica<\/li>\n<li>Cliente\/Servidor para jogar em rede<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea j\u00e1 ouviu falar em Desenvolvimento Orientado a Testes (ou TDD)? J\u00e1 escreveu testes antes do c\u00f3digo? Esta \u00e9 a primera parte de uma s\u00e9rie onde aplicaremos as id\u00e9ias de TDD num exemplo pr\u00e1tico, desenvolvendo um cl\u00e1ssico jogo de tabuleiro que n\u00e3o depende da sorte, mas sim da estrat\u00e9gia: Combate. Introdu\u00e7\u00e3o Conforme eu adiantei no [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[58,80,82],"class_list":["post-6","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-python","tag-stratego","tag-tdd"],"_links":{"self":[{"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/posts\/6","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/comments?post=6"}],"version-history":[{"count":0,"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/posts\/6\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/media?parent=6"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/categories?post=6"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dtsato.com\/blog\/wp-json\/wp\/v2\/tags?post=6"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}