Code Monkey home page Code Monkey logo

arnold-enum-type's Introduction

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.

arnold-enum-type's People

Contributors

dfleta avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.