Mostrando entradas con la etiqueta poo. Mostrar todas las entradas
Mostrando entradas con la etiqueta poo. Mostrar todas las entradas

jueves, 12 de diciembre de 2013

Ponte la Armadura, Java y las Clases Abstractas

Como mencionaba en un artículo anterior Una de las cosas más complejas de entender en el mundo de Java son las clases abstractas, en ésta entrada vamos a hablar de ellas.
¿Una armadura?, es extraño mencionar una armadura cuando de código se trata, pero veamos esto:
  • Una armadura es un conjunto de piezas  que vienen listas para permitir que hagamos algo.
  • Para poder portar la armadura es necesario tener (o implementar) ciertas aptitudes físicas para poder usarla.
Así mismo es una clase abstracta, en ésta existen un conjunto de elementos que ya están listos para ser usados y que fueron implementados como se implementan comúnmente métodos en Java, sin embargo hay otros que debemos hacer nosotros mismos antes de poder usar la clase y los hacemos declarando el método abstracto y removiendo el cuerpo del método.

Veamos un ejemplo:

public abstract class Ficha{
    private String nombre = "Ficha";
    public abstract void mover(String destino);
    public abstract void atacar(String destino);
    public String getNombre(){
        return nombre
    }
    public void setNombre(String nombre){
        this.nombre = nombre
    }
}

En el ejemplo anterior vemos la clase abstracta Ficha, que tiene dos métodos comunes (getNombre, SetNombre) y dos métodos abstractos (mover, atacar). Ahora bien, esta clase existe y tiene ciertas cosas que podemos usar (ya está la armadura), pero hay otras que debemos hacer nosotros (Trabajo físico para usar la armadura), para esto podríamos:
  • Crear una nueva clase que implemente la clase abstracta
  • Crear una instancia de la clase abstracta y definir los métodos ahí mismo (Se ve muy feo pero funciona)
Veamos un ejemplo de cada una:

Primera Forma
public class Peon implements Ficha {
    public Peon() {
        setNombre("Peon");
    }
    @Override
    public void mover(String destino){
        System.out.println(String.format("Me estoy moviendo a %s", destino));
    }
    @Override
    public void atacar(String destino){
        System.out.println(String.format("Estoy atacando %s", destino));
    }
}

Como vemos en el ejemplo anterior se ha creado una nueva clase, la cuál implementa la clase abstracta Ficha, es posible observar que podemos usar el método setNombre que había sido definido en la clase Ficha y que se han reescrito los métodos abstractos agregando lógica a  éstos. Es muy importante tener en cuenta que a los métodos reescritos se les ha puesto la anotación @Override, la cual especifica que lo que queremos hacer es reescribir el método.

Segunda Forma
public class Main {
    public static void main(String []argv) {
        Ficha f = new Ficha(){
            @Override
            public void mover(String destino){
                System.out.println(
                    String.format("Me estoy moviendo a %s", destino)
                );
            }
            @Override
            public void atacar(String destino){
                System.out.println(String.format("Estoy atacando %s", destino));
            }
        };
        f.setNombre("Peon");
    }
}

Como vemos en el ejemplo instanciamos la clase Ficha, pero debemos llenar de alguna manera los lugares faltantes.

¿Y para qué usar armadura?
Las clases abstractas son elementos que permitirían hacer código que luego sea extendido en situaciones específicas, por ejemplo, si se tiene un tablero de ajedrez y hay que implementar el movimiento de las fichas seria bueno usar clases abstractas, puesto que a pesar de que todas las fichas son iguales no se mueven igual, por lo tanto hay que reescribir el método de movimiento en cada clase.

Espero que sea útil.
Si te gusto el post
compartelo... :D


lunes, 30 de septiembre de 2013

Aprendiendo Dart (I)


Es difícil evolucionar a la velocidad de la tecnología, pero hay que intentar hacerlo. Puede que Dart sea en algún tiempo una alternativa en el mundo de la web frente al famoso JavaScript, entonces vamos a aprender un poco de éste.

Palabras reservadas:
abstract continue factory import return try
as default false in set typedef
assert do final is static var
break dynamic finally library super void
case else for new switch while
catch export get null this with
class external if operator throw
const extends implements part true
Variables:

En Dart las variables se declaran así: 

var numero = 1;

O así:
int numero = 1;

Para el primer caso la variable es dinámica; para el segundo la variable es apta para números enteros, esto permite que herramientas como compiladores y editores le ayuden durante el desarrollado a evitar errores en su programa.

Finales y Constantes:

A diferencia de JavaScript, Dart permite variables finales y constantes así:
final String name_bob = 'Bob';

final name = 'Bob';

const PI = 3.141594;


Tipos:

  • dynamic: Tipo dinámico de datos
    • var x = 1;
  • int: Tipo numérico de datos, almacena números enteros. Hereda de la clase num.
    • var x = 1;
  • double: Tipo numérico de datos, almacena números con doble precisión (punto flotante) de 64 bits  . Hereda de la clase num.
    • var x = 1;
  • String: Tipo de datos para cadenas de texto, usa codificación UTF-16. Permite usar comillas dobles o simples, además de que cuando ponen tres comillas (dobles o sencillas) al principio y final de cada cadena permiten cadenas multilínea: 
    • String cadena1 = "Hola Mundo!!!";
      String cadena2 = 'Hola Nuevo Mundo!!!';
      String cadena3 = """Esta cadena
      permite multiples
      lineas en una cadena""";
      String cadena4 = '''Y esta cadena
      Tambien permite
      varias lineas''';
      
  • Booleans: Tipo de datos de valores de verdad, tiene dos literales, true y false, además  a diferencia de JavaScript cualquier valor diferente a true es falso: 
    • boolean b = true;
      if(b){
          print(b);
      }
      
  • Lists: Tipo para colección de datos
    • List lista = new List();
      List lista = [1,2,3,4];
  • Maps: Tipo de datos para arreglos asociativos (llave:valor), permite la asignación de nuevos valores en tiempo de ejecución de la misma manera que JavaScript
    • Map mapa = {"Hola":"Mundo"};
      mapa["Nuevo_Valor"]="No Toques mi Código";
      
Ésta fue una muy breve introducción al lenguaje, todo fue extraído de la documentación oficial del lenguaje. espero que les guste y continuaremos en una próxima ocasión.

sábado, 28 de septiembre de 2013

El molde de la taza, Java y las interfaces


Es fácil hacer  en Java un programa con un par de clases, sin embargo la potencia de un lenguaje como éste se ve a la hora de usar la artillería orientada a objetos. En general hay conceptos complejos dentro de la programación orientada a objetos, y dos que especialmente no son muy fáciles de entender, las interfaces y las clases abstractas, esta vez explicaré qué es una interfaz.


Hagamos un molde
¿Un molde?, ¿Qué tiene que ver un molde y una interfaz?. Es extraña la manera en que comparo esto, pero si nos detenemos a pensarlo un poco puede que sea claro. Una interfaz es una estructura de datos que contiene la definición (también se le llama contrato) de los métodos que debería tener una clase o su descendencia pero éstas no tienen lógica alguna, es decir, una interfaz es una guía de cómo debería lucir una clase, pero no es propiamente la implementación de la misma, es decir, es el molde de cómo debería ser una clase, a continuación veamos un ejemplo de esto: 

// Ejemplo de Interfaces
interface MoldeTaza{
    public void Servir(Object contenido);
    public void Vaciar();
}
// fin

Como vemos en el ejemplo se crea la interfaz y a su vez en esta se declaran los métodos, pero no se escribe el contenido de los mismos, únicamente se pone un punto y coma para reemplazar el cuerpo del método. Ahora bien, después de tener nuestro molde vamos a crear cosas con el.
// Ejemplo de Interfaces
class TazaDeCafe implements MoldeTaza{

    Object contenido;

    @Override
    public void Servir(Object contenido){
        this.contenido = contenido;
        System.out.println("El café esta servido...");
    }

    @Override
    public void Vaciar(){
        this.contenido = null;
        System.out.println("Se ha terminado el café...");
    }

}
// fin

Como vemos en el código anterior la clase TazaDeCafe implementa la interfaz MoldeTaza (Los métodos de las interfaces no se heredan, se implementan), es decir, los métodos que se describieron en la interfaz se reescriben con el cuerpo que corresponde de acuerdo a la clase, además se pone la anotación Override, que especifíca que el método no es propio de esta clase puesto que la primera vez que se escribió fue en una clase padre o en un interfaz que ha sido implementada. 

Y ¿Para qué usar moldes?
Tal vez una de las cosas más complejas de las interfaces no son en sí cómo hacerlas, lo que realmente las hace complejas es saber cuándo y por qué usarlas. Para entender esto debemos partir de un caso de prueba. Supongan que están haciendo un juego de ajedrez, todos sabes que hay un tablero en el cual hay varios tipos de fichas, todas estas son diferentes, se mueven diferente, se ven diferentes, pero al fin y al cabo no dejan de ser fichas. Este seria un caso ideal para usar interfaces, con una interfaz ficha definiremos todas las posibles acciones que tiene una ficha y cómo debe responder el tablero ante los objetos que implementan ésta interfaz, pero a la hora de hacer una ficha específica como el Caballo se especificarán la manera en que debe ejecutar las acciones este objeto.

Espero que les sea de utilidad.

jueves, 26 de septiembre de 2013

En el blanco. Dart, otra opción para la web


