A Arte de Escrever Programas Legíveis

Documentos relacionados
A Arte de Escrever Programas Legíveis

A Arte de Escrever Programas Legíveis

Primeiros Passos com o Netduino

Construindo Aplicações Node com MongoDB e Backbone Mike Wilson

Introdução à Programação com Python

Introdução às. Expressões Regulares. Michael Fitzgerald. Novatec

Novatec Editora Ltda

Primeiros Passos com o Arduino Massimo Banzi

Introdução ao GitHub Peter Bell e Brent Beer

Primeiros Passos com Sensores Kimmo Karvinen Tero Karvinen

Guia Prático Richard E. Silverman

Simon Holmes. Novatec

Design Centrado no Usuário

Expressões Regulares Cookbook Jan Goyvaerts Steven Levithan

Introdução à Programação com Python

JavaScript. de Alto Desempenho. Nicholas C. Zakas. Novatec

PDF Explicado John Whitington

Allen B. Downey. Novatec

Guia Mangá. Álgebra Linear. Shin Takahashi, Iroha Inoue e Trend-Pro Co., Ltd. novatec

Primeiros Passos com o Raspberry Pi

Benjamin Bengfort Jenny Kim

Ryan Mitchell. Novatec

Allan Liska e Timothy Gallo. Novatec

Desenvolvimento de Grandes Aplicações Web

Jody Culkin e Eric Hagan

Jonathan Stark Brian Jepson

Júlio César Scheiffer Saleh

Karl Matthias Sean P. Kane

WordPress 3 Básico Stephanie Leary

Sumário. Prefácio Capítulo 1 Orientação e primeiras etapas Capítulo 2 Dados: trabalhando com texto e números... 40

Arduino Básico Michael McRoberts

Sumário. Parte I Elementos essenciais Sobre o autor Sobre o revisor técnico Prefácio... 14

Aprendendo Programação. ios. Alasdair Allan. Novatec

Guia Mangá. Álgebra Linear. Shin Takahashi, Iroha Inoue e Trend-Pro Co., Ltd. novatec

Miguel Grinberg. Novatec

Primeiros Passos com o Arduino

Objective-C Fundamental Christopher K. Fairbairn Johannes Fahrenkrug Collin Ruffenach

Julia Elman e Mark Lavin. Novatec

William Pereira Alves

Shyam Seshadri & Brad Green

Criando Relatórios com PHP Pablo Dall Oglio

Novatec Editora Ltda. [2014].

Shelley Powers. Novatec

Pete Goodliffe. Novatec

Raspberry Pi Manual do Usuário

Kenneth Reitz Tanya Schlusser

Google Analytics Justin Cutroni

Rodrigo de Barros Paes

Edécio Fernando Iepsen

Novatec Editora Ltda

Pedro Monteiro da Silva Eleutério Marcio Pereira Machado. Novatec

Introdução ao GitHub Peter Bell e Brent Beer

Métricas. Como melhorar os principais resultados de sua empresa. Martin Klubeck. Novatec

Ademir Ribeiro dos Passos

Equipes de Software. Um guia para o desenvolvedor de software se relacionar melhor com outras pessoas. Brian W. Fitzpatrick Ben Collins-Sussman

Aprendendo. Unix no OS X. Mountain Lion. Mergulhando no Terminal e no Shell. Dave Taylor. Novatec

Aditya Y. Bhargava. Novatec

A Arte de SEO. Eric Enge, Stephan Spencer, Jessie Stricchiola e Rand Fishkin Introdução de John Battelle. Novatec

Criando Relatórios com PHP

Primeiros Passos com o Netduino

Aaron Newcomb. Novatec

Padrões de Projeto em PHP

Blender 3D jogos e animações interativas Allan Brito

Web Interativa com Ajax e PHP

Guia Mangá Circuitos Eletrônicos

Chris Binnie. Novatec

Adrian Mouat. Novatec

Arduino Básico. 2ª edição. Michael McRoberts. Novatec

jquery Mobile Desenvolva aplicações web para dispositivos móveis com HTML5, CSS3, AJAX, jquery e jquery UI Maurício Samy Silva Novatec

Semmy Purewal. Novatec

André Gugliotti. Novatec

Indira Knight. Novatec

jquery Cookbook Comunidade de Desenvolvedores jquery

Guia Mangá Motores elétricos

Guia Mangá. Microprocessadores. Michio Shibuya, Takashi Tonagi e Office Sawa. Novatec

Osvaldo Santana Thiago Galesi

Análise de Regressão

As Leis Fundamentais do Projeto de Software

marketing ágil Utilização de Metodologias Ágeis em Projetos de Marketing Michelle Accardi-Petersen Novatec

Ademir Cristiano Gabardo. Novatec

Criando Aplicações Gráficas com PHP

3ª Edição Nilo Ney Coutinho Menezes

A Minha Bíblia. Adaptado por Judy Bartel do livro A Tua Bíblia de L. Jeter Walker

José Wammes, Toledo, Paraná,

2ª edição. Daniel Adorno Gomes. Novatec

Hélio Engholm Jr. Novatec

Padrões JavaScript Stoyan Stefanov

Luiz Eduardo Borges. Novatec

Adriano Pataro. Novatec

Matheus Marabesi Michael Douglas

Ademir Cristiano Gabardo. Novatec

Série A Seleção, de Kiera Cass

Harrison Kinsley Will McGugan

2ª Edição Cláudio Torres

Chris Goward. Novatec

Guia Mangá FISIOLOGIA. Etsuro Tanaka, Keiko Koyama, e Becom Co., Ltd. Novatec

Dinâmica dos fluidos

Guia Mangá Circuitos Eletrônicos

Programando para. iphone e ipad. Aprenda a construir aplicativos para o ios. André Milani. Novatec

Transcrição:

A Arte de Escrever Programas Legíveis Técnicas simples e práticas para a elaboração de programas fáceis de serem lidos e entendidos Dustin Boswell Trevor Foucher Novatec

Authorized Portuguese translation of the English edition of titled The Art of Readable Code, First Edition ISBN 9780596802295 2012 Dustin Boswell and Trevor Foucher. This translation is published and sold by permission of O'Reilly Media, Inc., the owner of all rights to publish and sell the same. Tradução em português autorizada da edição em inglês da obra The Art of Readable Code, First Edition ISBN 9780596802295 2012 Dustin Boswell e Trevor Foucher. Esta tradução é publicada e vendida com a permissão da O'Reilly Media, Inc., detentora de todos os direitos para publicação e venda desta obra. Novatec Editora Ltda. 2012. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates Tradução: Rafael Zanolli Revisão técnica: Edgard Damiani Revisão gramatical: Débora Facin Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-294-2 Histórico de impressões: Fevereiro/2012 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 São Paulo, SP Brasil Tel.: +55 11 2959-6529 Fax: +55 11 2950-8869 E-mail: novatec@novatec.com.br Site: www.novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec Dados Internacionais de Catalogação na Publicação (CIP) (Câmara Brasileira do Livro, SP, Brasil) Boswell, Dustin A arte de escrever programas legíveis : técnicas simples e práticas para a elaboração de programas fáceis de serem lidos e entendidos / Dustin Boswell, Trevor Foucher ; [tradução Rafael Zanolli]. -- São Paulo : Novatec Editora ; Sebastopol, CA : O'Reilly, 2012. Título original: The art of readable code. ISBN 978-85-7522-294-2 1. Linguagem de programação (Computadores) 2. Software - Desenvolvimento 3. Teoria da codificação I. Foucher, Trevor. II. Título. 12-01160 CDD-005.13 Índices para catálogo sistemático: 1. Desenvolvimento de linguagens de programação : Computadores : Processamento de dados 005.13 GRPM20120203

capítulo 1 Códigos devem ser fáceis de entender 15

16 A Arte de Escrever Programas Legíveis Nos últimos cinco anos, colecionamos centenas de exemplos de códigos malfeitos (na maioria dos casos, nossos mesmos) e analisamos o que eles tinham de errado e quais os princípios e técnicas que poderíamos utilizar para melhorá-los. O que percebemos é que todos os princípios têm origem em um único tema. I D E I A C H AV E Códigos devem ser fáceis de entender. Acreditamos que esse é o princípio mais importante que você pode utilizar para decidir como escrever seu código. Neste livro, mostraremos como aplicar esse princípio a diferentes aspectos de sua codificação diária. Antes de iniciarmos, vamos explicar essa ideia e justificar por que ela é tão importante. O que torna um código melhor? A maioria dos programadores (incluindo os autores) toma decisões de programação com base em instinto e intuição. Todos sabemos que um código assim: for (Node* node = list->head; node!= NULL; node = node->next) Print(node->data); é melhor do que outro como este: Node* node = list->head; if (node == NULL) return; while (node->next!= NULL) { Print(node->data); node = node->next; } if (node!= NULL) Print(node->data); (ainda que ambos os exemplos se comportem exatamente da mesma forma). Mas, muitas vezes, a escolha é mais difícil. Por exemplo, o código a seguir: return exponent >= 0? mantissa * (1 << exponent) : mantissa / (1 << -exponent); é melhor ou pior do que este? if (exponent >= 0) { return mantissa * (1 << exponent); } else { return mantissa / (1 << -exponent); }

Capítulo 1 Códigos devem ser fáceis de entender 17 A primeira versão é mais compacta, mas a segunda, menos intimidadora. Qual critério é mais importante? Em geral, como você decide a melhor forma de codificar algo? Teorema fundamental da legibilidade Depois de estudar muitos códigos de exemplo como o que vimos, chegamos à conclusão de que há uma métrica de legibilidade mais importante do que qualquer outra. Ela é tão importante que a chamamos de Teorema Fundamental da Legibilidade. I D E I A C H AV E Códigos devem ser escritos de modo a minimizar o tempo necessário para sua compreensão. O que queremos dizer com isso? Literalmente, se você escolhesse determinado colega seu e medisse quanto tempo ele leva para ler e entender seu código, esse tempo-para-entender seria a métrica teórica que deveríamos minimizar. E quando dizemos entender, utilizamos essa palavra em sentido muito abrangente. Para que alguém entenda completamente seu código, ele deve ser capaz de fazer alterações, encontrar bugs e compreender como ele interage com o restante do código. Agora, talvez você esteja pensando, Quem se importa se outra pessoa consegue entendê-lo? Eu sou o único utilizando o código! Ainda que você trabalhe sozinho, vale a pena perseguir esse objetivo. Essa outra pessoa pode ser você mesmo daqui a um ano, quando seu código já não lhe parecer mais familiar. E nunca se sabe alguém pode se juntar ao seu projeto, ou seu código descartável pode ser reutilizado em outro projeto. Menor é sempre melhor? Em termos gerais, quanto menos código você tiver de escrever para solucionar um problema, melhor (consulte o capítulo 13, Escreva menos código). Provavelmente demoraria menos para compreender uma classe de 2.000 linhas do que uma de 5.000 linhas. Mas ter menos linhas nem sempre é melhor! Muitas vezes, uma expressão como: assert((!(bucket = FindBucket(key)))!bucket->IsOccupied());

18 A Arte de Escrever Programas Legíveis é mais demorada de se entender do que uma versão com duas linhas: bucket = FindBucket(key); if (bucket!= NULL) assert(!bucket->isoccupied()); Do mesmo modo, um comentário pode fazer com que você entenda o código mais rapidamente, ainda que ele acrescente código ao arquivo: // Versão rápida de "hash = (65599 * hash) + c" hash = (hash << 6) + (hash << 16) - hash + c; Assim, ainda que utilizar menos linhas de código seja um bom objetivo, minimizar o tempo-para-entender é uma meta ainda melhor. Por acaso o tempo-para-entender entra em conflito com outros objetivos? Talvez você esteja pensando, Mas e outras preocupações, como tornar o código eficiente, bem projetado, fácil de testar e assim por diante? Objetivos como esses não entram, às vezes, em conflito com a meta de tornar o código fácil de entender? Verificamos que esses outros objetivos não interferem tanto assim no que buscamos. Mesmo em ambientes altamente otimizados, ainda temos como tornar os códigos bastante legíveis. Da mesma forma, tornar seu código fácil de entender muitas vezes faz com que ele também seja bem projetado e fácil de testar. O restante do livro discute como aplicar a ideia de fácil de entender em várias circunstâncias. No entanto, lembre-se de que, quando em dúvida, o Teorema Fundamental da Legibilidade supera qualquer outra regra ou princípio deste livro. Sabemos que alguns programadores têm uma necessidade compulsiva de corrigir qualquer código que não esteja fatorado perfeitamente. É sempre importante dar um passo atrás e perguntar, Este código é fácil de entender? Se afirmativo, provavelmente podemos avançar para outro código. A parte difícil Sim, sabemos que é necessário algum trabalho extra quando temos de pensar sempre se um usuário imaginário considera nosso código fácil de entender. Ao proceder dessa forma, você ativará uma parte de seu cérebro que talvez não esteja acostumada a funcionar durante a codificação. Mas, se você adotar esse objetivo (como nós o fizemos), estamos certos de que se tornará um programador melhor, sofrerá menos com bugs, terá mais orgulho de seu trabalho e produzirá códigos que todos adorarão utilizar. Por isso, vamos começar!