Skip to content

dfleta/arnold-enum-type

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Enum Types: Arnold se está cociendo

Esta semana vamos a introducir un nuevo concepto de programación, los tipos enumerados. Son muy sencillos y no necesitan mucha explicación. Eso sí, son un ejemplo fantástico del patrón singleton, y resuelven muchos problemas en la vida real TM.

Recomiendo leer el capítulo 18 "Enum Types" del Libro Beginning Java 8 Fundamentals. Se explican a través de un par de ejercicios que recomiendo ir codificando en vuestro editor favorito IntelIJ throws FileNotSupportedException

Además, vamos a prácticar TDD:

  • He incluido los casos test que ha de pasar vuestro código.
  • He incluido el programa principal.

De esta manera, nos aseguramos que aprendéis todo lo que es necesario saber sobre tipos enumerados, y aprendéis las fluent assertions, que harán vuestros casos test más optimos.

Ejercicio

Se trata de calcular el peso de una persona en los distintos planetas de nuestro Sistema Solar1, al estilo de este sitio web:

http://www.traducimos.cl/planet/

Es importante evitar que os suceda lo de Arnold en Desafio Total2 cuando salió a dar un paseíto por la superficie marciana, estando de cuarentena como estábamos en marzo de 2019:

vídeo Arnold al punto de cocción

El peso en otro planeta se lo preguntáis a vuestros compañeros que han estudiado Física en la universidad o bachiller (call @Arturo @JoanNicolau y cia). Si no se lo saben de memoria, aplicad este sencilla fórmula:

$$ Peso \ en \ Superficie = tu \ Masa \times Gravedad \ en \ superficie $$

donde:

$$ Gravedad \ en \ superficie = G \times \frac {Masa \ del \ planeta} {Radio \ del \ planeta \ al \ cuadrado} $$

donde:

$$ G = 6.67300 \ · e^{-11} \frac {m^3}{kg \ ·s }$$

y

$$ tu \ masa = \frac{tu \ peso \ en \ la \ Tierra} {gravedad \ superficial \ Tierra} $$

Los valores de masa y radio de cada planeta (en $Kg$ y $m$ respectivamente) son:

MERCURY (3.303e+23, 2.4397e6),     
VENUS   (4.869e+24, 6.0518e6),     
EARTH   (5.976e+24, 6.37814e6),     
MARS    (6.421e+23, 3.3972e6),     
JUPITER (1.9e+27,   7.1492e7),     
SATURN  (5.688e+26, 6.0268e7),     
URANUS  (8.686e+25, 2.5559e7),     
NEPTUNE (1.024e+26, 2.4746e7);      

Si completas la función main para recoger argumentos desde línea de comandos, la salida del programa en consola podría ser esta, donde 175 es tu peso en la Tierra:

$$ tu \ masa = \frac{tu \ peso \ en \ la \ Tierra}{gravedad \ superficial \ tierra} $$

$ java Planet 175 
Your weight on MERCURY is 66.107583 
Your weight on VENUS is 158.374842 
Your weight on EARTH is 175.000000 
Your weight on MARS is 66.279007 
Your weight on JUPITER is 442.847567 
Your weight on SATURN is 186.552719 
Your weight on URANUS is 158.397260 
Your weight on NEPTUNE is 199.207413

Casos test - AssertJ Fluent Assertions

Estos son los casos test que ha de satisfacer tu código: /src/test/java/org/foobarspam/arnoldEnumType/test/ArnoldEnumTypeTest.java

Utilízalos para practicar TDD y que te guíen en el diseño del código.

Para utilizar estos casos test, has de incluir en el POM.xml del proyecto Maven o en el fichero build.gradle una dependencia adecuada a la librería de AssertJ. Búscala en el repo de Maven:

	<dependency>
    	<groupId>org.assertj</groupId>
    	<artifactId>assertj-core</artifactId>
    	<version>[3.22.0,)</version>
    	<scope>test</scope>
	</dependency>

¿Cómo funcionan las Fluent Assertions?:

AssertJ - fluent assertions java library

API Enum Type

Estas son las funciones de la API de los tipos enumerados. Asegúrate de que entiendes su comportamiento y el tipo de dato que devuelven.

	@Test
	public void PlanetaConstructorTest() {
		// me aseguro de que los metodos de la api
		// de los Enum Types se comportan como espero
		Planeta planeta = Planeta.MERCURY;
		assertThat(planeta).isInstanceOf(Planeta.class);
		assertThat(planeta.ordinal()).isZero();
		assertThat(planeta.name()).isEqualToIgnoringCase("MERCURY");
		assertThat(Planeta.valueOf(planeta.name())).isEqualTo(Planeta.MERCURY);
		assertThat(planeta.compareTo(Planeta.MERCURY)).isZero();
		assertThat(planeta.toString()).isEqualToIgnoringCase("MERCURY");
		assertThat(planeta.equals(Planeta.MERCURY)).isTrue();
		assertThat(Planeta.values()[0]).isEqualTo(planeta);
	}

Script principal - main

Programa la lógica para que, además de los casos test, satisfaga el script principal del programa: ArnoldMain.java

Solución

Resuelto por mi: Planeta.java

Resuelto por Oracle: Enum Types, the Java Tutorials


Pluto is not a planet! You can't kill the truth, father!


Footnotes

  1. ¿Y Plutón? ¿Dónde está Plutón?

  2. Existe una versión mucho más divertida, ingeniosa y edificante de la infame película Desafío Total en el capítulo 4 de la temporada 2 de Rick and Morty, titulado "Total Rickall". Eso sí, tiros y vísceras hay a partes iguales.

Releases

No releases published

Packages

No packages published

Languages