Principios de Diseño de Bibliotecas en Go: De Repositorios a Recursos
La programación implica crear aplicaciones y las bibliotecas que las soportan. Una biblioteca es una colección de recursos compartibles, principalmente código fuente. Distinguir entre términos ayuda a diseñar componentes robustos.
Un repositorio contiene archivos de código dentro de una estructura de sistema de archivos. Un paquete en Go es un grupo de archivos .go que realizan una sola tarea, con una declaración obligatoria package al inicio de cada archivo. Un módulo agrupa paquetes, con dependencias fijadas en go.mod.
Una biblioteca permite compartir código sin duplicación. Por ejemplo: una función MaxInt copiada en diferentes paquetes foo y baz es ineficiente sin una única fuente de verdad. Los paquetes resuelven el problema de compilación e importación.
package foo
func MaxInt(a, b int) int {
if a > b {
return a
}
return b
}
El aislamiento de componentes evita el conocimiento de otro código, y la descomposición simplifica la interacción con el compilador.
Recursos en Bibliotecas
Las bibliotecas incluyen no solo código sino también recursos externos: dinámicos y estáticos.
Recursos dinámicos dependen del tiempo de ejecución. Un ejemplo es el acceso a GPU mediante CUDA en el paquete cu de Gorgonia:
d := cu.CurrentDevice()
ctx := cu.NewContext(d, cu.SchedAuto|cu.MapHost)
mem, err := ctx.MemAlloc(1024)
Aquí, ctx es un descriptor de GPU para tareas GPGPU. Su estado es desconocido en tiempo de compilación.
Recursos estáticos son conocidos por el compilador. Un ejemplo son los textos de Shakespeare en el paquete willshakes:
package willshakes
const AllsWellThatEndsWell = `Acto 1 Escena 1
CONDESA.
Al entregar a mi hijo de mí, entierro a un segundo esposo.
...`
const MacBeth = `Acto 1 Escena 1
PRIMERA BRUJA.
¿Cuándo nos volveremos a encontrar las tres
...`
Acceso mediante: willshakes.MacBeth. Similar para fuentes o conjuntos de datos como MNIST.
Clasificación de Bibliotecas
Las bibliotecas se clasifican por sus recursos:
- Bibliotecas de código: Código fuente compartido en paquetes/módulos.
- Bibliotecas de controladores: Envolturas sobre controladores (cu para CUDA, go-gl para OpenGL).
- Bibliotecas de recursos: Datos estáticos (willshakes) o cargadores (mnist en Go).
| Tipo | Ejemplo | Característica |
|------|---------|----------------|
| Código | Paquete de utilidad | Código estático |
| Controlador | cu | Acceso dinámico |
| Recurso | willshakes | Constantes embebidas |
Los controladores añaden abstracciones para interacción entre lenguajes.
Cualidades de una Buena Biblioteca
Una buena biblioteca facilita dos diálogos: con la máquina (compilador/tiempo de ejecución) y con el desarrollador.
Criterios:
- Aislamiento: Los componentes desconocen bibliotecas externas.
- Descomposición: Límites funcionales claros.
- Composición: Integración fácil en aplicaciones.
- Previsibilidad: El comportamiento coincide con la documentación.
- Rendimiento: Sobrecarga mínima sin compromisos.
Evita package main en bibliotecas—enfócate en utilidades. Prueba casos límite, asegura seguridad de hilos.
Conclusiones Clave
- Una biblioteca es un recurso compartible, no solo un repositorio o paquete.
- Separa recursos estáticos (constantes) y dinámicos (controladores).
- Asegura aislamiento para que los desarrolladores se enfoquen en una sola tarea.
- Usa paquetes Go para compilación y módulos para dependencias.
- Diseña para composición: fácil importación y uso.
— Editorial Team
Aún no hay comentarios.