Hasta el momento la mejor y única opción para desarrollar aplicaciones web es JavaScript, y con la flamante puesta en marcha de Html5 las dudas al respecto son cada vez menos, sin embargo hace ya casi dos años Google trajo a la luz un lenguaje con el que esperaba entregar una nueva alternativa, Dart.

¿Qué es Dart?
Dart (inicialmente Dash) es un lenguaje programación que no tiene como objetivo reemplazar JavaScript, pero sí ofrecer una alternativa más moderna. Dart es un lenguaje orientado a objetos, muy similar a java en muchos aspectos pero con la posibilidad de ser tan dinámico como JavaScript, es tipado pero tiene un tipo especial llamado dynamic, el cual permite crear variables sin especificar su tipo, tal como en JavaScript.

Chromium incluye una máquina virtual para ejecutar Dart, Google anunció que proveerá máquina virtual a sus competidores para permitir que usen el lenguaje en otros navegadores y además de esto existe la posibilidad de compilar los programas de Dart a JavaScript.

A probar puntería
Muy bien, ahora probemos un poco esto, primero es necesario descargar el sdk de Dart, pueden hacerlo desde éste lugar, el cual trae consigo eclipse y una versión ligera de Chromium, después de esto crean un nuevo proyecto, puede ser web o para una aplicación de consola (línea de comandos), el siguiente código muestra un poco del lenguaje:
// Inicio del ejemplo
// tets.dart
import 'dart:html';


class Auto{
  var _name; // variable privada tipo dynamic
  
  void setName(var nombre){
    this._name = nombre;
  }
  
  String toString(){
    return _name;
  }
  
  void clicked(Object o){
    window.alert("Hola, Soy un Chevette...");
  }
  
}

void main() {
  Auto chevette = new Auto();
  chevette.setName("Chevette");
  query("#auto")..text = "Auto: ${chevette.toString()} "
  ..onClick.listen(chevette.clicked);
}
// Fin

A nivel de lenguaje no hay mucha diferencia entre Dart y otros lenguajes imperativos orientados a objetos como Java, para hacer comentarios se usa la secuencia "//", las llaves, los paréntesis y más, pero hay cosas que hacen de éste un lenguaje que simplifican el desarrollo de una aplicación, como la eliminación de las palabras reservadas public y private, características de los lenguajes orientados a objetos, en éste todo es público por defecto y se convierten en privados cuando el nombre inicia con "_".
Como vemos en el código anterior existe una clase llamada Auto, ésta tiene un atributo privado llamado _name, y hay un método para cambiar el valor de _name, y hay un método que retorna un objeto tipo cadena que retorna el contenido de la variable _name. Además de esto podemos modificar el DOM mediante la orden query, ésta fue importada de la librería html de Dart y de una manera muy similar a la de JQuery obtenemos elementos con un id específico mediante el carácter '#'.
Dart al igual que Java, C y C++ usa el método main para iniciar el programa.
Una de las cosas extra es que Dart permite hacer múltiples operaciones sobre el mismo elemento del dom mediante el operador '..' , un ejemplo claro es el contenido del método main.

A continuación el código HTML que acompaña el código anterior:

<!-- Inicio del ejemplo -->
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
    <link rel="stylesheet" href="test.css">
  </head>
  <body>
    <h1>Hello world from Dart!</h1>
    
    <div id="auto">      
    </div>
    
    <script type="application/dart" src="test.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>
<!-- Fin del ejemplo -->

Hacer esto no es complejo y gracias al IDE que provee la página web del proyecto,  éste IDE permite escribir un proyecto, depurarlo y finalmente generar todo el código JavaScript.

Interesante propuesta de Google, tendremos que esperar para ver qué ocurre con éste prometedor lenguaje.

martes, 23 de julio de 2013

Entendiendo Javascript (III)


Objetos por aquí, objetos por allá, muy bonito, muy bonito, pero de que sirve esto sin la Herencia?

Herencia
Retomando, JavaScript nos provee ciertas herramientas para poder usar programación orientada a objetos, entre estas los prototipos, de esta manera podemos hacer gala de nuestras habilidades con este paradigma, pero aún hace falta una de las mas importantes herramientas, la herencia.
La herencia en JavaScript se hace al igual que las clases mediante el prototipo, pero hay dos maneras de implementarla:

Herencia Mediante Cadena de Prototipos:
Este tipo de herencia se hace mediante el uso del prototipo de los objetos, de esta manera:

// Ejemplo de Herencia por prototipos

// clase padre
function Mamifero(medio, num_extremidades, sonido){
    this.medio = medio; 
    this.extremidades = num_extremidades;
    this.saludo = function(){console.log(sonido)};
}

// clase hija
function Perro(raza){
    this.raza = raza;
}
// especificamos cual es la clase padre
Perro.prototype = new Mamifero("terrestre", 4, "Guauu, Guauu...");
fluffy = new Perro("Doberman");
fluffy.saludo()
// Fin del ejemplo

