Diseño de API de biblioteca C ++

12

Estoy buscando un buen recurso para aprender sobre un buen diseño de API para bibliotecas de C ++, mirar objetos / dlls compartidos, etc. Hay muchos recursos para escribir buenas API, buenas clases, plantillas, etc. a nivel fuente, pero casi nada sobre poner cosas juntas en libs y ejecutables compartidos. Libros como el diseño de software C ++ a gran escala de John Lakos son interesantes pero están enormemente desactualizados.

Lo que estoy buscando es un consejo, es decir, sobre el manejo de plantillas. Con las plantillas en mi API, a menudo termino con el código de la biblioteca en mi ejecutable (u otra biblioteca), por lo que si soluciono un error allí, simplemente no puedo implementar la nueva biblioteca, sino que tengo que volver a compilar y redistribuir todos los clientes de ese código. (y sí, conozco algunas soluciones como tratar de crear instancias de al menos las versiones más comunes dentro de la biblioteca, etc.)

También estoy buscando otras advertencias y cosas para tener en cuenta para mantener la compatibilidad binaria mientras trabajo en bibliotecas C ++.

¿Hay un buen sitio web o libro sobre tales cosas?

johannes
fuente
Lo manejé de esta manera: sivut.koti.soon.fi/~terop/GameApi.html , es decir, si bien hay plantillas dentro de la biblioteca, ninguna de ellas está en la api ...
tp1
1
std::unique_ptrEs algo bastante nuevo. ¿Qué crees que era más adecuado para tu API propuesta? ¿La forma en que tenía que administrar manualmente todos los recursos, garantizando virtualmente fugas y eliminaciones dobles, por ejemplo? ¿O la forma en que muchos de sus tipos tenían nombres de una o dos letras, haciendo imposible adivinar su propósito?
DeadMG
1
@ tp1: Pero no te preocupaste por ver si los manejaba. Acabas de decir "MANEJARLOS" sin hacer nada al respecto. No los manejé y ahora ¿qué? En lugar de usar una clase RAII que no permite tales errores. Si lo hubiera usado unique_ptr, no sería posible escribir código como ese.
DeadMG
1
@ tp1: me di cuenta de que Env puede ser destruido. Eso es practicamente todo. No parece haber ninguna funcionalidad para administrar objetos, en absoluto. Si quisiera administrar la memoria con más precisión que "Todo lo que he creado" o "Nada", parecería que estoy jodido.
DeadMG
3
Lleve cualquier conversación extendida a Chat de ingeniería de software . ¿Se puede incorporar información útil en la pregunta o respuesta?
ChrisF

Respuestas:

12

De hecho, hay un libro que es precisamente lo que buscas. Se llama, apropiadamente, Diseño de API para C ++. El sitio web del libro tiene el código fuente del libro y también la errata .

Ingeniero mundial
fuente
1
Definitivo +1 para el libro! Vine a sugerir esto, pero resulta que me ganaste.
zxcdw
+1: Estoy terminando de leer este libro y es un gran recurso. Muy recomendable.
Korchkidu
3

Esto es casi imposible. El hecho simple es que a veces, necesitas el compilador para hacer un trabajo, y no puedes simplemente eliminar esa necesidad. No hay ninguna función que pueda hacer que std::vectorno sea una biblioteca de solo encabezado. El compilador puede hacer que muchas magias funcionen, pero no puedes tenerlas sin invocarlas, y eso es una realidad.

Esto es lo que puede hacer: no use plantillas donde no las necesite. Esto es lo que no puedes hacer: cualquier otra cosa.

El hecho simple es que recompilar con la nueva versión realmente no es una carga tan grande en comparación con las ventajas de rendimiento, seguridad y funcionalidad que puede obtener con las bibliotecas estáticamente tipadas.

DeadMG
fuente
2
Mencioné eso como un ejemplo para pensar. lo que estoy buscando es orientación sobre otros temas similares para los que debería prepararme y las mejores prácticas para manejarlos.
johannes
Bueno, si todas las nuevas versiones que rompen la compatibilidad ABI se colocan en un nuevo espacio de nombres en línea, ¿qué importa si es una biblioteca de solo encabezado o no?
Deduplicador