Facebook Pixel
Searching...
Português
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Clean Code

Clean Code

A Handbook of Agile Software Craftsmanship
por Robert C. Martin 2007 464 páginas
4.37
22k+ avaliações
Ouvir
Ouvir

Principais conclusões

1. Código limpo é legível, simples e expressivo

Código limpo sempre parece ter sido escrito por alguém que se importa.

A clareza é fundamental. Código limpo é caracterizado pela sua legibilidade e simplicidade. Deve ser fácil para outros programadores entenderem, modificarem e manterem. Isso envolve o uso de nomes claros e significativos, mantendo funções e classes pequenas e focadas, e organizando o código de maneira lógica.

Código expressivo comunica a intenção. Código limpo deve expressar claramente a intenção do programador sem a necessidade de comentários extensivos. Isso é alcançado por meio de nomes bem escolhidos, funções pequenas que realizam uma única tarefa de forma eficaz e uma estrutura geral clara. O próprio código deve contar uma história, facilitando para os leitores seguirem a lógica e o propósito de cada componente.

A melhoria contínua é essencial. Escrever código limpo é um processo contínuo que requer atenção constante e refatoração. Os programadores devem seguir a Regra do Escoteiro: "Deixe o acampamento mais limpo do que o encontrou." Isso significa sempre buscar oportunidades para melhorar a clareza e a estrutura do código, mesmo que de pequenas maneiras, a cada modificação ou adição.

2. Nomes significativos aumentam a clareza e a manutenibilidade do código

O nome de uma variável, função ou classe deve responder a todas as grandes perguntas. Deve dizer por que existe, o que faz e como é usado.

Escolha nomes descritivos. Os nomes devem ser autoexplicativos e revelar a intenção por trás de variáveis, funções e classes. Evite nomes de uma única letra, abreviações ou códigos crípticos que exigem mapeamento mental para entender seu propósito.

Use convenções de nomenclatura de forma consistente. Adote e mantenha convenções de nomenclatura padrão para sua linguagem de programação e equipe. Isso inclui:

  • CamelCase para nomes de classes (ex.: CustomerOrder)
  • camelCase para nomes de variáveis e funções (ex.: totalAmount)
  • ALL_CAPS para constantes (ex.: MAX_SIZE)

Evite desinformação e ruído. Não use nomes que possam ser enganosos ou confusos. Por exemplo, evite usar 'lista' em um nome de variável se não for realmente uma lista. Além disso, evite palavras redundantes ou sem significado em nomes, como 'dados' ou 'info' quando não agregam valor.

3. Funções devem ser pequenas, realizar uma única tarefa e operar em um único nível de abstração

Funções devem fazer uma coisa. Devem fazê-la bem. Devem fazê-la apenas.

Mantenha as funções pequenas. Funções ideais não devem ter mais de 20 linhas. Isso as torna mais fáceis de ler, entender e manter. Funções menores também são mais fáceis de nomear com precisão, testar e reutilizar.

Princípio da responsabilidade única. Cada função deve ter um propósito claramente definido. Se uma função está fazendo várias coisas, deve ser dividida em funções menores e mais focadas. Isso melhora a legibilidade e torna o código mais modular e fácil de modificar.

Nível de abstração consistente. Dentro de uma função, todas as operações devem estar no mesmo nível de abstração. Misturar lógica de alto nível com detalhes de baixo nível torna as funções mais difíceis de entender e manter. Use a técnica de refatoração "Extrair Método" para separar diferentes níveis de abstração em funções distintas.

4. Comentários devem ser mínimos e verdadeiramente necessários

O uso adequado de comentários é compensar nossa falha em nos expressar em código.

O código deve ser autoexplicativo. Código bem escrito, com nomes e estrutura claros, muitas vezes elimina a necessidade de comentários. Antes de adicionar um comentário, considere se você pode refatorar o código para tornar sua intenção mais clara.

Use comentários com moderação. Bons comentários explicam por que algo é feito, não como é feito. Eles devem fornecer contexto ou esclarecimento que não pode ser expresso apenas em código. Tipos de comentários úteis incluem:

  • Comentários legais (direitos autorais, licenciamento)
  • Explicação de intenção ou algoritmos
  • Avisos de consequências
  • Comentários TODO (usados com moderação)

Evite comentários redundantes ou enganosos. Não escreva comentários que apenas reafirmem o que o código já diz claramente. Comentários desatualizados ou incorretos são piores do que nenhum comentário, pois podem enganar os leitores. Revise e atualize regularmente os comentários junto com o código que descrevem.

5. Formatação adequada melhora a legibilidade do código