Lo que acabamos de ver se llama cadena de prototipos, y esta se basa en que una clase hija lo que hace es reemplazar su prototipo por una instancia de la clase padre, por esto se hace la asignación de una instancia de la clase padre al prototipo como vemos en la linea 15.

Herencia mediante llamado al Constructor del Padre:
Este tipo de herencia hace uso del constructor de la clase padre de manera directa, se hace así:
// Ejemplo de Herencia por prototipos

// clase padre
function Mamifero(medio, num_extremidades, sonido){
    this.medio = medio; 
    this.extremidades = num_extremidades;
    this.saludo = function(){console.log(sonido)};
}

// clase hija
function Gato(raza){
    Mamifero.call(this,"terrestre", 4, "Miauu, Miauu...");
    this.raza = raza;
}
// insatancia de la clase
jack = new Gato("Angora")
jack.saludo()
// Fin del ejemplo

Lo que acabamos de ver fue otra manera de usar herencia en JavaScript, esta es más interesante por que encapsula todo dentro del mismo bloque de código. Lo que se está haciendo es que se llama el constructor de la clase padre pero se especifica que los atributos y métodos de la clase padre deben ser establecidos en la clase actual, lo anterior se lleva a cabo mediante el método call, usado en la linea 12, el cual recibe como primer parámetro la referencia al objeto en construcción.

lunes, 15 de julio de 2013

Entendiendo Javascript (II)


Ya en el articulo anterior entendimos un poco mejor que es JavaScript, ahora ya es necesario aclarar muchas de las cosas maravillosas que podemos hacer con este lenguaje.

Prototipos
Debemos recordar que en JavaScript es un lenguaje basado en prototipos, es decir, el no crea instancias de objetos, en vez de esto clona un objeto que usamos como nos sea conveniente, pero ¿Como como crear una clase con JavaScript?. Para esto podríamos tener en cuenta la siguiente tabla:

Programación Orientada a Objetos Programación mediante Prototipos
Objeto Prototipo
Atributo Variable
Metodo Función

Aun así no queda muy claro donde y como hacer un prototipo, para esto debemos tener en cuenta que todo objeto creado en JavaScript por defecto tiene un atributo llamado prototype, para poder entender como se usa veamos el siguiente ejemplo:

/* Ejemplo de prototipo */
function Automovil(nombre, modelo){
    this.nombre = nombre;   // este es un atributo
    this.modelo = modelo;   // este es otro atributo
    // la palabra reservada this hace que la variable
    // pertenezca al contexto de la función que
    // representa la clase, si no se usa la variable es local
    // y desaparece al terminar la ejecución de la función.
}
Automovil.prototype.encender = function(){ // uso de prototype
    console.log("run, run..."); // escribimos un mensaje en consola
}

// ejemplo de creacion de un objeto
auto = new Automovil("BMW","X6"); // la palabra new clona el objeto
auto.encender(); // llamado del metodo encender
/* Fin del Ejemplo */

domingo, 14 de julio de 2013

Entendiendo Javascript (I)




En este momento uno de los más importantes lenguajes de programación del mundo es JavaScript, no porque sea el más sencillo, más fácil de entender o de usar, por el contrario, es un tanto complejo y poco legible, en este artículo vamos a tratar de entender un poco mejor este lenguaje.


¿Que es JavaScript?

JavaScript es un lenguaje interpretado, que se define como orientado a objetos, basado en prototipos, imperativo, débilmente tipado y tipado dinámico, y ¿a que se refiere todo eso?.
  • Interpretado: NO es necesario compilar el código para poder ejecutarlo.
  • Orientado a Objetos: Un lenguaje orientado a objetos permite diseñar un sistema partiendo de los objetos que están inmersos en este y su forma de interactuar. En teoría deberían declararse clases con métodos y atributos pero en JavaScript a diferencia de otros lenguajes no se usan palabras clave como class, de ahí su siguiente característica.
  • Basado en Prototipos: Esta es una característica de algunos lenguajes orientados a objetos, los cuales en vez de crear objetos mediante la instanciación de una clase los crean mediante la clonación de objetos de los mismos y posterior extensión mediante cosas que agrega el programador.
  • Imperativo: Un lenguaje imperativo es aquel en que el programador le indica de manera explícita a la máquina como debe hacer una tarea.
  • Débilmente Tipado: cuando el intérprete empieza a ejecutar las órdenes de nuestro programa este no es "consciente" por así decirlo en todo momento de cual es el tipo del dato que está contenido en una variable, en los lenguajes fuertemente tipados si.
  • Tipado Dinámico: Esto hace referencia a que cuando el intérprete empieza a ejecutar el programa este va alterando según las necesidades del programa el tipo de dato de una variable, es decir, cambia la cantidad de memoria que necesita la variable.