Showing posts with label Programación Orientada a Objetos. Show all posts
Showing posts with label Programación Orientada a Objetos. Show all posts

Saturday, March 3, 2012

Sistemas Distribuidos

Los sistemas distribuidos son los sistemas que están conectados por medio de una red y su objetivo principal es tener un mayor numero de usuarios utilizando la red y que estos puedan acceder desde diferentes sitios.

Caracteristicas
  • Concurrencia: Permite que una gran cantidad de usuarios puedan utilizar al mismo tiempo el sistema disponible en la red sin tener problemas y con la misma velocidad.
  • Compatibilidad: El sistema tiene que ser compatible para todos los usuarios que lo manejen.
  • Fallos independientes de los componentes: Los componentes del sistema son independientes unos de otros, por lo que si uno llega a fallar, el resto de los componentes puede continuar con sus acciones determinadas para poder seguir trabajando.
  • Ejemplo de sistema distribuido
 En mi opinion, el programa con el que estuve trabajando en estos dias si podria ser un sistema distribuido ya que es una herramienta de entretenimiento que puede tener interes por medio de los usuarios.
Para hacer mi programa formar parte de un sistema distribuido podria subir la aplicacion a internet para que los usuarios puedan utilizar el piano en linea y producir diferentes canciones. Despues podria implementarse la opcion de grabar las canciones y almacenarlas para que sea mas atractivo y economico para el usuario hacer musica.

 Referencias:
Imagen
Sistemas distribuidos
Computacion distribuida

Documentación Técnica

La Documentación Técnica es muy útil para saber manejar de una manera adecuada cualquier programa que se nos proporcione, optimizar los resultados y disminuir el tiempo de aprendizaje del programa.
Ademas, sirve para conocer completamente todas las funciones del programa y sacar máximo provecho de este. 
La documentación explica también las características técnicas de un programa, así como los requerimientos y las necesidades para poder utilizar el programa de la manera mas adecuada y que su utilización sea la mejor posible.

Para la persona que creo el programa es muy fácil crear la documentación ya que conoce perfectamente el programa, sus características, requerimientos, entre otras cosas.

Para crear la documentacion tecnica de mi programa utilice un programa llamado Doxygen. 
Despues de haber proporcionado al programa los datos principales dentro de mi codigo se genero el html de documentacion.
 
A continuacion les mostrare algunas capturas de pantalla del html generado por Doxygen




  




Eventos, Excepciones y Errores

Un evento es un suceso que forma parte importante del programa y que lo define como tal. A continuacion les mostrare la tabla con los eventos de mi programa


En la tabla se muestran los diferentes graficos del programa con las acciones que realizan y una descripcion del tipo de evento

En la siguiente tabla mostrare las excepciones o errores que puede tener el programa en caso de que no se ejecuten sus funciones de manera correcta.


Para codificar seria muy sencillo no realizar ninguna accion al momento de presionar una tecla que no esta incluida en el teclado. Podemos decir que al momento de presionar una tecla existente emita el sonido, pero que al momento que no exista la tecla en el teclado simplemente terminar con la funcion ( cerrarlo }) y que no realize ninguna accion, para que de esta manera el usuario vea cuales son las que si emiten sonido y cuales no.


Otra forma de lidiar con este error sería utilizar una pantalla de error al momento de presionar una tecla.
El codigo quedaría se podria aplicar dentro del switch despues de cada caso de las teclas que si se utilizan.


default:
system.err.println("Error: Tecla no reconocida. Intente Nuevamente");
break;



Interfaz Gráfica

Aqui les mostrare un poco de la interfaz grafica que tengo planeada para mi proyecto.
Esta muy basica ya que el diseño fue realizado en paint, un programa que no tiene muchas herramientas de diseño. Mi idea es mejorarlo al momento de hacerlo en la interfaz verdadera de mi programa.

Asi se veria la interfaz principal del programa


Como pueden observar, en la esquina inferior derecha hay un boton que da la opcion de ver partituras para tocar algunas melodias comunes.
Al momento de presionar ese boton se abriria una ventana con las partituras. Las partituras van a mostrar las teclas asociadas con el teclado del telefono que se tienen que presionar para escuchar el sonido. En pocas palabras, son las teclas que tiene que presionar el usuario en su telefono


El diseño de las interfaces ira mejorando poco a poco


A continuacion les mostrare un poco de codigo de lo que llevo hasta ahorita de la interfaz grafica:


import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.applet.Applet;

//Rectangulo
public class Rectangulo extends Frame {
    Stroke drawingStroke = new BasicStroke(2); 
    Rectangle2D rect = new Rectangle2D.Double(30, 35, 10, 40);

    public void paint(Graphics g) {
        Graphics2D g1 = (Graphics2D)g;
        g1.setStroke(drawingStroke);
        g1.draw(rect);
        g1.setPaint(Color.white);
        g1.fill(rect);
        }
    public static void main(String args[]) {
        Frame frame = new Rectangulo();
        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we){
                System.exit(0);
            }
        });
        frame.setSize(300,200);
        frame.setVisible(true);
        frame.setBackground(Color.black);
    }
    //key listener

    public class Keylistener extends Applet{

    public void keyPressed(KeyEvent e)
    {
    }
    public void actionPerformed(ActionEvent e)
    {
    }
}
}



Diagrama de secuencia

Un diagrama de secuencia es el diagrama que muestra las interacciones entre las clases u objetos definidos en un programa. 
A continuacion les mostrare un ejemplo de diagramas de secuencia de mi proyecto.

Para la siguiente demostracion utilizare la funcion que sirve para reproducir un sonido al momento de presionar una tecla


Primeramente al momento de presionar una tecla el Piano la ubica. Despues le pide que se reproduzca y dicha tecla reproduce el sonido deseado.


En mi segundo diagrama se puede ver la funcion que sirve para mostrar la partitura que el usuario desee tocar en el piano.
Primeramente el piano debe pedirle a la partitura que se muestre y despues de que la partitura recibio esa orden se va a mostrar en el piano.


Para este diagrama se muestra como la tecla se va a sombrear de un color al momento de estar presionada. Primeramente el piano debe ubicar cual es la tecla que esta presionada y pedirle que se sombree. Al momento de recibir la orden de sombrearse la tecla se sombreara en el piano.

REFERENCIAS

Herencia y polimorfismo


Herencia
Una herencia es el mecanismo que nos permite compartir características(metodos y atributos) similares entre las clases. Es donde una clase padre hereda características a la clase hija (pueden ser todas o algunas).
Existen dos tipos de herencias: La herencia simple y la herencia multiple.
  • La herencia simple puede tener solo una clase padre
  • La herencia multiple puede tener varias clases padres
Aqui les muestro un ejemplo de codigo de herencia que obtuve de internet
class Persona
 {
    private:
      char * nif;
      int  edad;
      char * nombre, *apellidos;
   public:
      Persona(char * , int = 0,  char *, char * );
      Persona & operator=( Persona &);
      ~Persona();               // Destructor
      void medad(int);
      void mnombre(char *);
      char * mnombre() ;
void mostrar() ;
char * nombreCompleto() ;
void felizCumple();            // El día del cumpleaños
void leer();      // Lectura de los datos de la persona
};

Class  Alumno : public Persona
    {
    private:
      int  curso;
   public:
      Alumno(char * , int = 0,  char *, char * , int );
      Alumno& operator=( Alumno &);
      ~Alumno ();                                // Destructor
      int mcurso ();
void mcurso (int );
};

Para mi programa no utilizare herencia ya que la clase principal no heredara ningun atributo o método con las otras clases. Las clases son completamente diferentes y no se podrían definir como clases hijas. 
Tecla NO es un tipo de Piano
Partitura NO es un tipo de Piano
Por lo que en este programa no se puede utilizar herencia

Polimorfismo
Polimorfismo es la capacidad que tienen las clases para que una serie de clases derivadas utilicen el mismo método para realizar una función especifica
Existen dos tipos de polimorfismo:
  • Polimorfismo Dinámico: En esta forma de polimorfismo no es especifica el tipo de datos con el que se trabaja
  • Polimorfismo Estático: Es en el que tienen que ser declarados especificamente los tipos de datos que se van a utilizar.
Aqui les muestro un ejemplo de codigo de polimorfismo que encontre en internet