A formatação do código é sobre comunicação, e comunicação é a prioridade do desenvolvedor profissional.

Um estilo consistente é importante. Estabeleça e siga um estilo de formatação consistente em seu código. Isso inclui:

  • Indentação
  • Quebras de linha
  • Colocação de chaves
  • Espaçamento em torno de operadores e palavras-chave

Formatação vertical. Organize o código verticalmente para melhorar a legibilidade:

  • Mantenha conceitos relacionados próximos
  • Separe conceitos não relacionados
  • Declare variáveis próximas ao seu uso
  • Coloque funções dependentes próximas umas das outras

Formatação horizontal. Mantenha as linhas razoavelmente curtas (geralmente 80-120 caracteres) para evitar a necessidade de rolagem horizontal. Quebre declarações longas em várias linhas de maneira lógica. Use espaços em branco para separar blocos lógicos dentro de uma linha.

6. Objetos e estruturas de dados servem a propósitos diferentes

Objetos escondem seus dados por trás de abstrações e expõem funções que operam sobre esses dados. Estruturas de dados expõem seus dados e não têm funções significativas.

Objetos vs. estruturas de dados. Objetos encapsulam dados e expõem comportamentos por meio de métodos. Eles são bons para adicionar novos tipos (classes) sem alterar o comportamento existente. Estruturas de dados, por outro lado, expõem dados e não têm comportamento significativo. Elas são boas para adicionar novos comportamentos sem alterar os tipos de dados existentes.

Escolha a abordagem certa. Use objetos quando quiser adicionar novos tipos com frequência, mas manter os comportamentos estáveis. Use estruturas de dados quando quiser adicionar novos comportamentos com frequência, mas manter os tipos estáveis. Compreender essa distinção ajuda a projetar sistemas mais flexíveis e manuteníveis.

Lei de Demeter. Para objetos, siga a Lei de Demeter: um método deve chamar apenas métodos de:

  • O próprio objeto
  • Seus parâmetros
  • Quaisquer objetos que ele cria
  • Seus objetos componentes diretos
    Esse princípio ajuda a reduzir o acoplamento entre diferentes partes de um sistema.

7. O tratamento de erros deve ser limpo e informativo

O tratamento de erros é importante, mas se obscurece a lógica, está errado.

Use exceções em vez de códigos de erro. Exceções fornecem uma maneira mais limpa de lidar com erros em comparação com códigos de erro tradicionais. Elas separam a lógica de tratamento de erros do código principal, tornando ambos mais fáceis de entender e manter.

Crie mensagens de erro informativas. As mensagens de erro devem fornecer contexto suficiente para entender o que deu errado e onde. Inclua detalhes relevantes, como:

  • Qual operação estava sendo tentada
  • Qual erro específico ocorreu
  • Quaisquer valores ou informações de estado relevantes

Escreva declarações try-catch-finally primeiro. Ao escrever código que pode lançar exceções, comece escrevendo os blocos try-catch-finally. Isso ajuda a garantir que o código seja resiliente a erros desde o início e que os casos de erro sejam devidamente considerados.

8. Testes unitários são cruciais para manter o código limpo

O código de teste é tão importante quanto o código de produção.

Escreva testes primeiro. Siga a prática do Desenvolvimento Orientado a Testes (TDD):

  1. Escreva um teste que falhe
  2. Escreva o código mínimo para passar no teste
  3. Refatore o código enquanto mantém o teste passando
    Essa abordagem garante que seu código seja testável desde o início e ajuda a promover um bom design.

Mantenha os testes limpos. Aplique os mesmos padrões de limpeza ao seu código de teste que você aplica ao seu código de produção. Testes limpos são:

  • Legíveis
  • Manuteníveis
  • Confiáveis

Siga os princípios F.I.R.S.T para testes:

  • Rápidos: Os testes devem ser executados rapidamente
  • Independentes: Os testes não devem depender uns dos outros
  • Repetíveis: Os testes devem ser repetíveis em qualquer ambiente
  • Auto-validáveis: Os testes devem ter uma saída booleana (passar/falhar)
  • Oportunos: Os testes devem ser escritos logo antes do código de produção

9. Classes devem ser pequenas, focadas e seguir o Princípio da Responsabilidade Única

A primeira regra das classes é que elas devem ser pequenas. A segunda regra das classes é que elas devem ser menores do que isso.

Mantenha as classes focadas. Uma classe deve ter uma única responsabilidade bem definida. Se você não consegue descrever o propósito de uma classe em cerca de 25 palavras sem usar "e" ou "ou", provavelmente ela está fazendo demais.

