{"id":158,"date":"2011-07-29T21:26:52","date_gmt":"2011-07-29T21:26:52","guid":{"rendered":"http:\/\/leonardocotta.com.br\/blog\/?p=158"},"modified":"2011-07-29T21:26:52","modified_gmt":"2011-07-29T21:26:52","slug":"em-busca-do-nome-adequado-metodos-variaveis-e-classes","status":"publish","type":"post","link":"https:\/\/leonardocotta.com.br\/?p=158","title":{"rendered":"Em busca do nome adequado: m\u00e9todos, vari\u00e1veis e classes"},"content":{"rendered":"<p>\u00c9 muito comum ap\u00f3s alguns dias de trabalho em um projeto perceber que as escolhas de nomes de classes e m\u00e9todos n\u00e3o condizem com o que cada um representa. Isso acontece pois, com o passar do tempo, aumenta o nosso conhecimento sobre o dom\u00ednio do problema. Tamb\u00e9m \u00e9 natural surgir o desejo de mudan\u00e7a: a medida que nos especializamos nesse dom\u00ednio, o modelo do neg\u00f3cio em nossa mente passa a ser diferente da vis\u00e3o inicial. Um exemplo simples dessa mudan\u00e7a acontece quando em OO criamos um relacionamento bidirecional entre duas classes atrav\u00e9s de listas, como no exemplo a seguir:<\/p>\n<p><!--more--><\/p>\n<div>\n<div id=\"highlighter_7516\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>\/\/ a representa\u00e7\u00e3o de um cliente, funcion\u00e1rio etc<\/code><\/div>\n<div><code>public<\/code> <code>class<\/code> <code>Pessoa {<\/code><\/div>\n<div><code> <\/code><code>List&lt;Conta&gt; contas;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>\/\/ a representa\u00e7\u00e3o de uma conta banc\u00e1ria (poupan\u00e7a, corrente, investimento etc)<\/code><\/div>\n<div><code>public<\/code> <code>class<\/code> <code>Conta {<\/code><\/div>\n<div><code> <\/code><code>List&lt;Pessoa&gt; pessoas;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>A primeira vista esse \u00e9 o relacionamento entre as duas entidades mas em determinado momento notamos que na verdade a rela\u00e7\u00e3o entre pessoa e conta \u00e9 um Titular, que possue caracter\u00edsticas pr\u00f3prias, como o contrato que ele como titular da conta assinou:<\/p>\n<div>\n<div id=\"highlighter_751881\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>public<\/code> <code>class<\/code> <code>Pessoa {<\/code><\/div>\n<div><code> <\/code><code>List&lt;Titular&gt; titularidades;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>public<\/code> <code>class<\/code> <code>Conta {<\/code><\/div>\n<div><code> <\/code><code>List&lt;Titular&gt; titulares;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>public<\/code> <code>class<\/code> <code>Titular {<\/code><\/div>\n<div><code> <\/code><code>Conta conta;<\/code><\/div>\n<div><code> <\/code><code>Pessoa pessoa;<\/code><\/div>\n<div><code> <\/code><code>\/\/ outras caracter\u00edsticas de uma titularidade<\/code><\/div>\n<div><code>}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Nesse caso o processo de refatora\u00e7\u00e3o envolve extrair uma classe que representa tal rela\u00e7\u00e3o, um Titular: um exemplo simples que demonstra como em OO \u00e9 comum a exist\u00eancia de classes para representar informa\u00e7\u00f5es intang\u00edveis.<\/p>\n<p>Outras quest\u00f5es simples mas fundamentais para\u00a0<a href=\"http:\/\/www.tectura.com.br\/topics\/nomes_complexos_descritivos_no_modelo\">o bom design e legibilidade da aplica\u00e7\u00e3o est\u00e3o ligados aos nomes que escolhemos<\/a>, n\u00e3o s\u00f3 em rela\u00e7\u00e3o ao nome da classe e de seus m\u00e9todos. No exemplo acima, por uma escolha fraca no nome da vari\u00e1vel membro\u00a0<strong>conta<\/strong> e\u00a0<strong>pessoa<\/strong> acabamos com um c\u00f3digo que parece repetitivo e pouco descritivo:<\/p>\n<div>\n<div id=\"highlighter_138797\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Pessoa pessoa;<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Se em nosso sistema funcion\u00e1rios, gerentes, titulares e caixas s\u00e3o representados atrav\u00e9s de inst\u00e2ncias do tipo\u00a0<code>Pessoa<\/code>, o mais adequado seria nome\u00e1-los de acordo:<\/p>\n<div>\n<div id=\"highlighter_497506\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>public<\/code> <code>class<\/code> <code>Titular {<\/code><\/div>\n<div><code> <\/code><code>Conta conta;<\/code><\/div>\n<div><code> <\/code><code>Pessoa cliente;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>A tend\u00eancia natural do desenvolvedor em linguagens que obrigam a declara\u00e7\u00e3o do tipo \u00e9 criar vari\u00e1veis com nome identicos ao tipo declarado, por ser um atalho das IDEs e mais simples de escrever. Mas tais alternativas, como visto, dizem pouco sobre a vari\u00e1vel que est\u00e1 sendo acessada. Por esses motivos, \u00e9 muito comum encontrar c\u00f3digo como:<\/p>\n<div>\n<div id=\"highlighter_65544\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Cliente cliente = clienteDao.busca(<\/code><code>13<\/code><code>);<\/code><\/div>\n<div><code>Pagamento pagamento = pagamentoDao.busca(<\/code><code>15<\/code><code>);<\/code><\/div>\n<div><code>ProcessadorDePagamento processador =<\/code><\/div>\n<div><code> <\/code><code>new<\/code> <code>ProcessadorDePagamento();<\/code><\/div>\n<div><code>processador.processa(cliente, pagamento);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Cliente, pagamento, processador: \u00e9 somente desses tr\u00eas elementos que nosso dom\u00ednio \u00e9 composto? E nem mesmo Ruby foge disso, sendo comum encontrar:<\/p>\n<div>\n<div id=\"highlighter_99473\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>cliente = Cliente.find_by_id <\/code><code>13<\/code><\/div>\n<div><code>pagamento = Pagamento.find_by_id <\/code><code>15<\/code><\/div>\n<div><code>processador = Processador.<\/code><code>new<\/code><\/div>\n<div><code>processador.processa cliente, pagamento<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Tr\u00eas apari\u00e7\u00f5es de cliente, tr\u00eas de pagamento, quatro de processador. Aqui existe uma vis\u00e3o distorcida de que vari\u00e1veis s\u00e3o somente aquilo que o tipo descreve: um cliente, um pagamento, um processador. Na verdade elas referenciam inst\u00e2ncias espec\u00edficas e especializadas de um tipo determinado. S\u00f3 faria sentido chamar o cliente 13 de\u00a0<strong>cliente<\/strong> se ele \u00e9 o \u00fanico cliente, um singleton. Especialize o nome de suas vari\u00e1veis e crie um c\u00f3digo mais leg\u00edvel:<\/p>\n<div>\n<div id=\"highlighter_419052\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Cliente devedor = clientes.busca(<\/code><code>13<\/code><code>);<\/code><\/div>\n<div><code>Pagamento fatura = pagamentos.busca(<\/code><code>15<\/code><code>);<\/code><\/div>\n<div><code>ProcessadorDePagamento mensalidade =<\/code><\/div>\n<div><code> <\/code><code>new<\/code> <code>ProcessadorDePagamento();<\/code><\/div>\n<div><code>mensalidade.cobra(devedor, fatura);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>O mesmo pode ser refletido no exemplo de Ruby. E como trabalharemos nossos reposit\u00f3rios para permitir uma maior legibilidade do c\u00f3digo?<\/p>\n<div>\n<div id=\"highlighter_429991\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Pessoa pessoa = ...;<\/code><\/div>\n<div><code>List&lt;Conta&gt; contas = dao.contasDe(pessoa);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Note como por causa da escolha do nome da vari\u00e1vel\u00a0<code>pessoa<\/code> fomos obrigados a colocar algo mais descritivo no m\u00e9todo. Caso a vari\u00e1vel possua um nome mais adequado, ter\u00edamos ent\u00e3o:<\/p>\n<div>\n<div id=\"highlighter_71513\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Pessoa cliente = ...;<\/code><\/div>\n<div><code>List&lt;Conta&gt; contas = dao.contasDe(cliente);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Modificando nossa classe\u00a0<code>Conta<\/code> para adicionar o gerente e o subgerente temos novamente o sentido das vari\u00e1veis descrito n\u00e3o s\u00f3 pelo seu tipo, mas tamb\u00e9m pelo seu nome:<\/p>\n<div>\n<div id=\"highlighter_625347\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>public<\/code> <code>class<\/code> <code>Conta {<\/code><\/div>\n<div><code> <\/code><code>List&lt;Titular&gt; titulares;<\/code><\/div>\n<div><code> <\/code><code>Pessoa gerente;<\/code><\/div>\n<div><code> <\/code><code>Pessoa subgerente;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Nesse instante a query ficaria mais complexa pois existem dois relacionamentos distintos com pessoa, requerendo\u00a0a cria\u00e7\u00e3o de uma DSL interna para query. No exemplo a seguir usamos um builder para facilitar a constru\u00e7\u00e3o da query:<\/p>\n<div>\n<div id=\"highlighter_75591\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Pessoa gerente = ...;<\/code><\/div>\n<div><code>Pessoa subgerente = ...;<\/code><\/div>\n<div><code>List&lt;Conta&gt; contas =<\/code><\/div>\n<div><code> <\/code><code>dao.comGerenteESubgerente<\/code><\/div>\n<div><code> <\/code><code>(gerente, subgerente):<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Essa \u00e9 a abordagem que o jbehave 3.2 e o selenium utilizam, onde acabamos por ter uma sintaxe muito longa e repetitiva.<\/p>\n<p>Retomando o problema do nome das vari\u00e1veis, que pode ser resolvido com outra refatora\u00e7\u00e3o de rename: o c\u00f3digo da terceira linha \u00e9 mais descritivo que o anterior:<\/p>\n<div>\n<div id=\"highlighter_350819\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>Pessoa gerente = ...;<\/code><\/div>\n<div><code>Pessoa subgerente = ...;<\/code><\/div>\n<div><code>List&lt;Conta&gt; contas =<\/code><\/div>\n<div><code> <\/code><code>dao.comGerente(gerente)<\/code><\/div>\n<div><code> <\/code><code>.comSubgerente(subgerente):<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Em linguagens onde mapas podem ser representados atrav\u00e9s de literais, o ru\u00eddo sint\u00e1tico \u00e9 baixo e permite que seja escrito c\u00f3digo como a seguir em Ruby:<\/p>\n<div>\n<div id=\"highlighter_315699\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>gerente = ...<\/code><\/div>\n<div><code>subgerente = ...<\/code><\/div>\n<div><code>contas = Conta.com<\/code><\/div>\n<div><code> <\/code><code>:gerente<\/code> <code>=&gt; gerente, <\/code><code>:subgerente<\/code> <code>=&gt; subgerente<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Novamente, a refatora\u00e7\u00e3o aqui \u00e9 fundamental:<\/p>\n<div>\n<div id=\"highlighter_907748\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>\n<div><code>principal = ...<\/code><\/div>\n<div><code>secundario = ...<\/code><\/div>\n<div><code>contas = Conta.com<\/code><\/div>\n<div><code> <\/code><code>:gerente<\/code> <code>=&gt; principal, <\/code><code>:subgerente<\/code> <code>=&gt; secundario<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>A escolha dos nomes de nossas classes influencia o design e legibilidade de nosso c\u00f3digo direta e indiretamente, primeiro pela declara\u00e7\u00e3o das vari\u00e1veis e a nossa vis\u00e3o do dom\u00ednio. Depois pelas consequ\u00eancias que o mesmo possui na escolha dos nomes das vari\u00e1veis e m\u00e9todos, que permitem um design mais ou menos leg\u00edvel.<\/p>\n<p>Essa escolha \u00e9 t\u00e3o importante quanto o resto de seu design para facilitar a compreens\u00e3o do que seu dom\u00ednio \u00e9 e qual o problema que est\u00e1 tentando atacar. Na pr\u00f3xima vez que for declarar uma vari\u00e1vel com o mesmo nome que o tipo, pense duas vezes.<\/p>\n<p>Retirado de :\u00a0<a href=\"http:\/\/blog.caelum.com.br\/em-busca-do-nome-adequado-metodos-variaveis-e-classes\/\">http:\/\/blog.caelum.com.br\/em-busca-do-nome-adequado-metodos-variaveis-e-classes\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c9 muito comum ap\u00f3s alguns dias de trabalho em um projeto perceber que as escolhas de nomes de classes e m\u00e9todos n\u00e3o condizem com o que cada um representa. Isso acontece pois, com o passar do tempo, aumenta o nosso conhecimento sobre o dom\u00ednio do problema. Tamb\u00e9m \u00e9 natural surgir o desejo de mudan\u00e7a: a &hellip; <a href=\"https:\/\/leonardocotta.com.br\/?p=158\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Em busca do nome adequado: m\u00e9todos, vari\u00e1veis e classes<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[26],"tags":[86,101,104,109,113,151,225,234],"class_list":["post-158","post","type-post","status-publish","format-standard","hentry","category-sem-categoria","tag-clean-code","tag-ddd","tag-design","tag-domain-driven-design","tag-engenharia","tag-java","tag-rails","tag-ruby"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts\/158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=158"}],"version-history":[{"count":0,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts\/158\/revisions"}],"wp:attachment":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}