Cómo escribir una biblioteca para un lenguaje de programación

Gran pregunta Esto es realmente un problema sorprendentemente común, y es equivalente a preguntar, “¿Cómo diseño e implemento una API?” para una determinada clase de plataformas de programación (que dependen de las bibliotecas). Pienso en este tipo de programación como una interacción entre tres niveles:

  • Función
  • Diseño
  • Implementación

Es decir, comienzas con una idea de lo que quieres que haga , p. Ej.

  • “Quiero poder ver una recopilación de datos que tiene fechas como una serie de tiempo”. o
  • “Quiero poder tratar un flujo RSS como si fuera una colección de objetos de documento de solo lectura”. o
  • “Quiero poder hacer cosas interesantes con los calibres de municiones para armas de mano”.

Cualquier cosa en realidad. Luego comienzas a escribir (en pseudocódigo … o Python, porque es muy fácil de escribir) código que asume que has terminado: “Veamos, si pudiera tratar esta colección de datos como una serie de tiempo, me gustaría ser capaz de decirle de qué tamaño son los contenedores … “En poco tiempo tendrás el comienzo de una lista de cosas que quieres poder preguntar. Lo siguiente es donde sucede la magia: solo comienzas a escribir las cosas de las que has estado dependiendo, así que comienzas a escribir

