Searching...
Español
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+ calificaciones
Escuchar
Listen to Summary

Puntos clave

1. El código limpio es legible, simple y expresivo

El código limpio siempre parece haber sido escrito por alguien que se preocupa.

La claridad es clave. El código limpio se caracteriza por su legibilidad y simplicidad. Debe ser fácil de entender, modificar y mantener para otros programadores. Esto implica utilizar nombres claros y significativos, mantener las funciones y clases pequeñas y enfocadas, y organizar el código de manera lógica.

El código expresivo comunica la intención. El código limpio debe expresar claramente la intención del programador sin necesidad de comentarios extensos. Esto se logra a través de nombres bien elegidos, funciones pequeñas que hacen una cosa bien y una estructura general clara. El código en sí mismo debe contar una historia, facilitando a los lectores seguir la lógica y el propósito de cada componente.

La mejora continua es esencial. Escribir código limpio es un proceso continuo que requiere atención constante y refactorización. Los programadores deben seguir la Regla del Boy Scout: "Deja el campamento más limpio de lo que lo encontraste." Esto significa siempre buscar oportunidades para mejorar la claridad y la estructura del código, incluso en pequeñas formas, con cada modificación o adición.

2. Nombres significativos mejoran la claridad y mantenibilidad del código

El nombre de una variable, función o clase debe responder a todas las grandes preguntas. Debe decirte por qué existe, qué hace y cómo se utiliza.

Elige nombres descriptivos. Los nombres deben ser autoexplicativos y revelar la intención detrás de las variables, funciones y clases. Evita nombres de una sola letra, abreviaturas o códigos crípticos que requieran un mapeo mental para entender su propósito.

Usa convenciones de nomenclatura de manera consistente. Adopta y mantén convenciones de nomenclatura estándar para tu lenguaje de programación y equipo. Esto incluye:

  • CamelCase para nombres de clases (por ejemplo, PedidoCliente)
  • camelCase para nombres de variables y funciones (por ejemplo, montoTotal)
  • ALL_CAPS para constantes (por ejemplo, TAMAÑO_MAXIMO)

Evita la desinformación y el ruido. No uses nombres que puedan ser engañosos o confusos. Por ejemplo, evita usar 'lista' en un nombre de variable si en realidad no es una Lista. Además, evita palabras redundantes o sin significado en los nombres, como 'datos' o 'info' cuando no añaden valor.

3. Las funciones deben ser pequeñas, hacer una sola cosa y operar a un solo nivel de abstracción

Las funciones deben hacer una cosa. Deben hacerlo bien. Deben hacerlo solamente.

Mantén las funciones pequeñas. Las funciones ideales no deben tener más de 20 líneas. Esto las hace más fáciles de leer, entender y mantener. Las funciones más pequeñas también son más fáciles de nombrar con precisión, probar y reutilizar.

Principio de responsabilidad única. Cada función debe tener un propósito claramente definido. Si una función está haciendo múltiples cosas, debe dividirse en funciones más pequeñas y enfocadas. Esto mejora la legibilidad y hace que el código sea más modular y fácil de modificar.

Nivel de abstracción consistente. Dentro de una función, todas las operaciones deben estar al mismo nivel de abstracción. Mezclar lógica de alto nivel con detalles de bajo nivel hace que las funciones sean más difíciles de entender y mantener. Utiliza la técnica de refactorización "Extraer Método" para separar diferentes niveles de abstracción en funciones distintas.

4. Los comentarios deben ser mínimos y verdaderamente necesarios

El uso adecuado de los comentarios es compensar nuestra incapacidad para expresarnos en código.

El código debe ser autoexplicativo. Un código bien escrito con nombres y estructura claros a menudo elimina la necesidad de comentarios. Antes de agregar un comentario, considera si puedes refactorizar el código para que su intención sea más clara.

Usa comentarios con juicio. Los buenos comentarios explican por qué se hace algo, no cómo se hace. Deben proporcionar contexto o aclaraciones que no se pueden expresar solo en código. Tipos de comentarios útiles incluyen:

  • Comentarios legales (derechos de autor, licencias)
  • Explicación de la intención o algoritmos
  • Advertencias sobre consecuencias
  • Comentarios TODO (usados con moderación)