public abstract class figura {
protected String nombre; 
protected int color; 
protected int grosorBorde; 

public String getNombre(){ 
return this.nombre; 
public void setNombre(String n){ 
this.nombre=n; 
public int getColor(){ 
return this.color; 
public void setColor(int c){ 
this.color=c; 
public int getGrosorBorde(){ 
return this.grosorBorde; 
public void setGrosorBorde(int g){ 
this.grosorBorde=g; 
public abstract void dibujar(); 
}


Para la ejecucion de mi programa tampoco utilizare polimorfismo ya que ninguna de las clases comparten metodos similares.

Referencias

Patrones de diseño

Los patrones de diseño ayudan a optimizar el uso de la interfaz grafica y a solucionar posibles problemas que pueden ocurrir con estos patrones.

Los patrones de diseño tienen ciertas caracteristicas: 
  • Efectividad: Tiene que estar comprobada la efectividad del patron para que se pueda utilizar
  • Reutilizable: El patrón tiene que estar programado para ayudar a que se pueda utilizar varias veces. 
Ejemplos de patrones de diseño:

Patrones creacionales

  • Object Pool
  • Abstract Factory
  • Builder
  • Factory Method
  • Prototype
  • Singleton

Patrones estructurales

  • Adapter
  • Bridge (Puente)
  • Composite (Objeto compuesto)
  • Decorator (Envoltorio)
  • Facade (Fachada)
  • Flyweight (Peso ligero)
  • Proxy
Uno de los patrones que me llamo mas la atencion fue el patron Memento. Este programa se utiliza para la funcion "Undo" o "Deshacer" la cual es muy utilizada.

Otro patron de diseño que me llamo mucho la atención y podría usar para mi programa es el patron Prototype.
Este patron permite crear clones de objetos ya existentes un numero determinado de veces. 

Codigo ejemplo:

/**
 * Prototype Class
 */
abstract class PrototypeFactory implements Cloneable {
    public Object clone() throws CloneNotSupportedException {
        // call Object.clone()
        PrototypeFactory copy = (PrototypeFactory) super.clone();
        //In an actual implementation of this pattern you might now change references to
        //the expensive to produce parts from the copies that are held inside the prototype.
        return copy;
    }
 
    abstract void prototypeFactory(int x);
 
    abstract void printValue();
}
 
/**
 * Concrete Prototypes to clone
 */
class PrototypeImpl extends PrototypeFactory {
    int x;
 
    public PrototypeImpl(int x) {
        this.x = x;
    }
 
    @Override
    void prototypeFactory(int x) {
        this.x = x;
    }
 
    @Override
    public void printValue() {
        System.out.println("Value :" + x);
    }
}


REFERENCIAS
PATRONES DE DISEÑO

Documentación Técnica

La Documentación Técnica es muy útil para saber manejar de una manera adecuada cualquier programa que se nos proporcione, optimizar los resultados y disminuir el tiempo de aprendizaje del programa.
Ademas, sirve para conocer completamente todas las funciones del programa y sacar máximo provecho de este. 
La documentación explica también las características tecnicas de un programa, así como los requerimientos y las necesidades para poder utilizar el programa de la manera mas adecuada y que su utilización sea la mejor posible.

Para la persona que creo el programa es muy fácil crear la documentación ya que conoce perfectamente el programa, sus características, requerimientos, entre otras cosas. 

Diagrama de clases

Bueno aqui les incluyo el diagrama de clases de mi proyecto.



Proyecto (Clases, atributos y métodos)

Aquí les presento un avance de mi proyecto.
En este avance mostrare las clases, atributos y métodos que utilizare para realizar mi programa y que funcione correctamente.

La clase mas importante de mi proyecto seria Tecla.
Decidí asignar una clase por cada una de las teclas del piano por que cada una tendrá un sonido y una asignación diferente. La idea es que al presionar la tecla esta emita un sonido y se sombree, por lo que tiene que tener un estado (Presionado o no) y una ubicación (0,1,2,3,4,5) para saber donde esta esa tecla. También es importante asignarle una tecla asociada con el teclado que se utilizara (0q,1w,2e,3r,4t,5y...)

  • Clase: Teclas
  • Atributos: Sonido, Tecla asociada, Estado (Presionado), Ubicación
  • Método: Reproducir sonido, Sombrearse


La segunda clase que utilizare para mi proyecto sera una de Partitura.
En esta clase se presentara la opción de mostrar una partitura con diferentes letras de canciones para que el usuario sea capaz de tocar alguna utilizando las teclas y las teclas asociadas del teclado del teléfono.

  • Clase: Partitura
  • Atributos: Nombre, Titulo, Dificultad, Secuencia
  • Método: Imprimir, Mostrar imagen, Volver
Tenia pensado hacer una clase grande llamada Piano que englobara estas dos clases pero esta mas bien seria parte de la interfaz gráfica, ya que el programa no tendrá otras funciones ademas de las teclas y las partituras.

Conforme vaya pasando el tiempo les iré mostrando mis avances del proyecto.

Casos de uso (proyecto)

En esta entrada describiré algunos de los casos de uso para mi proyecto final.

Descripción:

El programa consistirá en un pequeño piano que reproducirá sonidos con la ayuda de las teclas del teléfono. Cada tecla tendrá un sonido diferente. Se pueden crear diferentes canciones. Las teclas que estén presionadas aparecerán en la pantalla sombreada. Habrá también un área que contendrá partituras para que al usuario le sea mas fácil ver y tocar canciones. Dichas partituras contienen las teclas asociadas del teclado del teléfono para poder tocar una canción conocida. Las partituras tendrán diferente nivel de dificultad. 

Casos de uso:
  • Presionar tecla: El actor podra presionar una tecla del telefono y al mismo tiempo ver que una tecla de la pantalla se sombrea.
  • Escuchar sonido: El usuario sera capaz de escuchar un sonido diferente por cada tecla que presione
  • Ver partituras: El usuario podra ayudarse de partituras para crear sonidos o canciones ya existentes
  • Seleccionar nivel para la partitura: El actor podra seleccionar el nivel de dificultad de la partitura dependiendo de las habilidades que posea.
  • Volver a la pantalla principal: Siempre que el usuario abra otra ventana tendra la opcion de volver a la pantalla principal. 
Ahora les mostrare el diagrama de casos de uso


Interfaz


Una interfaz es una clase completamente abstracta (una clase sin implementación).

Caracteristicas

  • Sólo declaran comportamiento 
  • Se utiliza la palabra clave interface 
  • Por defecto todos sus métodos son públicos y abstractos 
  • No implementan el comportamiento 
  • Por defecto todos sus atributos son públicos, constantes y de clase 
  • Por legibilidad normalmente los declaramos static y final 
  • Permite simular algunos aspectos de la herencia múltiple 
  • Define un tipo de datos 
  • Posibilita el enlace dinámico 
  • Otras clases pueden implementar un interfaz 
  • Cualquier clase que implemente un interfaz debe definir todos los métodos de dicho interfaz 
  • Debe proporcionar la implementación de dichos métodos 
  • Si la clase no proporciona la implementación para todos los métodos del interfaz debe ser declarada como abstract 

Sintaxis

interface NombreInterfaz {
tipo static final NOMBRECONSTANTE1 = valor;
…….….….
public tipoDevuelto nombreMetodo1(listaParámetros);
…….….….
}
class NombreClase implements NombreInterfaz1
[, NombreInterfaz2 ..] {
// declaración atributos y métodos de la clase
…….….….


A continuacion les presentare un ejemplo de codigo de interfaz

public interface Nombrable {
static final boolean CIERTO = true;
public void mostrarNombre();
}
public class Elemento implements Nombrable {
String nombre;
public Elemento(String nom) {
nombre = nom; }
// obligatorio implementar método mostrarNombre
public void mostrarNombre(){
System.out.println("Nombre: "+nombre);
if (CIERTO)
System.out.println("Constante CIERTO ");
}}clases abstractas e Interfaces 15

Referencias
Interfaz


Herencias

Una herencia es una de las principales características de los lenguajes orientados a objetos. Es un mecanismo que permite compartir características entre las clases padre y las clases hijos para extender funcionalidades. 
Existen dos tipos de herencias:

Herencia simple: Este tipo de herencia solo puede tener una sola clase padre. (Java)
Herencia multiple: Esta herencia sucede cuando la clase hijo puede obtener características de varias clases padres. (C++)

En esta actividad la profesora nos pidió que identificáramos herencias en clases de dos programas.
Los programas fueron los siguientes:

  • Buscaminas
Este programa consiste en un juego en el que el usuario tiene que obtener la mayor cantidad de puntos posibles sin tocar las bombas ubicadas en las casillas del juego 

Clases padres:
Casilla, Tablero, Timer, Juego, Jugador, Historial.

Clases hijas:
Tablero: Principiante, Intermedio, Avanzado
Juego: Principiante, Intermedio, Experto

  • SIASE (Sistema Integral para la Administración de los Servicios Educativos)
El Siase es una plataforma educativa utilizada por la Universidad Autonoma de Nuevo Leon para controlar el registro de alumnos y maestros, calificaciones, horarios, kardex, entre otras muchas funciones que realiza este sistema.


Clases padres: Usuario, Inscripción, Horario, Calificación, Encuesta, Kardex, Pago, Beca, Grupo

Clases Hijas: 
Usuario: Estudiante, Administrador, Maestro
Inscripcion: Clase ordinaria, Laboratorio
Encuesta: Verano, Beca
Pago: Cuota Interna, Cuota Externa
Beca: Deportiva, Bajos Recursos, Académica

A continuacion les comparto el codigo de un programa que encontre en internet que utiliza herencias.

class punto
{
protected
int x, y ;
public c:
punto (int mx, int my);
int dax ();
int day ();
};
class pixel: public punto
{
protected
booleano visible
public
pixel (int mx, int my);
void mostrar ();
void ocultar ();
booleano es_visible ();
void mover_hacia (int nueva x, int nueva y);
};



Referencias

Casos de uso

Los casos de uso son una técnica para especificar el comportamiento de un programa. 
Todo software ofrece a sus usuarios una serie de instrucciones a los servicios y acciones que realiza el programa para poder utilizarlo de una mejor manera.
Un caso de uso es una secuencia de interacciones entre un sistema y alguien o algo que usa alguno de sus servicios.

Para esta actividad se nos pidió identificar los diferentes casos de uso de un popular juego llamado Buscaminas.

Descripción:
El Buscaminas es un juego que consiste en que el jugador busca obtener el mayor puntaje posible sin tocar las casillas de las bombas ubicadas en el juego. 


Actor: El usuario puede seleccionar la casilla de su interés, cambiar la dificultad y la apariencia, marcar casillas, reiniciar el juego, ver estadisticas de los jugadores anteriores o entrar a la sección de ayuda para solucionar dudas que tenga sobre el juego.

A continuación se hará una breve descripción de algunos casos de uso mencionados anteriormente.

Dificultad: Cada jugador puede elegir la dificultad que desee: Principiante, Intermedio o Avanzado, según sus habilidades y destreza en el juego. 
Apariencia: El usuario puede cambiar el color de las casillas a verde o azul según su gusto.
Reiniciar: Si el usuario ya no quiere jugar esa partida puede reiniciarla o bien comenzar una nueva.
Ver estadísticas: El jugador puede ver estadísticas sobre los juegos anteriores, así como los mayores puntajes obtenidos en el juego.
Marcar casillas: El usuario puede marcar las casillas que desee y buscar las que tengan números para sumar los puntos. 

Referencias



Clases, atributos y métodos


Para poder realizar esta actividad fue necesario identificar las clases, atributos y metodos de uno de los programas que nos proporciono la maestra. Fue una tarea algo dificil al principio pero despues de la explicacion fue mas facil identificar cada uno y diferenciarlos. 

Itunes



Itunes es un reproductor desarrollado por Apple. Es muy completo y funciona para reproducir, descargar y comprar musica, aplicaciones, escuchar radio, entre otras funciones que ofrece. 

Clase: Musica (Reproduccion)
Atributo: Genero, Titulo, Nombre
Metodo: Reproducir, Descargar, Mover, Cambiar nombre

Clase: Videos
Atributo: Duracion, Nombre, Tamaño
Método: Reproducir, Descargar, Comprar 





Crisis de Software


La crisis del software es un termino que se refiere a la dificultad para desarrollar programas eficaces y comprensibles. Las causas son, entre otras, la complejidad que supone la tarea de programar, y los cambios a los que se tiene que ver sometido un programa para ser continuamente adaptado a las necesidades de los usuarios, ademas de la falta de algoritmos y soluciones adecuadas para los problemas proporcionados por los usuarios o clientes.

El término “Crisis del Software” fue utilizado a principios de los años 70, cuando la ingeniería de software era prácticamente inexistente. 

Englobó a una serie de sucesos que se venían observando en los proyectos de desarrollo de software:
  • Los proyectos no terminaban en plazo. 
  • Los proyectos no se ajustaban al presupuesto inicial. 
  • Baja calidad del software generado. Software que no cumplía las especificaciones.
  • Código inmantenible que dificultaba la gestión y evolución del proyecto. 

Aunque se han propuesto diversas metodologías para intentar subsanar los problemas mencionados, lo cierto es que todavía hoy no existe ningún método que haya permitido estimar de manera fiable el coste y duración de un proyecto antes de su comienzo.