PUE: Desarrollo de Aplicaciones Android – Segunda lección

ATENCIÓN! SON APUNTES Y EN BORRADOR!!

Hoy me he dado cuenta de lo mucho, muchísimo que tengo que repasar de programación y de aprender sobre Java! Mucho que practicar!

LIBRO RECOMENDADO: “Aprenda Java como si estuviera en primero”

https://fiwiki.org/wiki/Archivo:Aprenda_Java_como_si_estuviera_en_primero.pdf

REPASO:

developer.android.com
Portal
Explosión hacia las Best Practices
“Patrón MVC”
Portal muy bien estructurado


Super interesante

intellij – Creó Kodlin – Entorno para la parte de Java

Android Virtual Device (AVD)

Importante el compromiso de la orquilla (versiones SDK desde x hasta Y)

NFC Near Field Communication -> Funcionalidad secundaria

Manifiesto: es la configuración

Otras tiendas de Apps: Amazon, Samsung

PERMISOS – Permisos de ejecución – Cuenta Google? Cámara? Conactos? etc…

Importancia del VALOR de la App para que triunfe. Si no hay valor = se convierte en aplicación zombie

POO Programacion Orientada a Objetos es 3D
Estamos iniciando programación en Java en 2D

hashtable=diccionario

notacion “pascal case”: marcaAnterior para métodos o variables?

clases siempre en Mayúsculas

else if

//TODO:
//trozos de comentario de cosas pendientes por hacer

i=i+1
i+=1
i++

if((a!=1) || (b>2))

| = “pipe”

try {
// Ejecuta código que es susceptible de poder tener algún problema

} catch(ArrayIndexOutOfBoundsException ex){
     Captura error
System.out.println(“Se ha excedido el límite del array”);
} finally {
// este codigo siempre se ejecuta
Aunque haya habido un problema o no, hacer ultimas operaciones: cerrar base de datos, cerrar conexiones, etc…
}

if AA && BB && CC… Si AA ya es False, no sigue evaluando la condición

if((finalistas[i] != null) && (i<finalistas.length) ) peta si i llega a 5, porque llega a evaluar finalistas[5], que no existe. Por eso lo arreglamos así:
if((i<finalistas.length) && (finalistas[i] != null))

Codigo tolerante a fallos.

Optimización de código.

if ternario, muy utilizado en java, que queda en una única línea (diferente al if clásico):

return (marca1 > marca2) ? ganador : finalista;
si la condición entre paréntesis es verdadera, devuelve ganador, si es falsa devuelve el valor de finalista

Trozear el código en funciones: parte de la optimización

Creacion de estructuras dinamicas de crecimiento dinamico

Array lists:
ArrayList<E>
E=concepto en JAva: los generics: no te determinan el tipo en concreto, array generico de cualquiero tipo de dato en JAva:

ArrayList<String> finalistas;


ambito o scope: donde es visible la variable
ambito total

private static ArrayList<String> finalistas;


finalistas = new ArrayList<String>(); -> instanciamos el objeto ArrayList

coleccion dinamica llamada “finalistas”:

finalistas.add(atletas[i]); -> crecimiento dinamico, el array solo ocupa lo que tenga que ocupar, depende del numero de lementos que contenga

refactorizacion: mejorando y optimizando el código

Con el CTRL, podemos ir al método, si tb le damos a click

Con el CTRL, podemos ir al método, si tb le damos a click

finalistas.get(i) -> Metodo get de los ArrayList

finalistas.size()

Unitest – JUnit – Unit Testing, cuando quieres probar un metodo o una clase ara probarlo a ver si peta o no: accion automatizada, para estresarlo y ponerlo a prueba

private static ArrayList<int> marcas; INCORRECTO! int es de tipo primitivo
private static ArrayList<Integer> marcas;  correcto: Integer es un objeto

Metodo llamado inscribirAtletas

var arts String… (Antiguamente String[]
var arts es una notación más moderna
var arts (paso de argumentos variables: pudes pasar 1 nombre de persona, 3, 5, 50 o lo que sean necesarios)

“condicion frontera” ¿que pasa si se inscriben 0 atletas? ¿qué le pasa a mi programa si no le paso ningún argumento?

marcas.add(marca)

marcas.size() -> si es de objetos
marcas.lenght()->si es un array de ints primitivos

Debug: método paso a paso

Breakpoint

Ejecutar programa en modo debug (se para en los breakpoints)



Step into.

refactorizar: no introducimos mejores, solo lo optimizamos

evolucionar, nuevas funcionalidades

test de regresion

if (deportistas!=null)
{
}
else
{
  throw new Exception(“Sin inscripciones”);
}



Pasemos a hablar de objetos.

Cuando yo me creo una casa, primero me creo un plano:

class Plano
{
    // atributo
float ancho;
float largo;
int numeroHabitaciones;
double superficie;

//comportamiento (metodos)
int obtenerNumeroHabitaciones()
{
   return numeroHabitaciones;
}

}


¿Cómo convierto ese plano en una casa? Instanciando:

Plano casa = new Plano();
Plana casa2 = new Plano();

class Atleta{
//atributos //principio de encapsulacion, nadie puede acceder a los atributos libremente
private String nombre;

//comportamiento
String getNombre(){
return nombre;
}
}

Código hasta ahora:


&lt;br/>&lt;br/>package es.pue.android;&lt;br/>&lt;br/>import java.util.ArrayList;&lt;br/>import java.util.Arrays;&lt;br/>import java.util.Random;&lt;br/>&lt;br/>public class Main {&lt;br/>&lt;br/> private static ArrayList&amp;lt;String> atletas;&lt;br/> private static ArrayList&amp;lt;String> finalistas;&lt;br/> private static ArrayList&amp;lt;Integer> marcas;&lt;br/>&lt;br/> public static void main(String[] args) {&lt;br/> //tenemos 5 atletas lanzadores de martillo...&lt;br/> //Solo puede ganar uno&lt;br/> //El tope de longitud en la final es de 200m&lt;br/> /*&lt;br/> Hay una fase eliminatoria donde quedarán los&lt;br/> que superen o igualen la marca de 120m&lt;br/> */&lt;br/>&lt;br/> //creacion de atletas&lt;br/> /*&lt;br/> String atleta1 = "Ricardo";&lt;br/> String atleta2 = "Pepe";&lt;br/> String atleta3 = "Marta";&lt;br/> String atleta4 = "Berta";&lt;br/> String atleta5 = "Alberto" ;&lt;br/> */&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/> //creacion de un array donde guardar las marcas de&lt;br/> // los 5 atletas&lt;br/> //int[] marcas = new int[5];&lt;br/> //int[] finalistas = new int[5];&lt;br/> //String[] finalistas = new String[5];&lt;br/>&lt;br/>&lt;br/>&lt;br/>&lt;br/> try{&lt;br/> init();&lt;br/> inscribirAtletas(null);&lt;br/> //lanzar martillo tantas veces como atletas haya&lt;br/> //entero [0 .. 200]&lt;br/> //declaracion variable&lt;br/> ejecutarEliminatoria();&lt;br/>&lt;br/> obtenerFinalistas();&lt;br/>&lt;br/> verFinalistas();&lt;br/>&lt;br/> //obtener finalistas (los que han syperado 120m)&lt;br/> //obtener ganador (de entre todos los finalistas)&lt;br/> String ganadorMartillo = ejecutarFinal();&lt;br/> System.out.println("Ganador: " + ganadorMartillo);&lt;br/> } catch (Exception ex){&lt;br/> System.out.println(ex.getMessage());&lt;br/> }&lt;br/> }&lt;br/>&lt;br/> private static void init(){&lt;br/>&lt;br/> /*&lt;br/> atletas[0] = "Ricardo";&lt;br/> atletas[1] = "Pepe";&lt;br/> atletas[2] = "Marta";&lt;br/> atletas[3] = "Berta";&lt;br/> atletas[4] = "Alberto";&lt;br/> */&lt;br/> atletas = new ArrayList&amp;lt;String>();&lt;br/> //crecimiento dinamico&lt;br/> finalistas = new ArrayList&amp;lt;String>();&lt;br/> marcas = new ArrayList&amp;lt;Integer>();&lt;br/>&lt;br/> }&lt;br/>&lt;br/> private static void obtenerFinalistas() {&lt;br/> //int j = 0;&lt;br/> for(int i=0;i &amp;lt; marcas.size();i++){&lt;br/> int marca = marcas.get(i);&lt;br/> if (marca >= 120){&lt;br/> //finalistas[j] = atletas[i];&lt;br/> //j = j + 1;&lt;br/> //coleccion dinamica&lt;br/> finalistas.add(atletas.get(i));&lt;br/> }&lt;br/> }&lt;br/> }&lt;br/>&lt;br/> private static void ejecutarEliminatoria() {&lt;br/> //estructura iterativa&lt;br/> for(int i=0;i &amp;lt; atletas.size();i++){&lt;br/> int marca = tirarMartillo();&lt;br/> //marcas[i] = marca;&lt;br/> marcas.add(marca);&lt;br/> }&lt;br/> }&lt;br/>&lt;br/> private static String deshacerEmpate(String ganador, String finalista){&lt;br/>&lt;br/> int marca1,marca2;&lt;br/> do {&lt;br/> marca1 = tirarMartillo();&lt;br/> marca2 = tirarMartillo();&lt;br/> }while (marca1 == marca2);&lt;br/>&lt;br/> //aseguramos que marca1 != marca2&lt;br/>&lt;br/>&lt;br/> /* forma clasica&lt;br/> if (marca1 > marca2){&lt;br/> return ganador;&lt;br/> }&lt;br/> else if (marca1 &amp;lt; marca2){&lt;br/> return finalista;&lt;br/> }&lt;br/> */&lt;br/>&lt;br/> //if ternario&lt;br/> return (marca1 > marca2) ? ganador : finalista;&lt;br/>&lt;br/>&lt;br/> }&lt;br/>&lt;br/> private static String ejecutarFinal(){&lt;br/> int i = 0;&lt;br/> String ganador = "";&lt;br/> int marcaAnterior = 0;&lt;br/>&lt;br/> try {&lt;br/> //ejecuta código susceptible de poder tener algun problema&lt;br/> while ((i &amp;lt; finalistas.size())&lt;br/> &amp;amp;&amp;amp; (finalistas.get(i) != null)) {&lt;br/> int marca = tirarMartillo();&lt;br/> if (marca > marcaAnterior) {&lt;br/> ganador = finalistas.get(i);&lt;br/> marcaAnterior = marca;&lt;br/> } else if (marca == marcaAnterior){ //empate&lt;br/> ganador = deshacerEmpate(ganador,finalistas.get(i));&lt;br/> }&lt;br/> i = i + 1;&lt;br/> //i += 1;&lt;br/> }&lt;br/>&lt;br/> } catch (ArrayIndexOutOfBoundsException ex) {&lt;br/> System.out.println("****Se ha excedido limite de array");&lt;br/> } catch (Exception ex){&lt;br/>&lt;br/> } finally {&lt;br/> System.out.println("Este codigo siempre se ejecuta");&lt;br/> }&lt;br/>&lt;br/> //tenemos ganador&lt;br/> return ganador;&lt;br/> }&lt;br/>&lt;br/> private static int tirarMartillo() {&lt;br/> int resultado = 0;&lt;br/> Random generador = new Random();&lt;br/> resultado = generador.nextInt(200);&lt;br/>&lt;br/> return resultado;&lt;br/> }&lt;br/>&lt;br/> private static void verFinalistas(){&lt;br/> for(int i=0; i &amp;lt; finalistas.size() ;i++){&lt;br/> System.out.println(finalistas.get(i));&lt;br/> }&lt;br/> }&lt;br/>&lt;br/> private static void inscribirAtletas(String... deportistas) throws Exception {&lt;br/> if (deportistas != null){&lt;br/> for(int i=0;i &amp;lt; deportistas.length;i++){&lt;br/> inscribirAtleta(deportistas[i]);&lt;br/> }&lt;br/> } else {&lt;br/> throw new Exception("Sin inscripciones");&lt;br/> }&lt;br/>&lt;br/> }&lt;br/> private static void inscribirAtleta(String atleta){&lt;br/> if (atleta != null){&lt;br/> atletas.add(atleta);&lt;br/> }&lt;br/> }&lt;br/>}&lt;br/>&lt;br/>

private static ArrayList<Atleta> atletas;

método constructor: es un metodo especial que se tiene que llamar como la clase, y no  devuelve nada. Se ejecuta cuando se crea la clase

Veamos:

class Atleta{
//atributos //principio de encapsulacion, nadie puede acceder a los atributos libremente
private String nombre;

//comportamiento
String getNombre(){
return nombre;
}

public Atleta(String nomAtleta){
nombre=nomAtleta;     //(se aconseja poner: this.nombre=nomAtleta)
}


}


Y luego: Atleta atle= new Atleta(“pepito”);

if (deportistas != null){ for(int i=0;i &lt; deportistas.length;i++){ inscribirAtleta(deportistas[i]); } } else { throw new Exception( "Sin inscripciones"); }

package es.pue.android; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; public class Main { private static ArrayList &lt;String> atletas; private static ArrayList &lt;String> finalistas; private static ArrayList &lt;Integer> marcas; public static void main(String[] args) { //tenemos 5 atletas lanzadores de martillo... //Solo puede ganar uno //El tope de longitud en la final es de 200m /* Hay una fase eliminatoria donde quedarán los que superen o igualen la marca de 120m */ //creacion de atletas /* String atleta1 = "Ricardo"; String atleta2 = "Pepe"; String atleta3 = "Marta"; String atleta4 = "Berta"; String atleta5 = "Alberto" ; */ //creacion de un array donde guardar las marcas de // los 5 atletas //int[] marcas = new int[5]; //int[] finalistas = new int[5]; //String[] finalistas = new String[5]; try{ init(); inscribirAtletas(null); //lanzar martillo tantas veces como atletas haya //entero [0 .. 200] //declaracion variable ejecutarEliminatoria(); obtenerFinalistas(); verFinalistas(); //obtener finalistas (los que han syperado 120m) //obtener ganador (de entre todos los finalistas) String ganadorMartillo = ejecutarFinal(); System.out.println("Ganador: " + ganadorMartillo); } catch (Exception ex){ System.out.println(ex.getMessage()); } } private static void init(){ /* atletas[0] = "Ricardo"; atletas[1] = "Pepe"; atletas[2] = "Marta"; atletas[3] = "Berta"; atletas[4] = "Alberto"; */ atletas = new ArrayList &lt;String>(); //crecimiento dinamico finalistas = new ArrayList &lt;String>(); marcas = new ArrayList &lt;Integer>(); } private static void obtenerFinalistas() { //int j = 0; for(int i=0;i &lt; marcas.size();i++){ int marca=m arcas.get(i); if (marca>= 120){ //finalistas[j] = atletas[i]; //j = j + 1; //coleccion dinamica finalistas.add(atletas.get(i)); } } } private static void ejecutarEliminatoria() { //estructura iterativa for(int i=0;i &lt; atletas.size();i++){ int marca=t irarMartillo(); //marcas[i]=m arca; marcas.add(marca); } } private static String deshacerEmpate(String ganador, String finalista){ int marca1,marca2; do { marca1=t irarMartillo(); marca2=t irarMartillo(); }while (marca1==m arca2); //aseguramos que marca1 !=m arca2 /* forma clasica if (marca1> marca2){ return ganador; } else if (marca1 &lt; marca2){ return finalista; } */ //if ternario return (marca1> marca2) ? ganador : finalista; } private static String ejecutarFinal(){ int i = 0; String ganador = ""; int marcaAnterior = 0; try { //ejecuta código susceptible de poder tener algun problema while ((i &lt; finalistas.size()) &amp;&amp; (finalistas.get(i) !=n ull)) { int marca=t irarMartillo(); if (marca> marcaAnterior) { ganador = finalistas.get(i); marcaAnterior = marca; } else if (marca == marcaAnterior){ //empate ganador = deshacerEmpate(ganador,finalistas.get(i)); } i = i + 1; //i += 1; } } catch (ArrayIndexOutOfBoundsException ex) { System.out.println("****Se ha excedido limite de array"); } catch (Exception ex){ } finally { System.out.println("Este codigo siempre se ejecuta"); } //tenemos ganador return ganador; } private static int tirarMartillo() { int resultado = 0; Random generador = new Random(); resultado = generador.nextInt(200); return resultado; } private static void verFinalistas(){ for(int i=0; i &lt; finalistas.size() ;i++){ System.out.println(finalistas.get(i)); } } private static void inscribirAtletas(String... deportistas) throws Exception { if (deportistas !=n ull){ for(int i=0;i &lt; deportistas.length;i++){ inscribirAtleta(deportistas[i]); } } else { throw new Exception( "Sin inscripciones"); } } private static void inscribirAtleta(String atleta){ if (atleta !=n ull){ atletas.add(atleta); } } }