Evita comentarios redundantes o engañosos. No escribas comentarios que simplemente repitan lo que el código dice claramente. Los comentarios desactualizados o incorrectos son peores que no tener comentarios en absoluto, ya que pueden confundir a los lectores. Revisa y actualiza regularmente los comentarios junto con el código que describen.

5. Un formato adecuado mejora la legibilidad del código

El formato del código se trata de comunicación, y la comunicación es la primera prioridad del desarrollador profesional.

El estilo consistente importa. Establece y sigue un estilo de formato consistente en tu base de código. Esto incluye:

  • Sangrías
  • Saltos de línea
  • Colocación de llaves
  • Espaciado alrededor de operadores y palabras clave

Formato vertical. Organiza el código verticalmente para mejorar la legibilidad:

  • Mantén conceptos relacionados juntos
  • Separa conceptos no relacionados
  • Declara variables cerca de su uso
  • Coloca funciones dependientes cerca unas de otras

Formato horizontal. Mantén las líneas razonablemente cortas (generalmente de 80 a 120 caracteres) para evitar la necesidad de desplazamiento horizontal. Divide declaraciones largas en múltiples líneas de manera lógica. Usa espacios en blanco para separar bloques lógicos dentro de una línea.

6. Los objetos y las estructuras de datos sirven a diferentes propósitos

Los objetos ocultan sus datos detrás de abstracciones y exponen funciones que operan sobre esos datos. Las estructuras de datos exponen sus datos y no tienen funciones significativas.

Objetos vs. estructuras de datos. Los objetos encapsulan datos y exponen comportamiento a través de métodos. Son buenos para agregar nuevos tipos (clases) sin cambiar el comportamiento existente. Las estructuras de datos, por otro lado, exponen datos y no tienen un comportamiento significativo. Son buenas para agregar nuevos comportamientos sin cambiar los tipos de datos existentes.

Elige el enfoque correcto. Usa objetos cuando quieras agregar nuevos tipos con frecuencia pero mantener los comportamientos estables. Usa estructuras de datos cuando quieras agregar nuevos comportamientos con frecuencia pero mantener los tipos estables. Comprender esta distinción ayuda a diseñar sistemas más flexibles y mantenibles.

Ley de Demeter. Para los objetos, sigue la Ley de Demeter: un método solo debe llamar a métodos en:

  • El objeto mismo
  • Sus parámetros
  • Cualquier objeto que cree
  • Sus objetos componentes directos
    Este principio ayuda a reducir el acoplamiento entre diferentes partes de un sistema.

7. El manejo de errores debe ser limpio e informativo

El manejo de errores es importante, pero si oscurece la lógica, está mal.

Usa excepciones en lugar de códigos de error. Las excepciones proporcionan una forma más limpia de manejar errores en comparación con los códigos de error tradicionales. Separan la lógica de manejo de errores del código principal, haciendo que ambos sean más fáciles de entender y mantener.

Crea mensajes de error informativos. Los mensajes de error deben proporcionar suficiente contexto para entender qué salió mal y dónde. Incluye detalles relevantes como:

  • Qué operación se estaba intentando
  • Qué error específico ocurrió
  • Cualquier valor o información de estado relevante

Escribe primero las declaraciones try-catch-finally. Al escribir código que podría lanzar excepciones, comienza escribiendo los bloques try-catch-finally. Esto ayuda a garantizar que el código sea resistente a errores desde el principio y que los casos de error se consideren adecuadamente.

8. Las pruebas unitarias son cruciales para mantener un código limpio

El código de prueba es tan importante como el código de producción.

Escribe pruebas primero. Sigue la práctica del Desarrollo Guiado por Pruebas (TDD):

  1. Escribe una prueba que falle
  2. Escribe el código mínimo para pasar la prueba
  3. Refactoriza el código mientras mantienes la prueba aprobada
    Este enfoque asegura que tu código sea testeable desde el principio y ayuda a impulsar un buen diseño.

Mantén las pruebas limpias. Aplica los mismos estándares de limpieza a tu código de prueba que a tu código de producción. Las pruebas limpias son:

  • Legibles
  • Mantenibles
  • Confiables