Busque alta coesão. Métodos e variáveis dentro de uma classe devem estar intimamente relacionados e trabalhar juntos para cumprir a responsabilidade da classe. Baixa coesão geralmente indica que uma classe está tentando fazer demais e deve ser dividida.

Princípio Aberto-Fechado. Projete classes para serem abertas para extensão, mas fechadas para modificação. Isso muitas vezes envolve o uso de abstrações e interfaces para permitir que novas funcionalidades sejam adicionadas sem alterar o código existente.

10. Concorrência requer design e implementação cuidadosos

Escrever programas concorrentes limpos é difícil—muito difícil.

Compreenda os desafios da concorrência. A programação concorrente introduz complexidades como:

  • Condições de corrida
  • Deadlocks
  • Problemas de vivacidade
  • Impactos na performance

Mantenha o código relacionado à concorrência separado. Isolar o código que lida com concorrência. Isso facilita o raciocínio, teste e manutenção tanto das partes concorrentes quanto das não concorrentes do seu sistema.

Use bibliotecas e frameworks existentes. Aproveite bibliotecas e frameworks de concorrência bem testados (ex.: java.util.concurrent em Java) em vez de tentar implementar controle de concorrência de baixo nível você mesmo. Essas ferramentas foram otimizadas e testadas minuciosamente para padrões comuns de concorrência.

Escreva testes abrangentes. Testar código concorrente é desafiador, mas crucial. Escreva testes que:

  • Criem múltiplas threads
  • Variem o tempo e o agendamento
  • Sejam executados várias vezes para aumentar a chance de expor problemas intermitentes
  • Use ferramentas como sanitizadores de thread e analisadores estáticos para ajudar a identificar possíveis bugs de concorrência

Última atualização:

FAQ

What's Clean Code: A Handbook of Agile Software Craftsmanship about?

  • Focus on Software Craftsmanship: The book emphasizes the importance of writing clean, maintainable code as a hallmark of professionalism in software development.
  • Principles and Practices: It outlines various principles, patterns, and practices that help programmers write code that is not only functional but also easy to read and understand.
  • Real-World Examples: Numerous examples of both good and bad code are included, demonstrating how to transform messy code into clean code through refactoring and disciplined practices.

Why should I read Clean Code by Robert C. Martin?

  • Improve Coding Skills: Reading the book can significantly enhance your programming skills by teaching you how to write code that is easier to maintain and understand.
  • Professional Development: It is a valuable resource for anyone looking to advance their career in software development, instilling a mindset of craftsmanship and quality.
  • Practical Advice: The book provides practical advice that can be applied immediately in your coding practices, making it a useful guide for both novice and experienced programmers.

What are the key takeaways of Clean Code?

  • Meaningful Names: The book stresses the importance of using intention-revealing names for variables, functions, and classes to enhance code readability and maintainability.
  • Small Functions: Functions should be small and focused on a single task, adhering to the principle of "Do One Thing" to improve clarity and reduce complexity.
  • Error Handling: Martin advocates for using exceptions rather than return codes for error handling, which helps keep the main logic of the code clean and unobscured.

What are the best quotes from Clean Code and what do they mean?

  • "Clean code is a matter of discipline.": This quote emphasizes that writing clean code requires consistent effort and adherence to best practices, rather than relying on luck or talent alone.
  • "Comments do not make up for bad code.": This highlights the idea that if code is poorly written, no amount of commenting can compensate for its lack of clarity and structure.
  • "Leave the campground cleaner than you found it.": This metaphor encourages developers to improve the codebase with every change, ensuring that the code remains clean and maintainable over time.

How does Clean Code define clean code?

  • Readable and Understandable: Clean code is defined as code that is easy to read and understand, allowing other developers to quickly grasp its purpose and functionality.
  • Minimal Complexity: It should have minimal complexity, with each function and class focused on a single responsibility, making it easier to test and maintain.
  • Well-Structured: Clean code is well-structured, following consistent formatting and naming conventions that enhance its clarity and reduce the cognitive load on the reader.

What is the Boy Scout Rule in Clean Code?

  • Continuous Improvement: The Boy Scout Rule states that developers should "leave the campground cleaner than you found it," meaning that every time you work on code, you should strive to improve it.
  • Small Changes Matter: This can be as simple as renaming a variable for clarity or refactoring a small function, which contributes to the overall cleanliness of the codebase.
  • Professional Responsibility: Adhering to this rule reflects a professional attitude towards code quality and maintenance, fostering a culture of continuous improvement within a team.

