Prefacio

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

En tus manos tienes el libro de C++ que me hubiera gustado tener hace muchos años. No como uno de mis primeros libros, no, sino como un libro avanzado, cuando ya hubiera digerido la mecánica del lenguaje y fuera capaz de pensar más allá de la sintaxis C++. Sí, este libro me habría ayudado definitivamente a comprender mejor los aspectos fundamentales del software mantenible, y estoy seguro de que también te ayudará a ti.

Por qué escribí este libro

Cuando empecé a profundizar en el lenguaje (unos años después de que se publicara el primer estándar C++), ya había leído prácticamente todos los libros sobre C++ que existían. Pero a pesar de que muchos de esos libros eran estupendos y sin duda allanaron el camino para mi carrera actual como formador y consultor en C++, estaban demasiado centrados en los pequeños detalles y en las particularidades de la implementación, y demasiado alejados del panorama general del software mantenible.

En aquella época, muy pocos libros se centraban realmente en el panorama general, tratando del desarrollo de grandes sistemas de software. Entre ellos estaban Large ScaleC++ Software Design, de John Lakos,1 una introducción estupenda pero literalmente pesada a la gestión de dependencias, y el llamado libro Gang of Four, que esel libro clásico sobre patrones de diseño de software.2 Por desgracia, a lo largo de los años, esta situación no ha cambiado realmente: la mayoría de los libros, charlas, blogs, etc., se centran principalmente en la mecánica y las características del lenguaje: los pequeños detalles y las particularidades. Muy pocos, y en mi opinión demasiado pocos, se centran en el software mantenible, la modificabilidad, la extensibilidad y la comprobabilidad. Y si lo intentan, desgraciadamente vuelven a caer rápidamente en el hábito común de explicar la mecánica del lenguaje y demostrar las características.

Por eso he escrito este libro. Un libro que, a diferencia de la mayoría de los demás, no dedica tiempo a la mecánica o a las numerosas características del lenguaje, sino que se centra principalmente en la capacidad de cambio, la extensibilidad y la comprobabilidad del software en general. Un libro que no pretende que el uso de nuevas normas o características de C++ marque la diferencia entre un software bueno o malo, sino que muestra claramente que lo decisivo es la gestión de las dependencias, que las dependencias de nuestro código deciden entre que sea bueno o malo. Como tal, es un tipo de libro poco común en el mundo de C++, ya que se centra en el panorama general: el diseño del software.

De qué trata este libro

Diseño de software

Desde mi punto de vista, un buen diseño de software es la esencia de todo proyecto de software de éxito. Sin embargo, a pesar de su papel fundamental, hay muy poca literatura sobre el tema, y muy pocos consejos sobre qué hacer y cómo hacer las cosas bien. ¿Por qué? Pues porque es difícil. Muy difícil. Probablemente sea la faceta más difícil de escribir software a la que tengamos que enfrentarnos. Y eso se debe a que no existe una única solución "correcta", ni un consejo "de oro" que pueda transmitirse a través de las generaciones de desarrolladores de software. Siempre depende.

A pesar de esta limitación, daré consejos sobre cómo diseñar software bueno y de alta calidad. Proporcionaré principios de diseño, directrices de diseño y patrones de diseño que te ayudarán a comprender mejor cómo gestionar las dependencias y convertir tu software en algo con lo que puedas trabajar durante décadas. Como ya he dicho, no hay consejos "de oro", y este libro no contiene ninguna solución definitiva o perfecta. En su lugar, intento mostrar los aspectos más fundamentales de un buen software, los detalles más importantes, la diversidad y los pros y los contras de los distintos diseños. También formularé objetivos de diseño intrínsecos y demostraré cómo alcanzarlos con C++ Moderno.

C++ moderno

Durante más de una década, hemos estado celebrando la llegada del C++ Moderno, aplaudiendo las muchas nuevas características y extensiones del lenguaje y, al hacerlo, creando la impresión de que el C++ Moderno nos ayudará a resolver todos los problemas relacionados con el software. En este libro no es así. Este libro no pretende que arrojar unos cuantos punteros inteligentes al código hará que éste sea "Moderno" o producirá automáticamente un buen diseño. Además, este libro no mostrará el C++ Moderno como un surtido de nuevas características. En su lugar, mostrará cómo ha evolucionado la filosofía del lenguaje y la forma en que implementamos las soluciones C++ hoy en día.