vacío setUnit (…

y piensas, “Hmm. Entonces, ¿qué es una unidad?” e inventas una enumeración o decides usar un int o lo que sea que funcione …

void setUnit (unsigned int aUnit)
{

y debe decidir dónde se almacena la unidad. ¿Será esto una clase? Una estructura? ¿Necesitamos que sea persistente y lo guarde en una base de datos o algo así?

El segundo principio principal es: todo devuelve un error. Por lo tanto, cada función que devuelve un estado booleano devuelve “falso”. Todo lo que devuelve un puntero devuelve NULL (o None o lo que tu plataforma quiera que uses para “nada que ver aquí, amigos”). Esto significará que, para algunas cosas, debe inventar un estado de error:

Unidad unidad ()
{
return InvalidUnit;
}

Después de una o dos iteraciones que van y vienen entre la función y el diseño, una pequeña decisión a la vez, terminas con un conjunto de funciones que, si se implementaran, harían más o menos lo que comenzaste a lograr. Una vez que tiene un conjunto relativamente completo de funcionalidades esbozadas en la API (el nivel de “diseño” anterior), escribe una prueba unitaria que lo llama todo. Obviamente, la prueba unitaria fallará espectacularmente, porque aún no ha hecho nada. Entonces, el siguiente paso es completar las implementaciones reales hasta que pasen las pruebas unitarias. Funciona algo como esto:

El primer boceto funcional le brinda suficiente para hacer un boceto de diseño. El diseño deja en claro que su idea de lo que se supone que debe hacer (función) necesita un ajuste, por lo que debe hacer el ajuste, luego reflejarlo en el diseño, y así sucesivamente. En cada paso, dejas que lo que acabas de hacer informe lo que haces a continuación.

Si ya ha escrito un código que descompone un problema en partes más pequeñas que están bien definidas y se implementan de manera consistente, entonces posiblemente esté en camino a su objetivo. La mecánica de convertir esas funciones en algún tipo de biblioteca dependerá del idioma, por supuesto.
Parece que me encuentro escribiendo un poco de código que analiza y / o analiza varios tipos de archivos de datos formateados. Como herramienta de capacitación, creo que esta podría ser una buena premisa para un proyecto. Como la mayoría de los formatos de archivo tienden a tener alguna estructura, sugiere una estructura natural a una biblioteca API para el desmontaje de los datos. Elija un formato de archivo que sea legible para los humanos, con suerte, pero no necesariamente, documentado y lo suficientemente abundante como para brindarle un fácil acceso a los datos de prueba. HTML podría ser una buena opción. Si usa Linux, hay una gran cantidad de archivos de configuración, archivos de registro, etc. Es muy probable que los analizadores y generadores de dichos archivos encuentren un uso práctico y, por lo tanto, generen comentarios útiles sobre la calidad de su biblioteca API.
Otro uso común de las bibliotecas API es proporcionar acceso de espacio de usuario a la funcionalidad de un controlador de kernel de Linux. Dado que el método de acceso a los controladores de dispositivos tiende a ser bastante espartano y genérico, es común proporcionar bibliotecas de contenedor que permiten a otros desarrolladores tener métodos más significativos para acceder al dispositivo o servicio proporcionado por el controlador. Como tal, la biblioteca API proporciona una vista más orientada a la aplicación del controlador, y posiblemente proporciona un enlace al controlador que es específico del idioma. En el caso de que el enlace de su idioma a algún dispositivo o servicio esté precedido por una implementación en otro idioma, es habitual modelar la estructura de la biblioteca después del diseño preexistente, particularmente si el diseño preexistente ha logrado algún tipo de estado como estándar. Una vez más, elegir un proyecto de este tipo como ejercicio de capacitación le proporciona cierta estructura a seguir a medida que aprende sobre el tema.

Lo siento, seré decepcionante.

Si no sabe cómo hacerlo, probablemente no lo necesite.
Además, si no lo necesita, no hay razón para trabajar en uno.

Ese es el principio de YAGNI.

En resumen, si de repente descubres que necesitas hacer una biblioteca con las pequeñas piezas que ya tienes aquí y allá, entonces comienza la diversión. Primero agrúpelos por funcionalidad. Luego encuentre si tiene alguna duplicación, si tiene algo en común que valga la pena extraer. Asegúrese de escribir un montón de pruebas unitarias, cubriendo todos los casos de esquina. Publíquelo en github e invite a otras personas a unirse al esfuerzo.

Depende de lo que quieras lograr con tu biblioteca …

Hay muchos buenos ejemplos en las respuestas dadas aquí …

la biblioteca se trata de escribir una capa de abstracción para otros desarrolladores (desarrollador de aplicaciones) y los patrones de diseño ayudan a lograr la capa de abstracción. De hecho, muchas bibliotecas de .net y Java implementan directamente algunos patrones de diseño …

Si desea escribir una biblioteca portátil (funciona en Linux, iOS y Windows), debe usar la tecnología adecuada para lograrlo.

En conclusión, escribir una biblioteca es crear una capa de abstracción para que otros desarrolladores trabajen.

Depende del lenguaje de programación. Cada idioma y plataforma tiene sus propios mecanismos.

Aquí hay un artículo simple para hacer uno en Java:
http://www.programcreek.com/2011…

Aquí hay un documento para aumentar las bibliotecas compartidas (so) en una plataforma Linux usando C / C ++:
http://tldp.org/HOWTO/Program-Li

Aquí hay un documento para la creación de bibliotecas de enlaces dinámicos (DLL) en una plataforma Windows en C ++:
https://msdn.microsoft.com/en-us

Una biblioteca no es más que un gran conjunto de utilidades que serán útiles en muchos programas de usuario, expuestos a través de una API. Encuentre subtareas que las personas a menudo necesitan realizar para las que aún no tienen bibliotecas, y escriba código para implementarlas.

Tenga en cuenta que a menudo escribir una biblioteca “buena” no es un trabajo de una sola persona.

primero descubra si ya hay una buena biblioteca que le sirva, si no es así y sabe cómo escribir código, puede comenzar fácilmente un proyecto en github y si su proyecto se vuelve lo suficientemente popular, la gente comenzará a ayudarlo y su código podría implementarse en un lanzamiento oficial de ese idioma que haya elegido.

Elija idioma> Elija IDE> Crear nuevo proyecto> Escribir código> Compilar> Comprobar el directorio de salidas para la biblioteca (.dll, .so, .jar, .aar … .etc)

More Interesting

¿Cuáles son los ejemplos de proyectos que pueden impresionar a los entrevistadores / reclutadores en Google para científicos de datos, ingenieros de software e ingenieros de inteligencia artificial?

Soy un ingeniero de software. ¿Qué computadora portátil debo elegir, una Dell XPS 15 (2015) o una MacBook Pro con pantalla Retina?

¿Cómo obtienen los ingenieros de software autodidactas su primer trabajo remoto?

¿Cuáles son los mejores equipos de ingenieros de software en Google?

¿Cómo es ser ingeniero de software de Google en prueba (SET)?

¿Siempre es difícil ser ingeniero de software honesto?

¿Merecen la pena las certificaciones para ingenieros de software?

¿Qué harán los ingenieros de software cuando todos puedan programar? ¿La ingeniería de software está destinada a morir?

¿Eran programadores o ingenieros de software de Zuckerberg, Page, Brin y Musk?

¿Qué puede proponer alguien sobre cómo construir un trabajo independiente o de negocio propio para un ingeniero de software?

¿Qué quiere decir la gente cuando dice que un lenguaje de computadora es difícil que otros?

¿Cómo ayudan las interfaces en Java a reducir los esfuerzos de codificación cuando tenemos que proporcionar su implementación en cada clase de implementación?

¿Cuáles son las habilidades no convencionales para el ingeniero de software?

Soy un ingeniero de software que trabaja en una empresa de software basada en servicios. ¿Qué debo hacer para ser reclutado por grandes gigantes tecnológicos como Microsoft, VMware y Flipkart?

¿Qué debe saber un ingeniero de software de CUDA sobre el hardware subyacente?