Introducción
Desarrollar un Simulador de Estacionamiento fue una experiencia educativa que nos permitió explorar y aplicar conceptos fundamentales de programación concurrente utilizando el lenguaje Go, así como diseñar una interfaz gráfica intuitiva con la biblioteca Fyne. Este proyecto, creado como parte de una actividad escolar, no solo reforzó nuestros conocimientos técnicos, sino que también nos enseñó la importancia de una buena planificación y la colaboración efectiva en el desarrollo de software.
En este reporte, compartiremos los principales aprendizajes obtenidos durante la elaboración del simulador y ofreceremos consejos prácticos para aquellos interesados en utilizar Fyne para sus propios proyectos.
Aprendizajes Clave
1.- Programación Concurrente con Go
Uno de los aspectos más destacados del proyecto fue la utilización de la concurrencia en Go. La capacidad de manejar múltiples procesos simultáneamente es esencial para simular la llegada y salida de vehículos en tiempo real. Aprendimos a:
- Goroutines: Permiten ejecutar funciones de manera concurrente. Por ejemplo, cada vehículo que intenta entrar al estacionamiento se maneja en una goroutine separada, simulando múltiples vehículos actuando al mismo tiempo.
go p.TryToEnter(vehicle)
- Canales: Facilitan la comunicación entre goroutines, permitiendo enviar y recibir mensajes de manera segura.
p.gate = make(chan struct{}, 1)
- Mutexes: Garantizan que solo una goroutine acceda a ciertos recursos compartidos a la vez, evitando condiciones de carrera.
var mutex sync.Mutex
mutex.Lock()
// acceso a recurso compartido
mutex.Unlock()
2.- Diseño de Interfaces Gráficas con Fyne
La biblioteca Fyne fue elegida para desarrollar la interfaz gráfica del simulador debido a su facilidad de uso y capacidad para crear aplicaciones visualmente atractivas. Aprendimos a:
- Crear Ventanas y Contenedores:
myApp := app.New()
window := myApp.NewWindow("Parking Lot Simulator")
window.Resize(fyne.NewSize(1200, 700))
window.SetFixedSize(true)
- Dibujar Elementos Gráficos:
spot := canvas.NewRectangle(color.RGBA{R: 200, G: 200, B: 200, A: 255})
spot.Resize(fyne.NewSize(120, 80))
spot.Move(fyne.NewPos(x, y))
- Manejar Imágenes y Animaciones:
car := canvas.NewImageFromResource(v.carEntering)
car.Resize(fyne.NewSize(120, 80))
car.Move(fyne.NewPos(gateX, gateY))
3.- Patrones de Diseño
Implementamos el Patrón Observer para mantener la comunicación entre el modelo de simulación y la interfaz gráfica, asegurando que cualquier cambio en el estado del estacionamiento se refleje automáticamente en la interfaz de usuario.
type Observer interface {
Update(pos Position)
}
func (v *ParkingLotView) Update(pos models.Position) {
// Manejo de actualizaciones
}
Consejos para Utilizar Fyne
Para aquellos que deseen comenzar a desarrollar aplicaciones con Fyne, aquí algunos consejos prácticos:
1.- Instalación de Fyne
Antes de comenzar, asegúrate de tener Go instalado en tu sistema. Luego, instala Fyne ejecutando:
go get fyne.io/fyne/v2
2.- Crear una Aplicación Básica
Aquí un ejemplo sencillo para iniciar una aplicación con Fyne:
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("Hola Fyne")
hello := widget.NewLabel("¡Hola, Mundo!")
myWindow.SetContent(container.NewVBox(
hello,
))
myWindow.ShowAndRun()
}
3.- Trabajar con Contenedores
Fyne utiliza contenedores para organizar los elementos de la interfaz. Algunos tipos comunes son:
- VBox: Organiza los elementos verticalmente.
container.NewVBox(element1, element2)
- HBox: Organiza los elementos horizontalmente.
container.NewHBox(element1, element2)
- Grid: Organiza los elementos en una cuadrícula.
container.NewGridWithColumns(2, element1, element2)
4.- Manejar Eventos
Puedes añadir funcionalidad interactiva a tu aplicación manejando eventos como clics de botones:
button := widget.NewButton("Haz Clic", func() {
// Acción a realizar cuando se hace clic
})
5.- Utilizar Recursos de Imágenes
Fyne permite cargar imágenes desde archivos locales para mejorar la interfaz gráfica:
carImage := canvas.NewImageFromFile("assets/car.png")
carImage.Resize(fyne.NewSize(100, 100))
6.- Actualizar la Interfaz de Usuario
Para reflejar cambios en la interfaz, utiliza el método Refresh:
carImage.Refresh()
7.- Animaciones Básicas
Aunque Fyne no tiene soporte nativo para animaciones complejas, puedes crear animaciones simples moviendo elementos en pasos incrementales:
go func() {
for i := 0; i < 100; i++ {
time.Sleep(time.Millisecond * 16) // Aproximadamente 60 FPS
carImage.Move(fyne.NewPos(carImage.Position().X+1, carImage.Position().Y))
carImage.Refresh()
}
}()
Reflexiones Finales
El desarrollo del Simulador de Estacionamiento ha sido una experiencia enriquecedora que me permitió combinar conocimientos teóricos con la práctica de programación concurrente y diseño de interfaces gráficas. La elección de Go y Fyne demostró ser acertada, ya que ambas herramientas ofrecen potencia y flexibilidad para crear aplicaciones eficientes y visualmente atractivas.
Este proyecto no solo reforzó mi comprensión de conceptos clave como la concurrencia y los patrones de diseño, sino que también destacó la importancia de una buena planificación y la gestión efectiva de proyectos.
Para quienes deseen embarcarse en proyectos similares, recomiendo explorar la documentación de Fyne, experimentar con ejemplos básicos y poco a poco incorporar funcionalidades más complejas. La comunidad de Fyne es activa y ofrece numerosos recursos que pueden ser de gran ayuda.
En conclusión, el Simulador de Estacionamiento no solo cumplió con los objetivos académicos planteados, sino que también sirvió como una plataforma para desarrollar habilidades valiosas en programación y diseño de software, preparando el terreno para futuros desafíos en el mundo del desarrollo de aplicaciones.
¡Gracias por leer! Esperamos que este reporte sea útil para comprender mejor el proceso de desarrollo del simulador y para inspirar tus propios proyectos con Go y Fyne.
Referencias
Documentación de Go
Biblioteca Fyne
Patrones de Diseño de Software
Uso
Para ejecutar el simulador en tu máquina, sigue estos pasos:
1.- Clona el repositorio:
git clone https://github.com/Dariohg/parking_simulator.git
cd parking-simulator
2.- Instala las dependencias de Fyne:
go get fyne.io/fyne/v2
3.- Ejecuta el simulador:
go run main.go
¡Disfruta simulando el funcionamiento de un estacionamiento!
Disclaimer
Este proyecto fue desarrollado con fines educativos y no está destinado para uso comercial o público.
Top comments (0)