Mostrando entradas con la etiqueta Java. Mostrar todas las entradas

[Java] Buenas prácticas en programación


1.- Evitar la creación innecesaria de objetos, Lazy Initialitation

La creación de objetos en Java es una de las operaciones mas costosas en términos de uso de memoria e impacto en el performance.  Esto es evitable creando o inicializando objetos solo en el momento en que serán requeridos en el código.

Código: Java
  1. public class Paises {
  2.  
  3.     private List paises;
  4.  
  5.     public List getPaises() {
  6.         //se inicializa solo cuando es requerido
  7.         if(null == paises) {
  8.             paises = new ArrayList();
  9.         }
  10.         return paises;
  11.     }
  12. }


2.- Nunca hacer variables de instancia públicas

Hacer una clase publica se puede ocasionar problemas en un programa.  Por ejemplo si tienes una clase MiCalendario. Esta clase contiene un arreglo de cadenas diasDeLaSemana.  Pero es una arreglo público y este puede ser accedido por cualquiera.  Tu asumes que este arreglo contiene siempre los 7 nombres de los días de la semana.  Alguien por error puede cambiar el valor e insertar un error!

Código: Java
  1. public class MiCalendario {
  2.    
  3.     public String[] diasDeLaSemana =
  4.         {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"};
  5.    
  6.     //mas código
  7.    
  8. }


La mejor práctica es como mucho de ustedes saben, es siempre definir estas variables como privadas y crear los métodos accesores, “setters“ y “getters”

Código: Java
  1. private String[] diasDeLaSemana =
  2.     {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Sabado", "Domingo"};
  3.  
  4. public String[] getDiasDeLaSemana() {
  5.     return diasDeLaSemana;
  6. }


Pero escribir los métodos accesores no resuelve el problema del todo.  El arreglo sigue siendo accesible.  La mejor forma de hacerlo inmodificable es devolviendo un arreglo clonado en lugar del arreglo mismo.  Esto se logra modificando el método get de la siguiente forma.

Código: Java
  1. public String[] getDiasDeLaSemana() {
  2.     return diasDeLaSemana.clone();
  3. }


3.- Tratar siempre de minimizar la Mutabilidad de las clases

Hacer una clase inmutable es hacerla inmodificable.   La información de la clase se preservara durante el tiempo de vida de la clase.  Las clases inmutables son simples y fáciles de manejar.  Son “thread safe”.  Normalmente son los bloques para formar otros objetos mas grandes.

No obstante, crear objetos inmutables pueden golpear significativamente el rendimiento de una aplicación.  Así que elije cuidadosamente si quieres que una clase sea o no inmutable.  Trata siempre de tener clases pequeñas con el menor número de clases inmutables.

Para hacer una clase inmutable puedes definir sus constructor de forma privada y luego crear un método estático para inicializar al objeto y devolverlo.

Código: Java
  1. public class Empleado {
  2.  
  3.     private String primerNombre;
  4.     private String segundoNombre;
  5.    
  6.     // constructor private default
  7.     private Empleado (String primerNombre, String segundoNombre) {
  8.         this. primerNombre = primerNombre;
  9.         this. segundoNombre = segundoNombre;
  10.     }
  11.    
  12.     public static Empleado valueOf (String primerNombre, String segundoNombre) {
  13.         return new Empleado (primerNombre, segundoNombre);
  14.     }
  15. }


4.- Trata de usar mas las Interfaces sobre las Clases Abstractas

No es posible la herencia múltiple en Java, pero definitivamente puedes implementar múltiples interfaces.  Esto hace que cambiar la implementación de una clase existente sea fácil y que puedas implementar una o mas interfaces en lugar de cambiar la jerarquía completa de clases.

Pero si tu estás cien por ciento seguro de que métodos de una interface tendrás, entonces solo implementa esa interfaz.   Es bastante difícil agregar un nuevo método en una interfaz existente sin alterar todo el código que se está implementando.  Por el contrario un nuevo método puede ser fácilmente agregado en una clase abstracta sin alterar la funcionalidad existente.

5.- Limita siempre el alcance de una variable local

Las variables locales son grandiosas.  Pero algunas veces pueden insertar mas bugs durante el copiado y pegado de código viejo. Minimizar el alcance de una variable local hace que el código sea mas legible, menos propenso a errores  y mas mantenible.

Por lo tanto, debemos declarar variables justo antes de ser usadas.

Procura inicializar una variable desde su declaración.  Si eso no es posible asígnale el valor nulo.

6- Trata de usar librerías estándar en lugar de hacer las tuyas desde cero.

Escribir código es divertido.  Pero no reinventes la rueda.  Es bastante recomendable usar librerías estándar que ya han sido probadas, debugeadas y usadas por otros.    Esto no solo mejora la eficiencia de un programador sino que redice las posibilidades de tener errores en el código.  Además, usar una librería estándar  hace al código mas legible y mantenible.

Por ejemplo Google tiene liberada la nueva librería Google Collections que puede ser usada para agregar mas funcionalidad a tu código.

7.- Siempre que sea posible trata de usar tipos primitivos en lugar de las clases Wrapper

Las clases Wrapper son buenas, pero también son lentas.  Los tipos primitivos son como clases, sin embargo las clases wrapper almacenan la información completa acerca de una clase.

Algunas veces un programador puede agregar un error en el código usando una wrapper por un descuido.  Por ejemplo:

Código: Java
  1. int x = 10;
  2. int y = 10;
  3.  
  4. Integer x1 = new Integer(10);
  5. Integer y1 = new Integer(10);
  6.  
  7. System.out.println(x == y);
  8. System.out.println(x1 == y1);


El primer System.out.println imprimirá true mientras que el segundo imprimirá false.  El problema cuando comparas dos clases wrapper es que no se puede usar el operador ==, por que en realidad se están comparando referencias y no sus valores actuales.

Además si estás usando una clase wrapper no debes olvidar inicializarla.  Porque el valor por default de las variables wrapper es null.

Código: Java
  1. Boolean bandera = null;
  2.      
  3.         //mas código
  4.  
  5. if(flag == true) {
  6.     System.out.println("Se establece el valor de bandera ");
  7. } else {
  8.     System.out.println("No se establece el valor de bandera");
  9. }


El código lanzará un NullPointerException cuando se trate de comparar con true y el valor sea nulo si en el código intermedio no fue inicializada.

8.- Usa los Strings con mucho cuidado.

Usa siempre las cadenas con mucho cuidado en tu código.  Una simple concatenación de cadenas puede reducir el rendimiento de tu programa.  Por ejemplo si queremos concatenar cadenas usando el operador “+” en un ciclo for entonces todo el tiempo se estará creando un objeto String.  Esto afecta tanto a la memoria como al rendimiento.

Además en lugar de que instancies una objeto String no uses su constructor, sino que debes instanciarlo directamente. Por ejemplo:

Código: Java
  1. //instanciación lenta
  2. String lenta = new String("solo otro objeto string");
  3.  
  4. //instanciación rápida
  5. String rapida = "solo otro objeto string";


9.- Siempre regresa colecciones vacías en lugar de nulas

No importa que tu método regrese una colección o un arreglo, siempre asegúrate de que cuando sea necesario se regrese vacío y no nulo, en aquellos casos en los que no contendrá elementos porque la lógica de tu programa lo requiera.  Esto te ahorrará un montón de tiempo cuando hagas pruebas para valores nulos.

10.- El copiado defensivo es salvador

El copiado defensivo hace que los objetos creados estén libres de la mutación.  Por ejemplo en el código siguiente tenemos definida la clase Estudiante la cual a su vez tiene una variable con la fecha de nacimiento que es inicializada cuando el objeto es construido.

Código: Java
  1. public class Estudiante {
  2.     private Date fechaNacimiento;
  3.    
  4.     public Estudiante(fechaNacimiento) {
  5.         this. fechaNacimiento = fechaNacimiento;
  6.     }
  7.    
  8.     public Date getFechaNacimiento () {
  9.         return this.fechaNacimiento;
  10.     }
  11. }


Ahora podríamos tener el siguiente código que use al objeto Estudiante.

Código: Java
  1. public static void main(String []arg) {
  2.     Date fechaNacimiento = new Date();    
  3.     Estudiante estudiante = new Student(fechaNacimiento);
  4.     fechaNacimiento.setYear(2019);
  5.     System.out.println(estudiante.getFechaNacimiento ());
  6. }


En el código siguiente creamos tan solo al objeto Estudiante con algunas fechas de nacimiento por default.  Pero entonces cambiamos el valor de el año de nacimiento.  Después imprimimos el año de nacimiento, este año fue cambiado por 2019!

Para evitar estos casos, se puede utilizar el mecanismo defensivo copias. Cambie el constructor de la clase del estudiante a lo siguiente.

Código: Java
  1. public Estudiante(fechaNacimiento) {
  2.     this.fechaNacimiento = new Date(fechaNacimiento);
  3. }


Esto para asegurarnos de tener otra copia de la fecha de nacimiento que usamos en clase Estudiante.

11.-  Nunca dejes salir una excepción de un bloque finally

12.- Nunca lances "Exception" directamente.


Extraido de: viralpatel.net

Automatizaciones en Android con Selenium II





1 – Introducción

En este documento voy a mostrar como lanzar automatizaciones en un dispositivo móvil con android, que puede ser teléfono o tablet y con eclipse elaboraremos un script que por medio de Selenium II será ejecutado en el dispositivo.

Los elementos que vamos a utilizar para este tutorial serán los siguientes:

-        Dispositivo móvil con Android y el USB (En mi caso es un Motorola XT300) o puede ser un emulador que lo encontramos dentro del SDK que descargaremos.
-        Android SDK (http://developer.android.com/sdk/index.html) Incluye Eclipse
-        Android Server APK (http://code.google.com/p/selenium/downloads/list)
-        Librerias de Selenium - Java (http://seleniumhq.org/download)
-        Conexion WIFI a internet

 2 – Integración de ADB

Descargamos Android SDK y lo descomprimimos. Copiamos la carpeta SDK y Eclipse y la pondremos en el disco C (Creandole una carpeta para alojar a ambos)
En mi caso los metí dentro de una carpeta llamada android y me quedo en esta ruta:

c:\android

Lo que sigue ahora es definir la variable de entorno. Para que el equipo me reconozca el adb que viene dentro del SDK.

Para ello vamos a:

Inicio >> Panel de control >> Sistema >> Configuraciones avanzadas del sistema

Una vez ahí dentro, nos dirigimos a la pestaña Avanzada >> Variables de entorno

Editamos el PATH y colocamos la ruta en la que copiamos el SDK. Deberíamos tener algo como esto:



Añadimos un punto y coma después de la ultima ruta, colocando la nuestra. En mi caso es

c:\android\sdk\platform-tools

Si todo quedo correcto, deberíamos poder colocar “adb” en una consola y debería traer los parámetros del mismo

Inicio >> cmd >> adb



Si llegamos hasta acá, quiere decir que todo está perfecto. De lo contrario, lo más seguro es que este mal definido el PATH.

3 – Instalación de drivers USB

Tomamos nuestro dispositivo móvil y vamos a activar el modo de depuración

Configuraciones >> Aplicaciones >> Desarrollo

Y tildamos “Depuración de USB”

Una vez hecho esto, conectamos el dispositivo a la PC y abrimos eclipse que está en la carpeta que creamos en el disco C.

Abrimos el Android SDK Manager y descargamos los USB Drivers. Al estar conectado el dispositivo móvil, identifica que drivers utiliza y descargara e instalara automáticamente los drivers necesarios.



Para saber si todo quedo bien instalado, abrimos una consola y tipeamos

adb devices

Y esto debería devolvernos un número de serie que es nuestro dispositivo conectado.



Si llegamos hasta acá, es por que venimos muy bien! En caso de lanzar error, es porque el driver del dispositivo, no fue bien instalado.

4 – Instalación de Android Server en el móvil

Abrimos una consola y nos paramos en el directorio en donde se encuentra el Android Server APK. Una vez ahi, escribimos la siguiente línea:

adb -s [serialId] -e install -r [APK]

En donde el serialId es el serial de nuestro dispositivo móvil y APK es el nombre con el cual descargaron el Android Server. Debería quedarles algo como esto:

adb -s 003089349226000000000000 -e install -r android-server-2.6.0.apk



Si nos aparece el Success como en la imagen, es porque quedo bien instalado.

Ahora iniciaremos la aplicación en el móvil con el siguiente comando

adb -s [serialId] shell am start -a android.intent.action.MAIN -n org.openqa.selenium.android.app/.MainActivity

Automáticamente, se iniciara en el móvil la aplicación WebDriver (recuerden reemplazar el SerialId por el de ustedes)



Finalmente seteamos el puerto de escucha con el siguiente comando

adb -s [serialId] forward tcp:8080 tcp:8080

5 – Creación del proyecto e importación de librerías

Abrimos eclipse y creamos un nuevo proyecto.

File >> New >> Java Project


Asignamos un nombre al proyecto y una ubicación, seguido a esto, damos click en Next.

Vamos a la pestaña de librerías y pulsamos el boton Add External JARs...

Añadimos la librería de android.jar que está dentro de:

sdk >> platforms >> android-4.2

Y las de selenium que descargamos



Finalmente clickeamos en Finish

6 – Ejecutando nuestro primer Script

File >> New >> JUnit Test Case

Le colocamos un nombre y damos click en Finish



Borramos lo que tenemos dentro del cuadro de código y colocamos el siguiente:

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.android.AndroidDriver;


public class androidtest {
               
private static WebDriver driver;
   
    @Before
    public void setUp() {
        driver = new AndroidDriver();
       driver.get("http://underc0de.org");
    }
   
    @After
    public void tearDown(){
        driver.close();
        driver.quit();
    }

@Test

public void measurePerformance() throws InterruptedException {
    Thread.sleep(3000);
    driver.findElement(By.className("readViewMoreBtn")).click();

}
}



Ejecutamos el Test Case y podremos verlo en nuestro móvil. Al finalizar, nos mostrara el resultado si se corrió bien o mal.

7 – Emulando el ambiente de prueba

Presionamos el icono del dispositivo móvil (ADV) que está en el eclipse. Y crearemos un nuevo dispositivo



Le asignamos un nombre, elegimos la resolución de pantalla y la versión de android, luego damos click en ok.


Seleccionamos el emulador, presionamos Start y luego Launch, y se abrirá el emulador.



Una vez hecho esto, los pasos para lanzar la prueba son los mismos que la anterior, es decir, repetimos los pasos del punto 4, que eran los de instalar el andoird server en el móvil.

Finalmente, lanzamos el test con eclipse



Y con esto podremos hacer más scripts y lanzar las pruebas contra el emulador.

Espero que les haya gustado y les sirva.


ANTRAX