miércoles, 18 de junio de 2008

Instalar fuentes de windows en OpenOffice

Hola, este articulo nos explica en pocos pasos la instalacion de fuentes de windows en Open Office, entre otras la Arial.

entonces, vamos a la consola y escribimos:

slack@slacktop:~$ apt-cache search msttcorefonts

Con este comando estamos buscando y listando de nuestro repositorio (source.list) el paquete de software msttcorefonts, el que contiene las fuentes mas tipicas del ventanukos windows, si todo va bien nos debiera desplegar un listado similar a este:

openoffice.org - OpenOffice.org Office suite
msttcorefonts - Installer for Microsoft TrueType core fonts
ttf-liberation - Free fonts with the same metrics as Times, Arial and Courier

En el cual identificamos a simple vista que se trata de paquetes de software para instalacion de fuentes microsoft.

Ahora instalamos msttcorefonts con apt-get install de la siguiente forma, y siempre por consola, en este caso como root (sudo).

slack@slacktop:~$ sudo apt-get install msttcorefonts
[sudo] password for slack:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se instalaron de forma automática los siguientes paquetes y ya no son necesarios.
libxalan110 libxerces27
Utilice «apt-get autoremove» para eliminarlos.
Se instalarán los siguientes paquetes extras:
cabextract
Se instalarán los siguientes paquetes NUEVOS:
cabextract msttcorefonts
0 actualizados, 2 se instalarán, 0 para eliminar y 0 no actualizados.
Necesito descargar 89,0kB de archivos.
Se utilizarán 389kB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]? S
Des:1 http://cl.archive.ubuntu.com hardy/universe cabextract 1.2-2 [53,9kB]
Des:2 http://cl.archive.ubuntu.com hardy/multiverse msttcorefonts 2.4 [35,1kB]
Descargados 89,0kB en 1s (46,3kB/s)
Preconfigurando paquetes ...
Seleccionando el paquete cabextract previamente no seleccionado.
(Leyendo la base de datos ...
134064 ficheros y directorios instalados actualmente.)
Desempaquetando cabextract (de .../cabextract_1.2-2_i386.deb) ...
Seleccionando el paquete msttcorefonts previamente no seleccionado.
Desempaquetando msttcorefonts (de .../msttcorefonts_2.4_all.deb) ...
Configurando cabextract (1.2-2) ...
Configurando msttcorefonts (2.4) ...

These fonts were provided by Microsoft "in the interest of cross-
platform compatibility". This is no longer the case, but they are
still available from third parties.

You are free to download these fonts and use them for your own use,
but you may not redistribute them in modified form, including changes
to the file name or packaging format.

--14:43:45-- http://surfnet.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `./andale32.exe'
Resolviendo surfnet.dl.sourceforge.net... 130.59.138.20
Conectando a surfnet.dl.sourceforge.net|130.59.138.20|:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Ubicación: http://prdownloads.sourceforge.net/corefonts/andale32.exe?download&failedmirror=surfnet.dl.sourceforge.net [siguiente]
--14:43:46-- http://prdownloads.sourceforge.net/corefonts/andale32.exe?download&failedmirror=surfnet.dl.sourceforge.net
=> `./andale32.exe?download&failedmirror=surfnet.dl.sourceforge.net'
Resolviendo prdownloads.sourceforge.net... 216.34.181.60
Conectando a prdownloads.sourceforge.net|216.34.181.60|:80... conectado.
Petición HTTP enviada, esperando respuesta... 302 Found
Ubicación: http://master.dl.sourceforge.net/sourceforge/corefonts/andale32.exe [siguiente]
--14:43:47-- http://master.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `./andale32.exe'
Resolviendo master.dl.sourceforge.net... 216.34.181.56
Conectando a master.dl.sourceforge.net|216.34.181.56|:80... conectado.
Petición HTTP enviada, esperando respuesta... 404 Not Found
14:43:47 ERROR 404: Not Found.

