2009-03-17 7 views
18

He comprado este libro para nuestro grupo en la empresa, tal vez, para mejorar nuestras habilidades de diseño y, finalmente, tener mejores prácticas de programación. Mientras lo leí, encontré, principalmente, un conjunto de ingeniosos trucos que se pueden usar con la plantilla, y no estoy seguro si vale la pena, y no es perjudicial, incorporarlo a nuestro código, introduciendo así la complejidad/legibilidad del código y la imposibilidad de mantenimiento. .Diseño moderno en C++ Programación genérica y patrones de diseño aplicados

Me gustaría saber de los practicantes de follow, ¿qué usas de ese libro? ¿Qué es relevante e importante para el desarrollo de software profesional, qué se debe evitar?

Pensé en general sobre este libro y cómo encaja en el desarrollo de software del sistema a gran escala (en el mismo caso, me encanta el libro de John Lakos)?

¿Qué es el efecto Alexandrescu?

+0

+1, cuando leí ese libro, tenía casi las mismas preguntas en mente. –

Respuesta

22

Fuera de los usos de plantilla estándar, la operación que encuentro más útil acerca de la información que se habla sobre programación C++ genérica es la capacidad de utilizar plantillas para crear errores de tiempo de compilación para escenarios de código no válidos. Una vez que lo domine, puede volverse muy eficiente convirtiendo una clase de lo que sería un error de tiempo de ejecución en un error de tiempo de compilación.

He tenido mucho éxito haciendo eso en el trabajo. Claro que produce mensajes completamente ilegibles y mis colegas de vez en cuando se acercan y dicen "¿qué demonios es eso?". Pero cada vez era un error y no pudieron compilarlo. También comento mucho los errores en particular con la esperanza de que sea moderadamente comprensible.

+0

Creo que esa es probablemente la mejor razón por la que está a favor de la magia de la plantilla. Permitirle mover los errores del tiempo de ejecución al tiempo de compilación ahorra mucho tiempo y esfuerzo a todos. +1 – jalf

+1

+1. Cada vez que mueves la detección de un error más cerca a tiempo de su introducción, ganas. –

+1

¿Conoce algún buen material sobre esta práctica en internet? Realmente agradecería cualquier enlace/material. – shuttle87

1

En mi humilde opinión, leyendo (y entendiendo!) El primer capítulo del libro es útil (creo que incluso está disponible en línea de forma gratuita). El resto del libro describe más o menos las partes internas de la biblioteca de Loki y realmente no lo recomiendo.

+0

Así es como yo lo pienso también –

15

Alrededor de 2005 me metí pesadamente en las plantillas de expresiones y varios trucos en tiempo de compilación para hacer que las bibliotecas fueran muy expresivas, como los lenguajes internos específicos de dominio incrustados en C++. En particular, una cosa de SQL embebido bastante completa, similar a lo que ha salido desde entonces como Linq en .NET.

Para los usuarios, está bien. Pero para cualquiera que no sea yo tratando de mantenerlo, presentaba una curva de aprendizaje enormemente empinada. Entonces ese es el problema con eso; como cualquier técnica "inteligente", reduce el grupo de personas que pueden mantenerla.

Esto está bien para las bibliotecas de clases ampliamente utilizadas, que los usuarios generales nunca necesitan comprender. Pero para las bibliotecas "internas" propiedad de un equipo específico, probablemente todas tengan que ser capaces de parchearlo o extenderlo con sensatez. Las posibilidades más arcanas de las plantillas C++ parecen excluir esto, en mi experiencia.

Aunque fue muy divertido.

+0

+1 excelente consejo. – peterchen

6

Si su empresa/proyecto permite el impulso. Este libro te ayudará a descubrir algo de magia de impulso solo para tu propia satisfacción.

Si su Empresa/Proyecto no permite el impulso. Este libro será una buena guía para recrear algunas partes de impulso que más necesitas, como boost :: function.

Creo que en cada proyecto hay algún tipo de módulo de utilidad. Tal libro le ayudará a hacer que su 'utilidad' sea más genérica y segura tomando prestados algunos libros, patrones sugeridos y trucos de SFINAE.

Y sobre todo, este libro mostrará cómo puede repensar algunos de los patrones de diseño de GOF que cambian el polimorfismo de tiempo de ejecución con estática.

3
  • ¿Qué se utiliza directamente del libro? Nada, no uso Loki o Boost.
  • ¿Ha influido en mi código? No realmente - Estaba familiarizado con el concepto de políticas antes de leer el libro
  • ¿Merece la pena leerlo? ¡Seguro!
2

Para mí fue más una experiencia de ampliación de la mente. Leí el libro y seguí aprendiendo detalles y trucos, algunos de los cuales he usado más adelante. Pero la parte más importante es que el diseño con mayúscula D se trata en el libro todo el tiempo (sin juego de palabras con el lenguaje D).

El capítulo sobre punteros inteligentes cambia mi mentalidad de 'proporcionar todas las funcionalidades posibles' a una más conservadora: considere lo que ofrece, ¿vale la pena? ¿Cómo puede romper el código? ¿Ayudará al usuario? ¿Hará que el código sea frágil creando trampas sutiles?

La parte del diseño basado en políticas debe hacerle pensar al diseñar si sus clases podrían/​​deberían dividirse mejor en unidades ortogonales más pequeñas. Mientras que en la mayoría de los casos no termino dividiéndome en todas las clases de políticas, el código generalmente termina siendo más limpio ya que las diferentes piezas ortogonales se enredan menos.

Oh, como Earwicker, mi primera reacción fue implementar material sofisticado que realmente aceleró parte del desarrollo, pero de nuevo, en la pequeña empresa para la que trabajo, soy el único capaz de mantenerlo y eso realmente es un problema . No más de hacerlo. Se necesitan dos veces los cerebros para depurar y mantener de lo necesario para desarrollarse.

0

No he usado Loki pero he usado activamente boost en mi trabajo anterior. Boost ha implementado muchas ideas de este lindo libro;

Las cosas de este libro no están pensadas para su uso en Business Logic, deben implementarse en bibliotecas (Boost, Loki, algo propio) y bibliotecas utilizadas en Business Logic. Esta es una cosa diferente "usar estos trucos en el código" o "implementar biblioteca separada usando este truco y usar hermosas bibliotecas en la mayoría de tu código (por ejemplo boost :: bind - implementación fea pero agradable en el uso) pero casi nunca ves esta implementación) "

También este libro demuestra la poderosa meta-programación de C++ y un buen entrenamiento para el cerebro.

0

Experimenté algunas reacciones groseras de las personas cuando dije usar cosas del diseño Modern C++. Primero, comentarios WTF. Esto fue seguido por comentarios de "no intente ser demasiado inteligente". Entonces, una mejor comprensión de las ideas. Y, finalmente, la aceptación de las ideas hasta el punto en que forman parte del vocabulario común.

Asegúrese de tener a mano varias copias de este libro. Idealmente, compre una copia para cada desarrollador. Además, hasta que esto se convierta en un vocabulario común entre los desarrolladores, cite el patrón/idioma y las páginas relevantes en sus comentarios.