lunes, 28 de julio de 2014

Encapsulación

Encapsulación:

Hasta ahora no hemos caído en el detalle de que no siempre queremos que se acceda a un objeto creado por nosotros (mediante el operador "punto"). Hemos estado creando variables que están "expuestas" a ser modificadas en otro lugar del código y no siempre vamos a querer esto.

Un ejemplo sería el de una variable, por ejemplo:

elGato.altura = 30;  //que en un inicio tenemos ésta variable con un valor de 30 cm.

elGato.altura = 0; //cambiamos el valor a 0. Esto hay que evitarlo a toda costa puesto que un gato nunca va a medir "0" cm.

Para evitar estas modificaciones de variable que no corresponden con el objetivo de la variable hacemos una encapsulación.

public void setAltura (int al) {
   if (al > 9) {
      altura = al;
   }
}
Vemos que dentro del propio método setter colocamos un condicionante.

Ocultando los datos:

Podemos ocultar nuestros datos escribiendo "public" o "private". La regla de oro de la encapsulación: 

Haz "private" tus variables instanciadas
Haz "public" tus getters y setters.


Ejemplo de "Encapsulating":

El ejemplo lo copio del libro:

class GoodDog {

  private int size;

  public int getSize () {
   return size;
{

public void setSize (int s) {
  size = s;
}

void bark () {
  if (size > 60) {
   System.out.println ("Woof! Woof");
} else if (size >14) {
   System.out.println ("Ruff! Ruff!");
} else {
   System.out.println (" Yip! Yip!");
    }
  }
}

class GoodDogTestDrive {

   public static void main (String [] args) {
    GoodDog one = new GoodDog ();
    one.setSize (70);
    GoodDog two = new GoodDog ();
    two.setSize (8);
    System.out.println ("Dog one :" +one.getSize () );
    System.out.println ("Dog two: " + two.getSize () );
    one.bark ();
    two.bark ();

 }
}




  

Comportamiento de Objetos

Hemos visto que los objetos tienen "estados" y "comportamientos" representados mediante "variables de referencia" y "métodos", ahora vamos a ver de que forma podemos relacionar estos dos elementos.

Se podría decir que: Los métodos usan los valores de las variables de la clase.

Un ejemplo claro es:

class Perro {
int altura;
String nombre;

void ladrar () {
if (altura > 60) {
System.out.println("que grande soy");
} else if (altura >15) {
System.out.println("bueno, no soy tan pequeño");
} else {
System.out.println ("vaya marrón");
}
}
}
class PerroTestDrive {

public static void main (String[] args) {
Perro uno = new Perro ();
Perro dos = new Perro ();
Perro tres = new Perro ();
uno.altura = 70;
dos.altura = 8;
tres.altura = 35;

uno.ladrar();
dos.ladrar();
tres.ladrar();
}
}

Vemos como el método puede utilizar las variables definidas en su código.


Enviando cosas al objeto:

Podemos pasar valores a los métodos, por ejemplo, podríamos decir:

Perro uno = new Perro ();
uno.ladrar (3);                //Donde el 3 es el argumento

void ladrar (int numeroDeLadridos) {    //Donde numeroDeLadridos es el parámetro)

while (numeroDeLadridos > 0) {
System.out.println ("Jáu Jáu");
numeroDeLadridos = numeroDeLadridos -1;
}
}

 Recibiendo cosas de un método:


Hasta ahora hemos visto métodos que no devolvían nada, es el caso de:

void ejemplo () {
}

Pero podemos también declarar métodos que devuelvan un tipo de valor específico:

int devuelveAlgo () {

     return 10;
}
// Debemos tener una variable que pueda almacenar el valor que nos devuelve el método, en este caso es un valor entero, por lo tanto podremos decir que:

int dameLoQueDevuelves = unaClase.devuelveAlgo;


Mandando más de una cosa a un objeto:

Podemos enviar mas de una variable a la vez;

void unMetodo () {

   nuevoObjeto nuevo = new nuevoObjeto ();
   nuevo.tomaDos (10, 20);
}

void tomaDos (int x, int y) {

   int z = x + y;
   System.out.println ("El total es " + z);
}

El 10 se corresponde con la x y el 20 con la y.

* Podemos enviar también variables que contengan el valor deseado:

void unMetodo () {

   int uno = 10;    // Creamos unas variables nueva
   int dos = 20;
   nuevoObjeto nuevo = new nuevoObjeto ();
   nuevo.tomaDos (unodos);
}

void tomaDos (int x, int y) {

   int z = x + y;
   System.out.println ("El total es " + z);
}


Un detalle a tener en cuenta es que el argumento no está conectado con el parámetro, es decir, una vez que le pasemos el valor de uno y dos al método tomaDos (int x, int y) El valor que tenga x e y no modificarán el valor de uno y dos. Es decir, el valor de uno y dos se "copia" en los valores de x e y. A partir de ese momento todo lo que hagamos con x e y no influirá en el valor inicial de uno y dos.


Getters y Setters:

Los getters y setters te permitirán obtener y establecer/definir cosas. Valores de variables instanciadas por lo general. La estructura generar que se emplear es:

Ejemplo:

class GuitarraElectrica {

  String marca;
  int numeroDeGuitarras;
  boolean artistaLaUsa

//Esto es un Getter
String getMarca () {
  return marca;
}

//Esto es un Setter
void setMarca (String aMarca) {
  marca = aMarca;
}

//Lo hacemos con cada una de las variables
 int getnumeroDeGuitarras () {
  return numeroDeGuitarras;
}

void setNumeroDeGuitarras (int num) {
numeroDeGuitarras = num;
}

//Y con la ultima:

boolean getArtistaLaUsa () {
   return artistaLaUsa;
}
void setArtistaLaUsa (boolean siONo) {
artistaLaUsa = siONo;
}
}



domingo, 27 de julio de 2014

Las Variables

He visto que las Variables son "cosas" que guardan otras "cosas".
Hay dos tipos de variables: variables primitivas y variables referenciadas.

Declarando variables:

En primer lugar hay que tener en cuenta que las variables se preocupan por el "tipo", es decir, no podemos crear una variable float (variable con valores decimales) y luego introducirla dentro de una variable tipo integer (variable sin valores decimales) .
Como ya dije, hay dos tipos de variables, las primitivas que almacenan valores fundamentales (un entero, flotante, boleano...) y las referidas a objetos almacenan precisamente referencias a objetos... esto ya se verá mas adelante ;-(

Las variables deben tener siempre un tipo y un nombre.

por ejemplo: int number; (donde int es el tipo y number es el nombre).

Imaginando variables:

Se debe imaginar una variable como un vaso o una taza... un contenedor en definitiva.

Cada vaso tiene un tamaño y un objetivo, existen vasos de pequeños, grandes, incluso muy grandes, cada cual para un objetivo diferente.

En java ocurre algo similar, cuando vamos a definir una variable, tenemos que elegir el "tamaño" de esa variable sabiendo de antemano lo que vamos a meter en ella.







Variables primitivas:

boolean y char:

boolean:  true o false
char: 16 bits es decir desde 0 hasta 65535 

numeric:

integer   byte   8 bits
             short   16 bits
             int       32 bits
             long    64 bits

floating point   float    32  bits
                        double 64 bits

Nombres prohibidos:

Una vez sepamos el tipo de variable que vamos a necesitar, debemos elegir un nombre que deberá cumplir con las siguientes reglas:

* Debe comenzar con una Letra, barra baja, o símbolo de dólar $. Nunca deberemos comenzar con un número.
* Después de la primera letra podremos usar números también.
* Puede ser cualquier palabra, siempre que no sea una de las palabras reservadas de Java.

Algunas de las palabras reservadas se muestran en la tabla.


boolean
byte
char
double
float
int
long
short
public
private
protected
abstract
final
native
static
strictfp
synchronized
transient
volatile
if
else
do
while
switch
case
default
for
break
continue
assert
class
extends
implements
import
instanceof
interface
new
package
super
this
catch
finally
try
throw
throws
return
void
const
goto
enum

Controlando los objetos


Ya sabemos declarar variables y asignarles un valor, pero ¿Que hay de las variables no primitivas?, es decir, de los objetos.
Los objetos no son como las variables anteriormente vistas, en este caso se guarda una "dirección" al contenido en lugar del contenido mismo.

Es decir, debemos entender una variable objeto como algo que NO contiene el objeto, si no como algo que le dice al compilador donde encontrar ese objeto... Algo parecido a un control remoto.

Esta "llamada" al objeto se realiza mediante el símbolo "punto" ( . ) como en el siguiente ejemplo.

miPerro.ladrar () ;

Usa el objeto referenciado por la variable "miPerro" para invocar el método "ladrar".

En resumen: Las variables primitivas almacenan el valor que le hemos asignado mientras que las variables de referencia almacenan un valor que nos direcciona hacia un objeto específico.

Los Array

Los arrays son variables que almacenan otras variables. Un array es una estructura matricial con una sola fila (o una sola columna) que almacena variables ya sean bien variables primitivas o variables de referencia (pero no las dos a la vez).

Para declarar un array hacemos lo siguiente:

- int [] numeros; //Declaramos un array de variables enteros (int), como mismo hacíamos con los objetos
- numeros = new int [7];  //Creamos una instancia de ese array con una longitud de 7 y se lo asignamos a "numeros"
- //Le añadimos a cada espacio del array su valor:

numero [0] = 2;
numero [1] = 4;
numero [2] = 1;
numero [3] = 6;
numero [4] = 2;
numero [5] = 8;
numero [6] = 4;

Notar que el array en sí mismo es un objeto, a pesar de que los 7 elementos que contenga son primitivos.
En lugar de emplear valores primitivos, podríamos haber rellenado el array con otros objetos. En cuyo caso en lugar de poner: numero [1] = 4; deberíamos poner numero [1] = new loQueSea (); debemos crear un objeto y asignarlo a la variable.




miércoles, 23 de julio de 2014

Aspectos básicos

He comenzado a leer el libro y me ha sorprendido gratamente. No me esperaba que fuese tan fácil de entender y al mismo tiempo tan interesante.
El libro comienza con una introducción bastante extensa, pretendiendo de alguna manera parecer informal y familiar con el lector, lo cual es bastante de agradecer por mi parte (ya he dicho que me aburro de las cosas monótonas).

Estructura de un código de Java:


El primer aspecto a tener en cuenta, según el libro, es la estructura de un código en java:

Source file (.java); Donde se supone que está el programa.
Class file; Las cuales van dentro del source file y son las "piezas" del programa
Methods; Los cuales van dentro de la Class file y son las "instrucciones" de como debería ejecutar una acciones la Clase
Statements; Van dentro de los métodos y son la "forma de implementar dicho método", en otras palabras, los Methods no son más que un conjunto de Statements.


Como escribir una clase:



Todas los programas Java comienzan por una clase con un método Main, lo cual será la primera cosa en ser ejecutada (y por tanto, todo aquello que se encuentre entre sus "Curly braces" o llaves).

La forma de esta clase es:

public class ElNombreDeLaClase {                  //esto es la clase principal, porque contiene el método main
public static void main (String [] args) {           //esto es el método y lo de paréntesis es el argumento
System.out.print ("Escribe algo aquí");   //esto hace que escriba algo en la consola
}

 En definitiva, no importa cual grande sea tu código (es decir, no importa que cantidad de clases tenga), siempre iniciará por el method main.


¿Que puede ir dentro de un método?:


Dentro de un método podemos emplear toda la lógica ya conocida en cualquier otro lenguaje de programación (ya sea C, C++, etc...) para hacer que el programa haga algo (Statements, Loops, Branching...).

Con el código podemos decirle a la JVM que:

1) Haga algo (Statements): 

Mediante declaraciones:
int x=3;
String nombre= "Pepito";

Asignaciones:
x = x * 2;

Llamada a otros métodos:
System.out.print ("x es igual a" + x);

Comentarios:
//Hola, esto es un comentario. Los comentarios son ignorados por el compilador, así que es buena idea
//poner todos los comentarios necesarios para hacer el código más entendible.

2) Haga algo una y otra vez (Loops):

while (x<12)  {
x=x-1;
}

for (int x=0; x<12; x=x+1) {
System.out.print("x es ahora " + x);
}

3) Hacer algo bajo una condición:

if (x==10) {
System.out.print("x debe ser igual a 10");
} else  {
System.out.print("x NO debe ser igual a 10");
}

if ((x<3) & (name.equals("pepito"))) {

System.out.print("pues se cumplen esas dos condiciones");
}

//El resto de código, así como la explicación de estos se puede encontrar fácilmente en cualquier web.



Diferencia entre la programación "procedimental" y la orientada a objetos:

Aun no lo tengo claro, pero me atrevería a decir que la programación orientada a objetos divide (por decirlo de alguna forma) el código en "módulos" independientes entre sí los cuales iremos "invocando" en función de lo que necesitemos en cada momento. Mientras que la programación mediante procedimientos recorremos el código completamente y mediante los condicionantes se va determinando que es lo que hay que hacer en cada momento (estoy 100% seguro de que esta es la peor definición de la historia, pero no se me ocurre nada mas). El problema con la programación procedimental es que si cambia el objetivo de nuestro código, se le añaden nuevos factores a tener en cuenta, etc... El cambio que deberíamos hacerle a éste es mucho mayor que si dividimos nuestro código en varios pedacitos.

Diferencia entre una Clase y un Objeto:

No debemos confundir un objeto con una clase, los objetos con una "instancia" de una clase. Se podría hacer un símil al dualismo Platónico entre los mundos sensible e inteligible ya que la clase es como un prototipo sin definir completamente, como una libreta de direcciones... Mientras que los objetos son casos particulares de esa clase "padre" adaptándose a un caso concreto, cada hoja de la libreta de direcciones tiene la misma estructura (nombre, teléfono, etc...) pero si rellenamos cada una con una persona diferente, cada hoja será diferente.

Como crear un objeto:


Para crear y usar un objeto necesito como mínimo 2 clases. Una clase para el tipo de objeto que quiero usar y otra clase para testearla. La segunda clase es donde irá el método main, y tiene solo un objetivo (probar la clase que he creado (la primera)).

De tal forma que tendremos siempre dos clases: 
- La verdadera clase
- La clase "tester" 

Ejemplo:

//mi clase verdadera es:
--------------------------------------------------------------
class Gato {

int tamaño;
String color;   //variables
String nombre;

void sonido () {
System.out.println("miau miau"); //un método
}
}
--------------------------------------------------------------
//mi clase tester es:
--------------------------------------------------------------
class GatoTestDrive {

public static void main (string [] args){
Gato g = new Gato ();  //Creo un objeto Gato

g.tamaño = 40; //uso el operador punto (.) para definir el tamaño del gato
g.sonido (); //así llamo al método "sonido"
}
}
--------------------------------------------------------------







Aquí termina esta entrada de "Aspectos básicos". Solo queda digerirlo y nos vemos prontooo!!



Extra:

JVM : Java Virtual Machine, Es la encargada de interpretar y arrancar el programa una vez ha sido compilado por el "compiler".

Como empezar con Java.

Una vez decidido que quiero programar para Java, toca ahora elegir la guía que seguiré.

Estos son los pasos que he seguido:

1) Entrar en google y escribir tutoriales de Java
2) Mirar las recomendaciones
3) Dormir un rato
4) Volver a 1)

Y es que con tantos miles de videos y guías que hay como se yo cual es mejor y cual es peor... en fin.
He optado por preguntarle a mi fiel amigo (llamemosle "pato") que me recomendaba.

El libro: Head First Java (2da edición) por Kathy Sierra y Bert Bates.

Ya lo he conseguido y me ha dado un escalofrío al ver la cantidad de páginas que tenía... Pero bueno, seguiré los consejos de Pato y me pondré a ello. (El libro está en ingles así que es muy probable que entienda algún que otro concepto al revés, pero que no cunda el pánico)


Java, un buen comienzo?

Bueno, ok. Ya estoy aquí, con ganas de empezar, SIIII!!!!!......... un momento... ¿por donde empiezo?.

Antes que nada decir que llevo un par de días hablando sobre este tema, leyendo foros, viendo que recomendaba la gente para empezar a programar, etc. Y la conclusión a la cual he llegado es que buscar en internet ha sido la mayor perdida de tiempo de mi vida. Es decir, cada foro/web/blog que visitaba (ese tipo de post que suelen ser del tipo "top 5 lenguajes que aprender primero" ) tenia una opinión completamente diferente acerca de cual debe ser el primer lenguaje de programación que debería aprender.

Algunos optan por comenzar aprendiendo C, debido (según dicen) porque muchos otros lenguajes nacen a partir de este (es como el papa de los demás lenguajes). Otros animan a comenzar por el lenguaje que te dé la gana (estos no tenían ganas de escribir parece ser). Y por último, Java, parece ser que java funciona en casi cualquier dispositivo y es una muy buena forma de comenzar a programar.

