-
-
Save flbulgarelli/78495edcad178aa8c08b8f7e08532c7d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Comenzaremos definiendo que un atuendo es una combinación de prendas que tiene sentido usar juntas. Algunos ejemplos de atuendos podrían ser: | |
tus anteojos de sol favoritos, una remera de mangas cortas azul, el pantalón que te regaló tu mamá y unas zapatillas converse. | |
un pañuelo verde, una remera de mangas largas rayada, un pantalón de jean y un par de botas de cuero. | |
una musculosa de mickey, una pollera amarilla y unas crocs. | |
Como primer paso para generar los atuendos, les usuaries de QuéMePongo identificaron el siguiente requerimiento como principal: | |
Como usuarie de QuéMePongo, quiero poder cargar prendas válidas para generar atuendos con ellas. | |
*/ | |
// 1. La prenda | |
// Como usuarie de QuéMePongo, quiero especificar qué tipo de prenda estoy cargando (zapatos, camisa de mangas cortas, pantalón, etc). | |
class Prenda { | |
TipoPrenda tipoPrenda | |
Color colorPrimario | |
Color colorSecundario | |
Prenda(TipoPrenda tipoPrenda, Color colorPrimario, Color colorSecundario) { | |
if (tipoPrenda == null) { | |
throw new IllegalArgumentException("el tipo de prenda es obligatorio") | |
} | |
if (colorPrimario == null) { | |
throw new IllegalArgumentException("el color primario es obligatorio") | |
} | |
this.tipoPrenda = tipoPrenda | |
this.colorPrimario = colorPrimario | |
this.colorSecundario = colorSecundario | |
} | |
} | |
enum TipoPrenda { | |
REMERA, | |
BUZO, | |
PANTALON | |
} | |
// ?? | |
remeraAzul = new Prenda(TipoPrenda.REMERA) | |
buzoAzul = new Prenda(TipoPrenda.BUZO); | |
// 2. Color | |
// Como usuarie de QuéMePongo, quiero poder indicar un color principal para mis prendas | |
// Como usuarie de QuéMePongo, quiero poder indicar, si existe, un color secundario para mis prendas. | |
enum Color { | |
AMARILLO, | |
AZUL, | |
BLANCO, | |
MARRON, | |
NARANJA, | |
NEGRO, | |
ROJO, | |
ROSA | |
} | |
// azul = "azul" | |
// otroAzul = "AZUL" | |
// azul == otroAzul ??? | |
// no, es problematico | |
// podría ser, capaz en el futuro | |
// azul = new Color(0, 0, 255) // más flexible | |
azul = Color.AZUL // más simple | |
// opción 1 | |
remeraAzul = new Prenda(TipoPrenda.REMERA, Color.AZUL) | |
remeraAmarillaRayada = new Prenda(TipoPrenda.REMERA, Color.AMARILLO, Color.BLANCO) | |
// opción 2 | |
remeraAzul = new Prenda(TipoPrenda.REMERA, [Color.AZUL]) | |
remeraAmarillaRayada = new Prenda(TipoPrenda.REMERA, [Color.AMARILLO, Color.BLANCO]) | |
// opción 3 | |
// permitiríamos tener objetos con estados inconsistentes | |
// y no necesitamos mutar al color secundario | |
// Idem con setter | |
// opción 4? | |
// Herencia? YAGNI. No hay estado diferenciado | |
// opción 5: idem 1, pero con un sólo constructor | |
remeraAzul = new Prenda(TipoPrenda.REMERA, Color.AZUL, null) | |
remeraAmarillaRayada = new Prenda(TipoPrenda.REMERA, Color.AMARILLO, Color.BLANCO) | |
// opción 6 | |
remeraAzul = new Prenda(TipoPrenda.REMERA, Color.AZUL, Color.AZUL) | |
remeraAmarillaRayada = new Prenda(TipoPrenda.REMERA, Color.AMARILLO, Color.BLANCO) | |
// opcion 7 | |
remeraAzul = new Prenda(TipoPrenda.REMERA, Color.AZUL, Optional.none()) | |
remeraAmarillaRayada = new Prenda(TipoPrenda.REMERA, Color.AMARILLO, Optional.some(Color.BLANCO)); | |
// 3. Categorias | |
// Como usuarie de QuéMePongo, quiero identificar a qué categoría pertenece una prenda (parte superior, calzado, parte inferior, accesorios). | |
// Como usuarie de QuéMePongo, quiero poder indicar de qué tela o material está hecha una prenda | |
enum Categorias { | |
SUPERIOR, | |
CALZADO, | |
PARTE_INFERIOR, | |
ACCESORIOS | |
} | |
enum Material { | |
ALGODON, | |
POLIESTER, | |
} | |
remeraAzul = new Prenda(TipoPrenda.REMERA, Color.AZUL, null, Material.ALGODON); | |
// opcion 1 | |
// que la categoria sea parte del tipo? | |
class TipoPrenda { | |
Categoria categoria; | |
.... | |
} | |
tipoRemera = new TipoPrenda(Categoria.SUPERIOR) | |
tipoBuzo = new TipoPrenda(Categoria.SUPERIOR) | |
tipoBoina = new TipoPrenda(Categoria.ACCESORIOS) | |
remeraAzul = new Prenda(tipoRemera, Color.AZUL, null, Material.FRUTA) | |
remeraAmarillaRayada = new Prenda(tipoRemera, Color.AMARILLO, Color.BLANCO, Material.ALGODON); | |
Material unMaterial = Material.ALGODON // funciona | |
Material unMaterial = null // funciona | |
Material unMaterial = "ALGODON" // NO funciona; no tipa | |
// opcion 2? | |
// es problemático porque es más facil llegar a un estado inconsistente; es menos robusto | |
remeraAzul = new Prenda(TipoPrenda.REMERA, Categoria.SUPERIOR, Color.AZUL, null, Material.ALGODON) | |
// 4. Validaciones | |
// Como usuarie de QuéMePongo, quiero evitar que haya prendas sin tipo, tela, categoría o color primario. | |
// se trata de agregar más validaciones de nulos como venimos trabajando | |
// Como usuarie de QuéMePongo, quiero evitar que haya prendas cuya categoría no se condiga con su tipo. (Ej, una remera no puede ser calzado). | |
// el diseño del punto anterior ya garantiza la consistencia entre prenda y categoria |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment