---
title: Bank Kata
description: Mejora tus coding skills y tu capacidad para resolver problemas de codificación con las katas compartidas por los craftspeople de Codurance.
---

[Katas ](https://www.codurance.com/es/katas)

# [Bank Kata](https://www.codurance.com/es/katas/bank-kata)

 Escrito por [Sandro Mancuso](https://www.codurance.com/es/katas/author/sandro-mancuso) | 14-mar-2023 11:56:03

## Resumen

Cuando diseñamos un sistema grande, nos gusta basar nuestro diseño en la forma en la que será utilizado. De ese modo, las historias de usuario y los criterios de aceptación se convierten en mucho más que una meta final: son un principio rector para todo el sistema.

Esto resuelve varios problemas. Por ejemplo, elimina el exceso de ingeniería (ya que sólo escribimos lo que sabemos que el usuario necesita). Además, empezar por la interfaz pública reduce la aparición de riesgos al final del proyecto (nadie quiere una pesadilla de integración cuando se acerca la fecha de entrega).

Esta kata tiene como objetivo convertir esa experiencia a un problema que puede ser resuelto en un par de horas, con un programa primitivo sobre una cuenta bancaria. En este caso, nuestra interfaz de usuario consiste en sólo algunos métodos públicos - supongamos que estamos escribiendo una librería, pero los mismos principios se mantienen.

Es una forma fantástica de practicar el uso de pruebas de aceptación para guiar el diseño. Si se hace correctamente, como resultado se obtiene un sistema que evoluciona por sí mismo sin esfuerzos innecesarios y sin sorpresas desagradables al final. Verás cómo el método de trabajo *outside-in* puede ser una forma poderosa de crear software orientado a objetos.

Puedes intentar esto usando Mockist o Classicist TDD, pero el enfoque de Mockist es más adecuado. Considera utilizar el [screencast](https://codurance.com/videos/2015-05-12-outside-in-tdd-part-1/) de [Sandro Mancuso](https://codurance.com/publications/author/sandro-mancuso) como referencia. 

## Instrucciones

Escribe una clase llamada *Account* que implemente la siguiente interfaz pública:

```
public interface AccountService{    void deposit(int amount)     void withdraw(int amount)     void printStatement()}
```

### Reglas

- No puedes cambiar la interfaz pública de esta clase.

### Comportamiento deseado

Esta es la especificación para una prueba de aceptación que expresa el comportamiento deseado:

Si un cliente hace un depósito de 1000 el 10-01-2012  
Y un depósito de 2000 el 13-01-2012  
Y retira 500 el 14-01-2012  
Al imprimir su extracto bancario vería lo siguiente:

```
Date       || Amount || Balance14/01/2012 || -500   || 250013/01/2012 || 2000   || 300010/01/2012 || 1000   || 1000
```

### Observaciones

- Estamos utilizando `int`s para las cantidades de dinero y para mantener los auxiliares lo más simple posible. En un sistema real, utilizaríamos un tipo de dato con precisión arbitraria garantizada, pero en este caso nos distraería del objetivo principal del ejercicio.
- No te preocupes por el espaciado y la sangría en el output statement. (Si quieres, puedes indicarle a tu prueba de aceptación que ignore los espacios en blanco).
- Utiliza la prueba de aceptación para guiar tu progreso hacia la solución. Sandro aplica esto al hacer que todos los métodos no implementados lancen una excepción. De este modo, puede ver inmediatamente lo que queda por implementar cuando ejecuta la prueba de aceptación.
- Siempre que tengas una duda, ¡opta por la solución más sencilla!

## Enlaces de interés

### Artículos en Inglés

- [Bank kata in Haskell - dealing with state](https://codurance.com/2019/02/11/bank-kata-in-haskell-state/)
- [Bank kata in Haskell - printing a statement](https://codurance.com/2019/02/21/bank-kata-in-haskell-printing/)
- [Bank kata in Haskell - using and testing date](https://codurance.com/2019/03/12/bank-kata-in-haskell-date/)
- [A case for outside-in development](https://codurance.com/2017/10/23/outside-in-design/)

### Soluciones

- En [C#](https://github.com/Gryff/bank-kata) por [Liam Griffin-Jowett](https://codurance.com/publications/author/liam-griffin/)
- En [Java](https://github.com/sandromancuso/bank-kata-outsidein-screencast) por [Sandro Mancuso](https://codurance.com/publications/author/sandro-mancuso)
- En [Java](https://github.com/richardjwild/bank-kata) por [Richard Wild](https://www.codurance.com/publications/author/richard-wild)
  
  ## Vídeos
  
  A continuación Irene Piccoli y Pablo Martínez resuelven esta kata con Python. Te animamos a que practiques en compañía de nuestros craftspeople.  

 

[Ver post completo](https://www.codurance.com/es/katas/bank-kata)

```json
{
  "@context" : "http://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Sandro Mancuso"
  },
  "dateModified" : "2024-04-02T11:21:13.262Z",
  "datePublished" : "2023-03-14T11:56:03Z",
  "headline" : "Bank Kata",
  "image" : {
    "@type" : "ImageObject",
    "height" : 630,
    "url" : "https://3042464.fs1.hubspotusercontent-na1.net/hubfs/3042464/Katalyst/Thumbnails/Katalyst_Thumbnail-Bank.jpg",
    "width" : 1200
  },
  "mainEntityOfPage" : "https://www.codurance.com/es/katas/bank-kata",
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "height" : 60,
      "url" : "/hs/hsstatic/content_shared_assets/static-1.4092/img/default-amp-logo.png",
      "width" : 60
    },
    "name" : "Katas"
  }
}
```