Mostrando entradas con la etiqueta objetos. Mostrar todas las entradas
Mostrando entradas con la etiqueta objetos. 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.

jueves, 25 de julio de 2013

Entendiendo Javascript (IV)

Quien empieza a usar JavaScript a menudo sabe qué quiere hacer pero no sabe acerca del entorno en el que se desempeña, el navegador. Esto no debería ocurrir, por que conocer el entorno, sus variables, las funciones que se pueden usar y cuando se pueden usar hacen de esta tarea algo menos complejo.

Muy bonito, pero ¿Dónde Estoy?
¿Dónde estoy?, esa es la primera pregunta que debemos hacernos, y para esto es necesario que entendamos que compone el navegador (por ahora pensaremos en el navegador, mas adelante al usar herramientas como NodeJs, la cual esta del lado del servidor pensaremos en otros tipos de entorno) y como se usa.

Composición del navegador
El navegador está compuesto por varios objetos, los cuales de una u otra forma usamos aunque no tengamos conociemiento de ellos, a groso modo podemos decir que son:

  • Window: es el objeto principal, en el cual están contenidos los demás objetos del navegador. Se crea un objeto de este tipo para cada ventana que pueda ser abierta (recuerde que en la actualidad los navegadores bloquean muchas de las ventanas emergentes) desde una página Web. El objeto window contiene:
    • Navigator: contiene información acerca del navegador, entre estas nombre, versión, tipos MIME soportados por el cliente y otros. 
    • Location: contiene información acerca de la página visualizada. 
    • History: objeto que almacena información de los lugares visitados.
    • Document: Cuando se hace una petición web el navegador descarga una gran cantidad de datos, entre estos el código HTML, luego el convierte ese código HTML en objetos, document es el contenedor de todos los objetos creados en la página web, tales como: 
      • enlaces
      • formularios
      • imágenes
      • marcos
      • etc.
    • Frames: Es una matriz que contiene los distintos objetos frame que puede contener una ventana. Debemos tener en cuenta que cada frame es a su vez otra ventana.
Una vez más, ¿Dónde estoy?
Después de haber echado un vistazo a una gran cantidad de teoría es más fácil inferir que cuando inician nuestros programas en JavaScript nuestro entorno de trabajo es un objeto window.

Concluyendo
Después de ser golpeado por estos nuevos conceptos sabemos que nuestros programas inician dentro de un objeto window, el cual nos ofrece un entorno con una serie de objetos que podemos usar a voluntad, entre estos el document, donde están contenidos los objetos como botones, cajas de texto y demás.

Fuentes
http://www.w3schools.com/jsref/obj_window.asp

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.