What is the Single Responsibility Principle (SRP) in Clean Code?

  • Definition of SRP: The SRP states that "a class should have one, and only one, reason to change." This means that each class should focus on a single responsibility or functionality.
  • Benefits of SRP: Adhering to SRP leads to better organization of code, making it easier to understand, test, and maintain. It reduces the risk of changes in one area affecting unrelated parts of the code.
  • Implementation Guidance: Martin provides practical advice on how to identify responsibilities and refactor classes to adhere to SRP, ensuring that code remains clean and manageable.

How does Clean Code address error handling?

  • Use Exceptions: The book advocates for using exceptions rather than return codes for error handling, which helps keep the main logic of the code clean and unobscured.
  • Separation of Concerns: Error handling should be separated from the main logic of the code, allowing developers to focus on the primary functionality without being bogged down by error-checking clutter.
  • Provide Context: Exceptions should provide enough context to understand the source and nature of the error, making it easier to diagnose and fix issues when they arise.

What role does testing play in Clean Code?

  • Foundation of Clean Code: Testing is considered a fundamental discipline in writing clean code. It ensures that the code behaves as expected and helps catch issues early in the development process.
  • Fast and Reliable Tests: The book emphasizes that tests should be fast and reliable to encourage frequent execution. This helps maintain a clean codebase and reduces the risk of introducing bugs.
  • Self-Validating Tests: Tests should be designed to be self-validating, meaning they should clearly indicate whether the code is functioning correctly. This reduces ambiguity and increases confidence in the code.

How does Clean Code suggest handling dependencies?

  • Dependency Inversion Principle (DIP): The book explains that "high-level modules should not depend on low-level modules. Both should depend on abstractions." This principle encourages the use of interfaces and abstract classes to reduce coupling.
  • Use of Dependency Injection: Martin recommends using dependency injection to manage dependencies, allowing for more flexible and testable code. This approach decouples the creation of dependencies from their usage.
  • Benefits of Managing Dependencies: By managing dependencies effectively, developers can create systems that are easier to maintain and extend, leading to cleaner and more robust code.

What are some common code smells identified in Clean Code?

  • Duplicated Code: This is a major code smell that indicates a lack of abstraction. The book advises eliminating duplication to improve maintainability and reduce errors.
  • Long Methods: Methods that are too long can be difficult to understand and maintain. The book suggests breaking them down into smaller, more manageable functions.
  • Excessive Comments: While comments can be helpful, excessive or redundant comments often indicate that the code itself is not clear. The goal should be to write self-explanatory code that requires minimal comments.

How can I apply the principles from Clean Code in my own projects?

  • Start with Small Changes: Begin by applying the principles of clean code to small sections of your codebase. Refactor one class or function at a time to improve readability and maintainability.
  • Write Tests First: Adopt Test-Driven Development (TDD) practices by writing tests before implementing new features. This ensures that your code is always covered by tests and helps maintain quality.
  • Regularly Refactor: Make refactoring a regular part of your development process. Continuously look for opportunities to improve code structure and eliminate duplication, keeping your codebase clean and efficient.

Avaliações

4.37 de 5
Média de 22k+ avaliações do Goodreads e da Amazon.

Código Limpo é amplamente reconhecido como uma leitura essencial para desenvolvedores de software, oferecendo insights valiosos sobre como escrever código legível e de fácil manutenção. Embora seja elogiado por seus conselhos práticos sobre convenções de nomenclatura, design de funções e testes, alguns leitores o consideraram excessivamente centrado em Java e, por vezes, extremo em suas recomendações. Os estudos de caso do livro receberam reações mistas, com alguns os achando úteis e outros menos impressionados. Apesar de suas falhas, muitos desenvolvedores o consideram uma leitura obrigatória que melhorou significativamente suas práticas de codificação e compreensão da arte do software.

Sobre o autor

Robert Cecil Martin, conhecido como Uncle Bob, é um renomado engenheiro de software e defensor das metodologias de desenvolvimento Ágil. Como Presidente da Object Mentor Inc., lidera uma equipe de consultores especializados em Design Orientado a Objetos, Padrões, UML e práticas Ágeis. A expertise de Martin abrange diversas linguagens de programação e metodologias, incluindo C++ e eXtreme Programming. Ele atuou como Editor Chefe do C++ Report e é um palestrante muito requisitado em conferências internacionais. A influência de Martin na comunidade de desenvolvimento de software é significativa, com seus ensinamentos e livros moldando as melhores práticas para um código limpo e a arte profissional do software.

Other books by Robert C. Martin

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Ratings: Rate books & see your ratings
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 10
📜 Unlimited History
Free users are limited to 10
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Mar 1,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
50,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Settings
Appearance
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →