Después de años rellenando formularios y esperando, por fin has conseguido tu licencia bancaria. Esto significa que ahora puedes abrir oficialmente tu propio banco, ¡hurra!
Tu primera prioridad es poner en marcha los sistemas informáticos. Después de un día de duro trabajo, ya puedes abrir y cerrar cuentas, además de gestionar ingresos y reintegros.
Como no tenías ganas de escribir tests, invitas a unos amigos para que te ayuden a probar el sistema. Sin embargo, a los cinco minutos, uno de tus amigos afirma que ha perdido dinero. Aunque confías en que tu código no tiene errores, empiezas a revisar los registros para investigar.
Ah, sí, justo como sospechabas, ¡tu amigo tiene la culpa! Compartió sus credenciales de prueba con otro amigo y, juntos, conspiraron para hacer ingresos y reintegros desde la misma cuenta en paralelo. ¿A quién se le ocurriría hacer algo así?
Mientras argumentas que es físicamente imposible que alguien acceda a su cuenta en paralelo, tu amigo te informa con suficiencia de que las normas bancarias exigen que lo soportes. Así que, sin soporte para la banca en paralelo, no hay señal de lanzamiento. Suspiras y te apuntas mentalmente que mañana te pondrás con ello. Esto retrasará tu fecha de lanzamiento al menos un día más, pero bueno...
Tu tarea consiste en implementar cuentas bancarias que admitan aperturas y cierres, retiradas e ingresos de dinero.
Como se puede acceder a las cuentas bancarias de muchas maneras distintas (internet, teléfonos móviles, cargos automáticos), tu software bancario debe permitir acceder a las cuentas de forma segura desde varios hilos o procesos en paralelo (la terminología depende de tu lenguaje de programación). Por ejemplo, puede haber muchos ingresos y retiradas ocurriendo en paralelo; debes asegurarte de que no haya condiciones de carrera entre el momento en que lees el saldo de la cuenta y aquel en que estableces el nuevo saldo.
Debe ser posible cerrar una cuenta; las operaciones sobre una cuenta cerrada deben fallar.
Las pruebas ejecutarán algunas operaciones de forma concurrente. Debes esforzarte por que las operaciones sobre la Account la dejen en un estado consistente. Por ejemplo: varias goroutines pueden estar depositando y retirando dinero al mismo tiempo, y dos retiradas que ocurran de forma concurrente no deberían poder dejar el saldo en negativo.
Cuando trabajes en local, para comprobar que tu código gestiona correctamente la concurrencia y no introduce carreras de datos, ejecuta las pruebas con el flag -race activado.
cd exercism/project/directory/go/bank-account
go test -race
Si eres nuevo en las operaciones concurrentes en Go, merece la pena echar un vistazo al paquete sync, en concreto a los mutex:
Regístrate en Exercism para aprender y dominar Go con 34 conceptos165 ejercicios y mentoría humana real, todo gratis.