--14:43:47-- http://internap.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
=> `./andale32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 198,384 (194K) [application/octet-stream]

100%[=====================================================================================>] 198,384 58.08K/s ETA 00:00

14:43:51 (57.95 KB/s) - `./andale32.exe' guardado [198384/198384]

--14:43:51-- http://internap.dl.sourceforge.net/sourceforge/corefonts/arialb32.exe
=> `./arialb32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 168,176 (164K) [application/octet-stream]

100%[=====================================================================================>] 168,176 54.42K/s ETA 00:00

14:43:56 (54.29 KB/s) - `./arialb32.exe' guardado [168176/168176]

--14:43:56-- http://internap.dl.sourceforge.net/sourceforge/corefonts/arial32.exe
=> `./arial32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 554,208 (541K) [application/octet-stream]

100%[=====================================================================================>] 554,208 51.49K/s ETA 00:00

14:44:06 (55.71 KB/s) - `./arial32.exe' guardado [554208/554208]

--14:44:06-- http://internap.dl.sourceforge.net/sourceforge/corefonts/comic32.exe
=> `./comic32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 246,008 (240K) [application/octet-stream]

100%[=====================================================================================>] 246,008 59.69K/s ETA 00:00

14:44:10 (59.52 KB/s) - `./comic32.exe' guardado [246008/246008]

--14:44:10-- http://internap.dl.sourceforge.net/sourceforge/corefonts/courie32.exe
=> `./courie32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 646,368 (631K) [application/octet-stream]

100%[=====================================================================================>] 646,368 56.77K/s ETA 00:00

14:44:22 (55.15 KB/s) - `./courie32.exe' guardado [646368/646368]

--14:44:22-- http://internap.dl.sourceforge.net/sourceforge/corefonts/georgi32.exe
=> `./georgi32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 392,440 (383K) [application/octet-stream]

100%[=====================================================================================>] 392,440 54.83K/s ETA 00:00

14:44:30 (52.78 KB/s) - `./georgi32.exe' guardado [392440/392440]

--14:44:30-- http://internap.dl.sourceforge.net/sourceforge/corefonts/impact32.exe
=> `./impact32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 173,288 (169K) [application/octet-stream]

100%[=====================================================================================>] 173,288 50.91K/s ETA 00:00

14:44:34 (50.82 KB/s) - `./impact32.exe' guardado [173288/173288]

--14:44:34-- http://internap.dl.sourceforge.net/sourceforge/corefonts/times32.exe
=> `./times32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 661,728 (646K) [application/octet-stream]

100%[=====================================================================================>] 661,728 47.12K/s ETA 00:00

14:44:47 (53.53 KB/s) - `./times32.exe' guardado [661728/661728]

--14:44:47-- http://internap.dl.sourceforge.net/sourceforge/corefonts/trebuc32.exe
=> `./trebuc32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 357,200 (349K) [application/octet-stream]

100%[=====================================================================================>] 357,200 56.39K/s ETA 00:00

14:44:53 (59.04 KB/s) - `./trebuc32.exe' guardado [357200/357200]

--14:44:53-- http://internap.dl.sourceforge.net/sourceforge/corefonts/verdan32.exe
=> `./verdan32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 351,992 (344K) [application/octet-stream]

100%[=====================================================================================>] 351,992 60.51K/s ETA 00:00

14:45:00 (51.63 KB/s) - `./verdan32.exe' guardado [351992/351992]

--14:45:00-- http://internap.dl.sourceforge.net/sourceforge/corefonts/webdin32.exe
=> `./webdin32.exe'
Resolviendo internap.dl.sourceforge.net... 69.88.152.3
Conectando a internap.dl.sourceforge.net|69.88.152.3|:80... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 185,072 (181K) [application/octet-stream]

100%[=====================================================================================>] 185,072 53.97K/s ETA 00:00

14:45:04 (53.86 KB/s) - `./webdin32.exe' guardado [185072/185072]

Extracting cabinet: andale32.exe
extracting fontinst.inf
extracting andale.inf
extracting fontinst.exe
extracting AndaleMo.TTF
extracting ADVPACK.DLL
extracting W95INF32.DLL
extracting W95INF16.DLL

All done, no errors.
Extracting cabinet: arialb32.exe
extracting fontinst.exe
extracting fontinst.inf
extracting AriBlk.TTF

All done, no errors.
Extracting cabinet: arial32.exe
extracting FONTINST.EXE
extracting fontinst.inf
extracting Ariali.TTF
extracting Arialbd.TTF
extracting Arialbi.TTF
extracting Arial.TTF

All done, no errors.
Extracting cabinet: comic32.exe
extracting fontinst.inf
extracting Comicbd.TTF
extracting Comic.TTF
extracting fontinst.exe

All done, no errors.
Extracting cabinet: courie32.exe
extracting cour.ttf
extracting courbd.ttf
extracting courbi.ttf
extracting fontinst.inf
extracting couri.ttf
extracting fontinst.exe

All done, no errors.
Extracting cabinet: georgi32.exe
extracting fontinst.inf
extracting Georgiaz.TTF
extracting Georgiab.TTF
extracting Georgiai.TTF
extracting Georgia.TTF
extracting fontinst.exe

All done, no errors.
Extracting cabinet: impact32.exe
extracting fontinst.exe
extracting Impact.TTF
extracting fontinst.inf

All done, no errors.
Extracting cabinet: times32.exe
extracting fontinst.inf
extracting Times.TTF
extracting Timesbd.TTF
extracting Timesbi.TTF
extracting Timesi.TTF
extracting FONTINST.EXE

All done, no errors.
Extracting cabinet: trebuc32.exe
extracting FONTINST.EXE
extracting trebuc.ttf
extracting Trebucbd.ttf
extracting trebucbi.ttf
extracting trebucit.ttf
extracting fontinst.inf

All done, no errors.
Extracting cabinet: verdan32.exe
extracting fontinst.exe
extracting fontinst.inf
extracting Verdanab.TTF
extracting Verdanai.TTF
extracting Verdanaz.TTF
extracting Verdana.TTF

All done, no errors.
Extracting cabinet: webdin32.exe
extracting fontinst.exe
extracting Webdings.TTF
extracting fontinst.inf
extracting Licen.TXT

All done, no errors.
All fonts downloaded and installed.
Updating fontconfig cache for /usr/share/fonts/truetype/msttcorefonts
No CIDSupplement specified for Batang-Bold, defaulting to 0.
No CIDSupplement specified for Batang-Regular, defaulting to 0.
No CIDSupplement specified for UMingCN, defaulting to 0.
No CIDSupplement specified for KochiGothic-Regular-JaH, defaulting to 0.
No CIDSupplement specified for Dotum-Bold, defaulting to 0.
No CIDSupplement specified for KochiMincho-Regular, defaulting to 0.
No CIDSupplement specified for KochiGothic-Regular, defaulting to 0.
No CIDSupplement specified for KochiMincho-Regular-JaH, defaulting to 0.
No CIDSupplement specified for Dotum-Regular, defaulting to 0.

slack@slacktop:~$

Y listo, uta q amigable es linux ah... luego de esta configuracion tenemos las fuentes instaladas para OpenOffice.

Saludos y Suerte !!

Clases y Objetos

Hola, dentro de las clases y presentaciones que expongo donde trabajo, he planificado la preparacion de estos documentos con el objetivo de introducir a los oyentes al mundo Java, SOA, y UML.
Traspasandoles mi conocimiento para un mejor entendimiento de las tecnologìas que demanda la Industria.
Las presentaciones de UML y Java apuntan a eso. Ahora veremos un articulo sobre Clases y Objetos, tema presentado en esta planificacion.

Comencemos.

Programa Java
  • Un programa Java está formado por un conjunto de clases que interactúan entre sí
  • La clase es la unidad básica de programación
Clase
Implementación de un tipo de dato.
Una clase sirve tanto de módulo como de tipo
  • Tipo: Descripción de un conjunto de objetos (equipados con ciertas operaciones).
  • Módulo: Unidad de descomposición del software.
Objeto
Instancia de una clase:
Unidad que encapsula estado y comportamiento.
  • Un objeto puede caracterizar una entidad física (un teléfono, un interruptor, un cliente) o una entidad abstracta (un número, una fecha, una ecuación matemática).
  • Todos los objetos son instancias de una clase: Los objetos se crean por instanciación de las clases.
  • Todos los objetos de una misma clase (p.ej. coches) comparten ciertas características: sus atributos (tamaño, peso, color, potencia del motor...) y el comportamiento que exhiben (aceleran, frenan, curvan...).
Todo objeto tiene...
- Identidad (puede distinguirse de otros objetos)
- Estado (datos asociados a él)
- Comportamiento (puede hacer cosas)

Las diferentes instancias de cada clase difieren entre sí por los valores de los datos que encapsulan (sus atributos).
Dos objetos con los mismos valores en sus atributos pueden ser diferentes.
TODOS los objetos de una misma clase usan el mismo algoritmo como respuesta a mensajes similares.
El algoritmo empleado como respuesta a un mensaje (esto es, el método invocado) viene determinado por la clase del receptor.

Clase
Una clase es una descripción de un conjunto de objetos similares.
Al programar, definimos una clase para especificar cómo se comportan y mantienen su estado los objetos de esa clase.
A partir de la definición de la clase, se crean tantos objetos de esa clase como nos haga falta

Cada clase en Java:
• Se define en un fichero independiente con extensión .java.
• Se carga en memoria cuando se necesita.

La máquina virtual Java determina en cada momento las clases necesarias para la aplicación y las carga en memoria.

El programa puede ampliarse dinámicamente (sin tener que recompilar):

La aplicación no es un bloque monolítico de código.
Para definir una clase en Java se utiliza la palabra reservada class, seguida del nombre de la clase (un identificador):

public class MiClase { ... }

NOTA: Es necesario que indiquemos el modificador de acceso public para que podamos usar nuestra clase “desde el exterior”.

El nombre de una clase debe ser un identificador válido en Java.
Por convención, los identificadores que se les asignan a las clases en Java comienzan con mayúscula.
En Java, las clases públicas deben estar definidas en ficheros con extensión .java cuyo nombre coincida exactamente con el identificador asignado a la clase.

Errores comunes
Cuando el nombre de la clase no coincide con el nombre del fichero, el compilador nos da el siguiente error:

Public class MiClase must be defined in a file called MiClase.java

donde MiClase es el nombre de nuestra clase.
Las llaves siempre deben ir en parejas: Si falta la llave de cierre } el compilador da un error:

‘}’ expected Lo mismo ocurre si se nos olvida abrir la llave ({): ‘{’ expected


Encapsulación de datos (variables) y operaciones (métodos)

Objeto = Identidad + Estado + Comportamiento


Identidad
La identidad de un objeto lo identifica unívocamente:
- Es independiente de su estado.
- No cambia durante la vida del objeto.

Estado
El estado de un objeto viene dado por los valores de sus atributos.
- Cada atributo toma un valor en un dominio concreto.
- El estado de un objeto evoluciona con el tiempo
- Los atributos de un objeto no deberían ser manipulables
directamente por el resto de objetos del sistema (ocultamiento de
información):
o Se protegen los datos de accesos indebidos.
o Se distingue entre interfaz e implementación.
o Se facilita el mantenimiento del sistema.


Interfaz vs. implementación
Los objetos se comunican a través de interfaces bien definidas sin tener que conocer los detalles internos de implementación de los demás objetos.

Ejemplo: Un coche se puede conducir...
  • Sin saber exactamente de qué partes consta el motor ni cómo funciona éste (implementación).
  • Basta con saber manejar el volante, el acelerador y el freno (interfaz).

Comportamiento de Objetos

Los métodos que definen el comportamiento de un objeto:
- Agrupan las competencias del objeto (responsabilidades)
- Describen sus acciones y reacciones.

Las acciones realizadas por un objeto son consecuencia directa de un estímulo externo (un mensaje enviado desde otro objeto) y dependen del estado del objeto.
El interfaz de un objeto ha de establecer un contrato, un conjunto de condiciones precisas que gobiernan las relaciones entre una clase proveedora y sus clientes (diseño por contrato).

Estado y comportamiento están relacionados.

Ejemplo
Un avión no puede aterrizar (acción) si no está en vuelo (estado)

Representacion Grafica de Una Clase
Una clase se representa con un rectángulo dividido en tres partes:
- El nombre de la clase (identifica la clase de forma unívoca)
- Sus atributos (datos asociados a los objetos de la clase)
- Sus operaciones (comportamiento de los objetos de esa clase)

IMPORTANTE: Las clases se deben identificar con un nombre que, por lo general, pertenecerá al vocabulario utilizado habitualmente al hablar del problema que tratamos de resolver.
Declaración en Java de una clase.

public class Cuenta { ... }
Representación de una clase con sus atributos:

public class Cuenta
{
private double balance; // Saldo
private double limit; // Límite
...
}
public class Cuenta
{
private double balance = 0;
private double limit;
...
}

NOTA:
Aquí hemos decidido utilizar el tipo primitivo double para representar cantidades de dinero. En un programa en el que no se pudiesen permitir errores de redondeo en los cálculos, deberíamos utilizar otro tipo más adecuado (por ejemplo, BigDecimal).


Representación de las operaciones de una clase:

public class Cuenta
{
private double balance = 0;
private double limit;
public void ingresar (...) ...
public void retirar (...) ...
}

Los métodos implementan en Java las operaciones características de los objetos de una clase concreta.

public class Cuenta
{
private double balance = 0;
private double limit;
public void ingresar (double cantidad)
{
balance = balance + cantidad;
}
public void retirar (double cantidad)
{
balance = balance – cantidad;
}
}


Representación gráfica en UML:


Definición en Java:

Fichero Motocicleta.java

public class Motocicleta
{
// Atributos (variables de instancia)
private String matricula; // Placa de matrícula
private String color; // Color de la pintura
private int velocidad; // Velocidad actual (km/h)
private boolean en_marcha; // ¿moto arrancada?
// Operaciones (métodos)
public void arrancar ()
{ ... }
public void acelerar ()
{ ... }
public void frenar ()
{ ... }
public void girar (float angulo)
{ ... }
}



Uso de Objetos
El operador . (punto) en Java nos permite acceder a los distintos metodos de una clase:

objeto.metodo

Cuando tenemos un objeto de un tipo determinado y queremos acceder a uno de sus metodos sólo tenemos que poner el identificador asociado al objeto (esto es, el identificador de una de las variables de nuestro programa) seguido por un punto y por el identificador que hace referencia a un metodo concreto de la clase a la que pertenece el objeto.

¿Cómo se comprueba el estado de un objeto?
Accediendo a las variables de instancia del objeto

objeto.atributo

Por ejemplo, cuenta.balance nos permitiría acceder al valor numérico correspondiente al saldo de una cuenta, siempre y cuando cuenta fuese una instancia de la clase Cuenta.

¿Cómo se le envía un mensaje a un objeto?
Invocando a uno de sus métodos.

objeto.método(lista de parámetros)

La llamada al método hace que el objeto realice la tarea especificada en la implementación del método, tal como esté definida en la definición de la clase a la que pertenece el objeto.
Ejemplo

cuenta.ingresar(150.00);

Si cuenta es el identificador asociado a una variable de tipo Cuenta, se invoca al método ingresar definido en la clase Cuenta para depositar una cantidad de dinero en la cuenta.
La implementación del método ingresar se encarga de actualizar el saldo de la cuenta, sin que nosotros nos tengamos que preocupar de cómo se realiza esta operación.

Creacion de Objetos
Antes de poder usar un objeto hemos de crearlo...

El operador new nos permite crear objetos en Java.

Tipo identificador = new Tipo();

Si escribimos un programa como el siguiente:

public class Ingreso {
public static void main (String args[])
{
Cuenta cuenta; // Error
cuenta.ingresar(100.00);
}

}

El compilador nos da el siguiente error:
Ingreso.java:7:
variable cuenta might not have been initialized
cuenta.ingresar(100.00);
^
Hemos declarado una variable que, inicialmente, no tiene ningún valor.
Antes de utilizarla, deberíamos haberla inicializado (con un objeto del tipo adecuado):

Cuenta cuenta = new Cuenta();


Constructores
Cuando utilizamos el operador new acompañado del nombre de una clase, se crea un objeto del tipo especificado (una instancia de la clase cuyo nombre aparece al lado de new).
Al crear un objeto de una clase concreta, se invoca a un método especial de esa clase, denominado constructor, que es el que se encarga de inicializar el estado del objeto.

Constructor por defecto
Por defecto, Java crea automáticamente un constructor sin parámetros para cualquier clase que definamos.

public class Cuenta {
// Constante
public static final double LIMITE_NORMAL = 300.00;
// Variables de instancia

private double balance = 0;

private double limit = LIMITE_NORMAL;

// Métodos
...
}

Al crear un objeto de tipo Cuenta con new Cuenta(), se llama al constructor por defecto de la clase Cuenta, con lo cual se crea un objeto de tipo Cuenta cuyo estado inicial será el indicado en la inicialización de las variables de instancia balance y limit.


PrimerPrograma.java

/** * Este programa en Java imprime un saludo por pantalla. */
import java.*;


/* La clase principal se denomina PrimerPrograma */
public class PrimerPrograma {
public static void main(String args[ ]){
System.out.println("Hola Mundo ");
}
}

Herencia
Supongamos que tenemos una clase que nos define una persona.
Queremos las clases Alumno y Profesor.
Ambos son personas y seria perfecto no tener que volver a escribir (y pensar) todas las variables y funciones que ya hay en la clase Persona.



Ejemplo de Herencia


public class Persona {
protected int dni;
protected String nombre;
protected String direccion;
protected int telefono;
public int obtenerDni() {
return dni;
}
public void modificarDni(int dni) {
this.dni=dni;
}
public void mostrarPorPantalla() {
System.out.println("DNI: "+dni);
System.out.println("Nombre: "+nombre);
System.out.println("Direccion: "+direccion);
System.out.println("Telefono: "+telefono);
}
}


public class Alumno extends Persona {
protected int[ ] notas;
public void nuevaNota(int nota) {
// Añade una nueva nota
}
public void listadoNotas() {
System.out.println("Notas:");
for(int i=0;i
System.out.println(notas[i]);
}
}
public void mostrarPorPantalla() {
super.mostrarPorPantalla();
listadoNotas();
}
}

  • Java sólo tiene herencia simple. Esto es, una clase sólo puede heredar de una clase.
  • Además, si una clase no hacemos que herede de alguna otra clase, Java automáticamente hace que herede de la clase Object.

Bueno, eso seria por hoy.

Saludos y Suerte !!

miércoles, 11 de junio de 2008

Fundamentos de la Programación Orientada a Objetos

Hola, en este articulo explicare los fundamentos de la programación orientada a objetos. mas adelante seguire profundizando este tema.

Comenzamos,

Agenda

Introducción a la Programación Orientada por Objetos
Conceptos básicos
Abstracción
Herencia
Relaciones entre clases
Polimorfismo

Introducción a la Programación Orientada por Objetos

En la siguiente imagen vemos la evolución de los lenguajes de programación orientados a objetos, esto no es nuevo, sin embargop es hoy en día que este concepto o tecnología esta acaparando los desarrollos de software debido a la gran aceptacion, implementacion y popularidad que ha tenido Java en este ambito.


Conceptos básicos
  • OO provee objetos como el principal medio para abstraer y estructurar un sistema.
  • Un objeto puede modelar entidades del mundo real,puede capturar abstracciones de fenómenos complejos, puede representar artefactos de software (pilas, gráficos,...).

El contexto del problema se ve como
objetos que interactúan entre ellos


Ejemplo: Enviar Flores
  • Suponga que Juan desea llevarle flores a una amiga en otra ciudad, María.
  • Como Juan no puede llevarlas personalmente, le encarga a su florista preferida (Rosa) el envío.
  • María recibe sus flores

A continuación descomponemos el problema en la secuencia de los pasos para cumplir con el requerimiento.
  • Juan le solicita a Rosa un servicio
  • Rosa sabe cómo prestarle el servicio a Juan
  • Juan sabe que Rosa presta el servicio que el necesita
  • Rosa es responsable de prestarle el servicio adecuadamente a Juan
  • Juan desconoce qué le implica a Rosa prestarle el servicio

La imagen siguiente seria un diagrama conceptual, solamente para no entrar en mas detalle con los casos de uso, ya que ese tema lo hemos visto en otros articulos, y este trata de fundamentos de OO.


  • En programación orientada a objetos un programa es una comunidad de agentes (objetos) que interactuan entre ellos.
  • Cada objeto tiene un rol en la solución del problema
  • Cada objeto provee un conjunto de servicios (o métodos)
  • Los servicios de un objeto son usados por otros objetos.

La forma en que los objetos se comunican entre ellos es a través de mensajes:

  • Un mensaje encapsula la petición de un servicio
  • El receptor del mensaje presta el servicio y
  • Devuelve una respuesta al que solicitó el servicio

Donde: cambiarTamaño es un mensaje.

Modelar consiste en identificar (abstraer) qué objetos hay en el mundo del problema, cómo son, cómo se comportan y cómo se relacionan.


Objeto

Es una abstracción de un elemento del Contexto del Problema, tambien es una instancia de una clase.

Ejemplos:
  • Estudiante
  • Fecha
  • Automóvil
  • Libro
  • Vuelo
El comportamiento de los objetos puede ser descrito por una caracterización abstracta de su interfaz.

Por ejemplo:


  • La caracterización del comportamiento es suficiente para diseñar el sistema.
  • El comportamiento real del objeto puede ser implementado y refinado más tarde de acuerdo con las necesidades.
  • Un objeto empaqueta datos (una representación concreta) y procedimientos que operan sobre los datos.

La imagen anterior representa una clase, en ella podemos identificar: nombre de la clase (Libro), Datos/Atributos/Campos, y Métodos/Servicios/Interfaz

  • El envío de mensajes es la única forma para que un objeto realice una operación.
  • Las operaciones son la única forma para cambiar el estado de los datos.
  • Cuando esto se cumple, se dice que el estado interno del objeto (el valor de sus datos) está encapsulado; éste no puede ser manipulado directamente desde el exterior y su representación concreta es invisible.

Abstracción:

Mecanismo de la mente humana fundamental para la comprensión de fenómenos o situaciones que involucren una gran cantidad de detalles.
  • En biología los seres vivos se clasifican en especies, géneros, clases, etc...

Abstracción y encapsulamiento:

La abstracción se centra en el comportamiento observable de un objeto, el encapsulamiento se centra en la implementación que da lugar a ese comportamiento.


Clase

Describe un conjunto de objetos del Contexto del problema, que tienen las mismas características y el mismo comportamiento



La noción de Clase viene de clasificación: agrupar (en un conjunto) objetos (elementos) que se comportan de la misma manera (con respecto a la interfaz que describe el comportamiento).


Agregación/Composición

  • Permite abstraer relaciones de tipo ...tiene... y ... está compuesto de...



Asociaciones
  • Permite abstraer relaciones entre objetos diferentes a la composición



Herencia
  • Los objetos se organizan en jerarquías

La herencia permite modelar relaciones del tipo ...es... y clasificaciones:
  • Un mamífero es un vertebrado



Polimorfismo

Es la posibilidad de definir de forma distinta un método,dependiendo del objeto.







  • El polimorfismo es posible gracias a la herencia:



Resumen Principios
  • Todo es un objeto
  • Los objetos realizan operaciones (computan) solicitando serviciosentre ellos a través del paso de mensajes
  • Todo objeto tiene su propia memoria, la cual consiste de otros objetos
  • Todo objeto es una instancia de una clase. Una clase agrupa objetos similares.
  • En la clase se describe el comportamiento de los objetos.
  • Las clases están organizadas en una jerarquía con una única raíz, llamada la jerarquía de herencia.


Bueno, hemos aprendido un poco más de los fundamentos de la orientación a objetos, agradecere comentarios constructivos.

Saludos y Suerte !!

Ejemplo de Modelado con UML

Hola, veremos a continuación un sencillo ejemplo para implementar el modelado de requerimientos con UML, para esto tenemos los siguientes pasos:

• Descripción del problema
• Identificación de requisitos.
• Casos de uso.
• Conclusiones.


Comencemos,


Descripción del problema
  • Sokoban es un juego de varios niveles.
  • Cada nivel está compuesto por un jugador, cajas, repisas y muros.
  • El objetivo del jugador es empujar todas las cajas sobre las repisas.
  • Cuando esto sucede el jugador pasa al siguiente nivel.
  • Para mover una caja, el jugador debe colocarse al lado y empujarla. Si la casilla hacia la que está empujando la caja está libre la caja se moverá.
  • Si el jugador se queda bloqueado, es decir, no puede terminar el nivel, puede reiniciar el nivel perdiendo una vida.
  • Cuando el jugador pierde todas sus vidas la partida termina.


Identificación de requisitos

Una mini entrevista
¿Qué debe hacer el sistema (o tiene que tener) para implementar la descripción?

Requisitos:
• El sistema debe permitir comenzar una nueva partida y terminarla.
• El sistema debe permitir mover al jugador, a las cajas y reiniciar el nivel cuando
el usuario lo solicite.
• El sistema deberá almacenar varios niveles y cambiar de nivel cuando el usuario
complete el nivel actual.


Casos de uso

Los casos de uso son una respuesta,

¿Cómo puede un usuario jugar una partida de sokoban?

La primera pregunta que vamos a resolver:


¿cuántos actores tiene el sistema?

Un único actor:

  • ­ Persona humana que controla al jugador
  • ­ Su meta es jugar una partida de Sokoban

La segunda pregunta que vamos a resolver:

¿qué casos de uso necesitamos?



A continuación debemos completar la documentación de estos Casos de Uso, para esto existen las fichas de Casos de Uso, las que cumplen con el estandar de documentación de Casos de Uso:








Conclusiones

¿Cambiar de nivel es un caso de uso?
• No, porque sólo participa el sistema, no participa ningún actor externo.
• La única manera que un actor externo tiene de cambiar de nivel es mediante los movimientos (caso de uso 2)

¿Cargar un nivel es un caso de uso?
• No, porque sólo interviene el sistema.
• Además, cuando detallamos como cargar un nivel estamos detallando el sistema (queda fuera de la fase de requisitos).

¿Terminar la partida es un caso de uso?
• Como está redactado en el enunciado la respuesta es no.

¿Faltan casos de uso o están incompletos?
1. El sistema debe permitir comenzar una nueva partida y terminarla.

2. El sistema debe permitir mover al jugador y a las cajas y reiniciar el nivel cuando el usuario lo solicite.

3. El sistema deberá almacenar varios niveles y cambiar de nivel cuando el usuario complete el nivel actual

Los tres requisitos anteriores son los que definimos al principio, en la siguiente ficha vemos que los casos de uso cumplen con lo requerido.


Esta es una forma de comprobar que con los casos de uso definidos tenemos satisfechos los requerimientos.

Saludos y suerte !!