Como no tengo criterio como para debatir sobre cual es mejor o peor, pues comenzaré por java y ya si eso luego haré un post recomendando a los novatos como yo los que crea conveniente.


Welcome Java!


Presentación formal (o casi)

Bueno, en primer lugar, hola... ¿Que tal?, me alegro de que estés bien. Yo ahora mismo no podría decir lo mismo (lamentablemente) puesto que me veo envuelto en una misión casi imposible. Como podrás suponer por el título del blog, la idea principal es de aprender programación. Bueno, quizás no te quede aun claro, lo repito por si acaso, APRENDER PROGRAMACIÓN. Mi madre, yo que soy muy brutito para estas cosas me veo metido en este asunto por culpa de... bueno, en fin, no viene al caso.

Objetivos:

1) Aprender programación (si, eso que algunos sujetos raros hace con los ordenadores (computadoras) para crear esas cosas tan chulas que luego descargamos gratis de cualquier página de mala muerte)

2) No morir en el intento.

Dificultades:

1) NO TENGO NI IDEA DE PROGRAMACIÓN (Salvo alguna que otra cosa muy intuitiva)
2) Me aburro si no entiendo una cosa a la primera (si, ya, es un defecto de fábrica).
3) Se me da fatal escribir blogs (Como ya lo habrás notado).
4) No dispongo de todo el tiempo del mundo mundial. (Una carrera universitaria, deporte, pareja y ese tipo de cosas).
5) Mis papas no me pagaron la escuela de idiomas (por lo que yo y el ingles tenemos una relación sentimental bastante complicada, pero poco a poco nos vamos entendiendo).

Conclution:
Well, as you can see, I have a lot of problems with this quest, but I have to do this, I have no choice. I just hope you to go with me (giving me a hand if I need it) and trying together make this dream a reality.
Thanks for read and hope you like it.