Pero, por supuesto, también veremos código. Mucho código. Y, por supuesto, este libro hará uso de las características de los nuevos estándares de C++ (incluido C++20). Sin embargo, también hará un esfuerzo por destacar que el diseño es independiente de los detalles de implementación y de las características utilizadas. Las nuevas características no cambian las reglas sobre lo que es un buen diseño o un mal diseño; simplemente cambian la forma en que implementamos un buen diseño. Facilitan la aplicación de un buen diseño. Así que este libro muestra y discute los detalles de implementación, pero (esperemos) no se pierde en ellos y siempre permanece centrado en el panorama general: el diseño de software y los patrones de diseño.

Patrones de diseño

Como en cuanto empiezas a mencionar los patrones de diseño, inadvertidamente conjuras la expectativa de la programación orientada a objetos y las jerarquías de herencia. Sí, este libro mostrará el origen orientado a objetos de muchos patrones de diseño. Sin embargo, hará especial hincapié en el hecho de que no hay una única forma de hacer un buen uso de un patrón de diseño. Demostraré cómo ha evolucionado y se ha diversificado la implementación de patrones de diseño, haciendo uso de muchos paradigmas diferentes, como la programación orientada a objetos, la programación genérica y la programación funcional. Este libro reconoce la realidad de que no existe un único paradigma verdadero y no pretende que haya un único enfoque, una solución que funcione siempre para todos los problemas. En su lugar, intenta mostrar el C++ moderno como lo que realmente es: la oportunidad de combinar todos los paradigmas, entretejerlos en una red fuerte y duradera, y crear un diseño de software que perdure a lo largo de las décadas.

Espero que este libro resulte ser la pieza que faltaba en la literatura sobre C++. Espero que te ayude tanto como me hubiera ayudado a mí. Espero que contenga algunas respuestas que has estado buscando y te proporcione un par de ideas clave que te faltaban. Y también espero que este libro te mantenga algo entretenido y motivado para leerlo todo. Pero lo más importante es que espero que este libro te muestre la importancia del diseño de software y el papel que desempeñan los patrones de diseño. Porque, como verás, ¡los patrones de diseño están por todas partes!

A quién va dirigido este libro

Este libro es valioso para todo desarrollador de C++. En concreto, es para todo desarrollador de C++ interesado en comprender los problemas habituales del software mantenible y conocer las soluciones comunes a estos problemas (y supongo que eso es, de hecho,todo desarrollador de C++). Sin embargo, este libro no es un libro para principiantes en C++. De hecho, la mayoría de las directrices de este libro requieren cierta experiencia con el desarrollo de software en general y con C++ en particular. Por ejemplo, doy por supuesto que dominas la mecánica del lenguaje de las jerarquías de herencia y que tienes cierta experiencia con las plantillas. Así podré recurrir a las funciones correspondientes siempre que sea necesario y apropiado. De vez en cuando, incluso echaré mano de algunas características de C++20 (en particular, de los conceptos de C++20). Sin embargo, como la atención se centra en el diseño de software, rara vez me detendré en explicar una característica concreta, así que si una característica te resulta desconocida, consulta tu referencia favorita del lenguaje C++. Sólo ocasionalmente añadiré algunos recordatorios, sobre todo acerca de modismos comunes de C++ (como la Regla de 5).

Cómo está estructurado este libro

Este libro está organizado en capítulos, cada uno de los cuales contiene varias pautas. Cada pauta se centra en un aspecto clave del software mantenible o en un patrón de diseño concreto. Por lo tanto, las directrices representan lo más importante, los aspectos que espero que te aporten más valor. Están escritas de forma que puedas leerlas todas de principio a fin, pero como sólo están ligeramente acopladas, también te permiten empezar por la directriz que más te llame la atención. Aun así, no son independientes. Por eso, cada directriz contiene las referencias cruzadas necesarias a otras directrices para mostrarte que todo está conectado.

Convenciones utilizadas en este libro

En este libro se utilizan las siguientes convenciones tipográficas:

Cursiva

Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo y extensiones de archivo.

Constant width

Se utiliza en los listados de programas, así como dentro de los párrafos para referirse a elementos del programa como nombres de variables o funciones, bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.

Constant width bold

Muestra comandos u otros textos que deben ser tecleados literalmente por el usuario.

Constant width italic

Muestra el texto que debe sustituirse por valores proporcionados por el usuario o por valores determinados por el contexto.

Consejo

Este elemento significa un consejo o sugerencia.

Nota

Este elemento significa una nota general.

Utilizar ejemplos de código

El material complementario (ejemplos de código, ejercicios, etc.) está disponible para su descarga en https://github.com/igl42/cpp_software_design.

Si tienes una pregunta técnica o un problema al utilizar los ejemplos de código, envía un correo electrónico a

Este libro está aquí para ayudarte a hacer tu trabajo. En general, si se ofrece código de ejemplo con este libro, puedes utilizarlo en tus programas y documentación. No es necesario que te pongas en contacto con nosotros para pedirnos permiso, a menos que estés reproduciendo una parte importante del código. Por ejemplo, escribir un programa que utilice varios trozos de código de este libro no requiere permiso. Vender o distribuir ejemplos de libros de O'Reilly sí requiere permiso. Responder a una pregunta citando este libro y el código de ejemplo no requiere permiso. Incorporar una cantidad significativa de código de ejemplo de este libro en la documentación de tu producto sí requierepermiso.

Agradecemos la atribución, pero en general no la exigimos. Una atribución suele incluir el título, el autor, la editorial y el ISBN. Por ejemplo "Diseño de Software C++ por Klaus Iglberger (O'Reilly). Copyright 2022 Klaus Iglberger, 978-1-098-11316-2".

Si crees que el uso que haces de los ejemplos de código no se ajusta al uso legítimo o al permiso concedido anteriormente, no dudes en ponerte en contacto con nosotros en

Aprendizaje en línea O'Reilly

Nota

Durante más de 40 años, O'Reilly Media ha proporcionado formación tecnológica y empresarial, conocimientos y perspectivas para ayudar a las empresas a alcanzar el éxito.

Nuestra red única de expertos e innovadores comparten sus conocimientos y experiencia a través de libros, artículos y nuestra plataforma de aprendizaje online. La plataforma de aprendizaje en línea de O'Reilly te ofrece acceso bajo demanda a cursos de formación en directo, rutas de aprendizaje en profundidad, entornos de codificación interactivos y una amplia colección de textos y vídeos de O'Reilly y de más de 200 editoriales. Para más información, visita http://oreilly.com.

Cómo contactar con nosotros

Por favor, dirige tus comentarios y preguntas sobre este libro a la editorial:

  • O'Reilly Media, Inc.
  • 1005 Gravenstein Highway Norte
  • Sebastopol, CA 95472
  • 800-998-9938 (en Estados Unidos o Canadá)
  • 707-829-0515 (internacional o local)
  • 707-829-0104 (fax)

Tenemos una página web para este libro, donde se enumeran erratas, ejemplos y cualquier información adicional. Puedes acceder a esta página en https://oreil.ly/c-plus-plus.

Envía un correo electrónico para comentar o hacer preguntas técnicas sobre este libro.

Para noticias e información sobre nuestros libros y cursos, visita http://oreilly.com.

Encuéntranos en LinkedIn: https://linkedin.com/company/oreilly-media.

Síguenos en Twitter: http://twitter.com/oreillymedia.

Míranos en YouTube: http://youtube.com/oreillymedia.

Agradecimientos

Un libro como éste nunca es el logro de un solo individuo. Al contrario, tengo que dar las gracias explícitamente a muchas personas que me ayudaron de distintas formas a hacer realidad este libro. Ante todo, quiero expresar mi profunda gratitud a mi mujer, Steffi, que leyó todo el libro sin siquiera conocer a C++. Y que cuidó de nuestros dos hijos para darme la calma necesaria para llevar toda esta información al papel (aún no estoy seguro de cuál de los dos fue el mayor sacrificio).

Un agradecimiento especial a mis revisores, Daniela Engert, Patrice Roy, Stefan Weller, Mark Summerfield y Jacob Bandes-Storch, por invertir su valioso tiempo en hacer de éste un libro mejor, cuestionando constantemente mis explicaciones y ejemplos.

Muchas gracias también a Arthur O'Dwyer, Eduardo Madrid y Julian Schmidt por sus aportaciones y comentarios sobre el patrón de diseño Type Erasure, y a Johannes Gutekunst por las discusiones sobre la arquitectura del software y la documentación.

Además, quiero dar las gracias a mis dos fríos lectores, Matthias Dörfel y Vittorio Romeo, que me ayudaron a detectar muchos errores de última hora (y vaya si lo hicieron).

Por último, pero no por ello menos importante, un gran agradecimiento a mi editora, Shira Evans, que ha pasado muchas horas dando consejos inestimables para que el libro sea más coherente y más divertido de leer.

1 John Lakos, Diseño de software C++ a gran escala (Addison-Wesley, 1996).

2 Erich Gamma et al., Patrones de diseño: Elements of Reusable Object-Oriented Software (Addison-Wesley, 1994).

Get Diseño de software en C now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.