Sigue los principios F.I.R.S.T para las pruebas:

  • Rápidas: Las pruebas deben ejecutarse rápidamente
  • Independientes: Las pruebas no deben depender unas de otras
  • Repetibles: Las pruebas deben ser repetibles en cualquier entorno
  • Auto-validantes: Las pruebas deben tener una salida booleana (aprobada/fallida)
  • Oportunas: Las pruebas deben escribirse justo antes del código de producción

9. Las clases deben ser pequeñas, enfocadas y seguir el Principio de Responsabilidad Única

La primera regla de las clases es que deben ser pequeñas. La segunda regla de las clases es que deben ser más pequeñas que eso.

Mantén las clases enfocadas. Una clase debe tener una única responsabilidad bien definida. Si no puedes describir el propósito de una clase en unas 25 palabras sin usar "y" o "o", probablemente esté haciendo demasiado.

Apunta a una alta cohesión. Los métodos y variables dentro de una clase deben estar estrechamente relacionados y trabajar juntos para cumplir con la responsabilidad de la clase. La baja cohesión a menudo indica que una clase está tratando de hacer demasiado y debería dividirse.

Principio Abierto-Cerrado. Diseña clases para que estén abiertas a la extensión pero cerradas a la modificación. Esto a menudo implica usar abstracciones e interfaces para permitir que se agregue nueva funcionalidad sin cambiar el código existente.

10. La concurrencia requiere un diseño e implementación cuidadosos

Escribir programas concurrentes limpios es difícil—muy difícil.

Comprende los desafíos de la concurrencia. La programación concurrente introduce complejidades como:

  • Condiciones de carrera
  • Interbloqueos
  • Problemas de vivacidad
  • Impactos en el rendimiento

Mantén el código relacionado con la concurrencia separado. Aísla el código que trata con la concurrencia. Esto facilita el razonamiento, la prueba y el mantenimiento tanto de las partes concurrentes como de las no concurrentes de tu sistema.

Usa bibliotecas y marcos existentes. Aprovecha bibliotecas y marcos de concurrencia bien probados (por ejemplo, java.util.concurrent en Java) en lugar de intentar implementar el control de concurrencia de bajo nivel tú mismo. Estas herramientas han sido optimizadas y probadas exhaustivamente para patrones de concurrencia comunes.

Escribe pruebas exhaustivas. Probar código concurrente es un desafío, pero crucial. Escribe pruebas que:

  • Creen múltiples hilos
  • Varíen el tiempo y la programación
  • Se ejecuten muchas veces para aumentar la posibilidad de exponer problemas intermitentes
  • Usen herramientas como sanitizadores de hilos y analizadores estáticos para ayudar a identificar posibles errores de concurrencia.

Última actualización:

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.

Reseñas

4.37 de 5
Promedio de 22k+ calificaciones de Goodreads y Amazon.

Código Limpio es ampliamente considerado como una lectura esencial para los desarrolladores de software, ofreciendo valiosas perspectivas sobre cómo escribir código legible y mantenible. Aunque se elogia por sus consejos prácticos sobre convenciones de nomenclatura, diseño de funciones y pruebas, algunos lectores lo encontraron excesivamente centrado en Java y, en ocasiones, extremo en sus recomendaciones. Los estudios de caso del libro recibieron reacciones mixtas, con algunos considerándolos útiles y otros menos impresionados. A pesar de sus defectos, muchos desarrolladores lo consideran una lectura obligada que ha mejorado significativamente sus prácticas de codificación y su comprensión de la artesanía del software.

Sobre el autor

Robert Cecil Martin, conocido como Tío Bob, es un ingeniero de software de renombre y defensor de las metodologías de desarrollo Ágil. Como presidente de Object Mentor Inc., lidera un equipo de consultores especializados en Diseño Orientado a Objetos, Patrones, UML y prácticas Ágiles. La experiencia de Martin abarca diversos lenguajes de programación y metodologías, incluyendo C++ y Programación Extrema. Ha sido editor en jefe de C++ Report y es un conferencista muy solicitado en conferencias internacionales. La influencia de Martin en la comunidad de desarrollo de software es significativa, con sus enseñanzas y libros moldeando las mejores prácticas para un código limpio y la artesanía profesional en software.

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Home
Library
Get App
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Get personalized suggestions
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 May 5,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,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.
Scanner
Find a barcode to scan

Settings
General
Widget
Appearance
Loading...
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →