http://jcesar9287.blogspot.com/2011/11/antipatrones-de-diseno.html
http://jcesar9287.blogspot.com/2011/11/eventos-errores-y-excepciones.html
http://jcesar9287.blogspot.com/2011/10/heuristicas-de-diseno.html
http://jcesar9287.blogspot.com/2011/11/herencia.html
http://jcesar9287.blogspot.com/2011/11/biblioteca.html
http://jcesar9287.blogspot.com/2011/09/retroalimentacion-en-pares_27.html
http://jcesar9287.blogspot.com/2011/08/metodologias-de-analisis-y-diseno-de.html
http://jcesar9287.blogspot.com/2011/08/diagramas-casos-de-uso-y-clases.html
http://jcesar9287.blogspot.com/2011/08/crisis-del-software.html
miércoles, 23 de noviembre de 2011
Antipatrones de diseño
Un anti patrón de diseño es un “estándar”, si se puede decir así, de diseñar las cosas mal en un software determinado. El resultado será un código totalmente des-optimizado y con una posibilidad casi nula de adaptarlo a otro Proyecto.
Existen muy diversos y variados anti patrones de diseño, los dos que les hablaremos corresponden al diseño orientado a objetos.
God Object
Este anti patrón de diseño tiene se crea por la mala estrategia del Diseñador, en un lenguaje Orientado a Objetos se tiene la ventaja de dividir un problema en partes más pequeñas, lo que se hace con este patrón es todo lo contrario.
El programador termina creando un objeto que se encarga de crear otros objetos, controlar su comportamiento y determinar la manera de representarlos, tal como si fuera Dios Todo Poderoso.
Este objeto contiene todos los métodos, y atributos de los demás, y determina como utilizarlos, vendría siendo como un Main de la programación estructurada, pero en forma de Objeto.
Singletonitis
Este anti patrón de diseño se crea al utilizar demasiado el patrón de singleton, esto quiere decir al momento de programar en diseño orientado a objetos, nosotros solo terminamos empleando una instancia para así evitar crear más objetos, sin embargo abusamos utilizándolo demasiado aun cuando esto no es necesario.
Referencias:
Elaborado junto a mi compañero Sergio Rdz
Eventos, Errores y Excepciones
Buscaminas
Eventos:
Errores y excepciones:
Elaborado con mi compañero Sergio Rdz
Componente Generador
|
Tipo de Evento
|
Acción que dispara
|
Botón Grafico:
“Iniciar”
|
Presionar y soltar
|
Inicia la creación del tablero, de los indicadores de mina y de las minas en sí, todas estas escondidas en casillas
|
Botón Grafico:
“Casilla”
|
Presionar y soltar
|
Destapa la casilla seleccionada, esta revelara un indicador de mina, una casilla vacía o una mina.
|
Botón Grafico:
“Casilla - Bandera”
|
Presionar y soltar
(Clic secundario)
|
Cubre la casilla con una Bandera indicadora, esta sirve para que el jugador se auto prevenga de destapar dicha casilla.
|
Menú Opción
“Juego”
|
Presionar
|
Despliegas las opciones para poder reiniciar el juego, salir y modificar opciones
|
Menú Opción
“Ayuda”
|
Presionar
|
Muestra una pequeña introducción para aprender a jugar al buscaminas.
|
Botón Grafico Menú
“Salir”
|
Presionar
|
Termina el juego actual.
|
Botón Grafico menú
“Reiniciar”
|
Presionar
|
Termina el juago actual, y comienza uno nuevo con la configuración actual.
|
Errores y excepciones:
Modo en que se genera
|
Manejo
|
Eliminación de archivos de configuración.
|
Despliegue de un mensaje de error en el que se detalle el archivo faltante y se muestre una posible solución para el usuario.
|
Eliminación de archivos de puntuaciones.
|
Despliegue de mensaje de error de archivo de puntuaciones faltantes, y cargar una copia de respaldo de este mismo, con puntuaciones anteriores.
|
Imágenes Faltantes.
|
Mensaje en el que se indique al usuario que las Imágenes no fueron cargadas correctamente y se pida reiniciar el juego.
|
Error Inesperado.
|
Mensaje en el que se indique al usuario que ocurrió un error inesperado, y darle la opción de levantar un reporte especificando el tipo de error.
|
Herencia
Herencia – SIASE
Alumno es un tipo de Usuario
Maestro es un tipo de Usuario
Cuota Interna es un tipo de pago
Herencia Buscaminas
Jugador fácil es un tipo de Jugador
Jugador Experto es un tipo de Jugador
Tablero Fácil es un tipo de Tablero
Biblioteca
Clases
|
Atributos
|
Métodos
|
Usuario
|
Nombre
Contraseña
Multas
|
Login
Logout
PedirLibro
Consultar
|
Libro
|
Estado
Consulta
Tiempo
|
MostraImagen
|
Herencia
- Usuario Licenciatura es un tipo de usuario
- Usuario Maestría es un tipo de usuario
- Usuario Doctorado es un tipo de usuario
- Usuario Maestro es un tipo de usuario
Sergio Rdz
Patrones de Diseño
Bebida Cafeinada
public abstract class BebidaCafeinada { public final void prepararReceta() { hervir(); poner(); servir(); agregarCondimentos(); System.out.println(); } public abstract void poner(); public abstract void agregarCondimentos(); public void hervir() { System.out.println("Hirviendo agua. "); } public void servir() { System.out.println("Sirviendo."); } }Té
public class Te extends BebidaCafeinada { public void poner() { System.out.println("Poniendo Té."); } public void agregarCondimentos() { System.out.println("Agregando limón."); } }Café
public class Cafe extends BebidaCafeinada { public void poner() { System.out.println("Poniendo café."); } public void agregarCondimentos() { System.out.println("Agregando Azucar y Leche."); } }Prueba Bebidas
public class PruebaBebidas { public static void main(String[] args) { Te te1 = new Te(); Cafe cafe1 = new Cafe(); System.out.println("Preparando té."); te1.prepararReceta(); System.out.println("Preparando Café."); cafe1.prepararReceta(); } }
Autogeneración de código juego
Para realizar la autogeneración de código utilice la herramienta de Umbrello
Atacable
Atacable
/** * Interface Atacable */ public interface Atacable { // // Fields // // // Methods // // // Accessor methods // // // Other methods // /** * @param a */ public void atacar( Atacable a ); /** * @param intensidad */ public void recibirAtaque( int intensidad ); }Capturable
/** * Interface Capturable */ public interface Capturable { // // Fields // // // Methods // // // Accessor methods // // // Other methods // /** */ public void capturar( ); /** */ public void liberar( ); } /** * Interface Capturable */ public interface Capturable { // // Fields // // // Methods // // // Accessor methods // // // Other methods // /** */ public void capturar( ); /** */ public void liberar( ); }Congelable
/** * Interface Congelable */ public interface Congelable { // // Fields // // // Methods // // // Accessor methods // // // Other methods // /** */ public void congelar( ); }Curable
/** * Interface Curable */ public interface Curable { // // Fields // // // Methods // // // Accessor methods // // // Other methods // /** * @return int */ public int curar( ); }Mago
import java.util.*; /** * Class Mago */ public class Mago extends Personaje { // // Fields // // // Constructors // public Mago () { }; // // Methods // // // Accessor methods // // // Other methods // /** * @param c */ public void lanzarHechizo( Congelable c ) { } /** * @param c */ public void curar( Curable c ) { } }Ogro
import java.util.*; /** * Class Ogro */ public class Ogro extends PersonajeAtacable implements Capturable, Congelable { // // Fields // private boolean congelado = false; // // Constructors // public Ogro () { }; // // Methods // // // Accessor methods // /** * Set the value of congelado * @param newVar the new value of congelado */ private void setCongelado ( boolean newVar ) { congelado = newVar; } /** * Get the value of congelado * @return the value of congelado */ private boolean getCongelado ( ) { return congelado; } // // Other methods // /** * @param c */ public void capturar( Capturable c ) { } /** */ public void capturar( ) { } /** */ public void liberar( ) { } /** */ public void congelar( ) { } }Personaje
/** * Class Personaje */ public class Personaje { // // Fields // private String nombre; // // Constructors // public Personaje () { }; // // Methods // // // Accessor methods // /** * Set the value of nombre * @param newVar the new value of nombre */ private void setNombre ( String newVar ) { nombre = newVar; } /** * Get the value of nombre * @return the value of nombre */ private String getNombre ( ) { return nombre; } // // Other methods // }Personaje Atacable
/** * Class PersonajeAtacable */ public class PersonajeAtacable extends Personaje implements Atacable { // // Fields // static private int DEFAULT_VIDA = 100; private int vida; // // Constructors // public PersonajeAtacable () { }; // // Methods // // // Accessor methods // /** * Get the value of DEFAULT_VIDA * @return the value of DEFAULT_VIDA */ private int getDEFAULT_VIDA ( ) { return DEFAULT_VIDA; } /** * Set the value of vida * @param newVar the new value of vida */ private void setVida ( int newVar ) { vida = newVar; } /** * Get the value of vida * @return the value of vida */ private int getVida ( ) { return vida; } // // Other methods // /** * @param cuanta */ public void restarVida( int cuanta ) { } /** * @param a */ public void atacar( Atacable a ) { } /** * @param intensidad */ public void recibirAtaque( int intensidad ) { } }Princesa
/** * Class Princesa */ public class Princesa extends Personaje implements Capturable { // // Fields // private String status = "libre"; // // Constructors // public Princesa () { }; // // Methods // // // Accessor methods // /** * Set the value of status * @param newVar the new value of status */ private void setStatus ( String newVar ) { status = newVar; } /** * Get the value of status * @return the value of status */ private String getStatus ( ) { return status; } // // Other methods // /** */ public void capturar( ) { } /** */ public void liberar( ) { } }Principe
import java.util.*; /** * Class Principe */ public class Principe extends PersonajeAtacable implements Curable { // // Fields // // // Constructors // public Principe () { }; // // Methods // // // Accessor methods // // // Other methods // /** * @return Mago */ public Mago invocarMago( ) { } /** * @param o */ public void atacar( Ogro o ) { } /** * @param c */ public void rescatar( Capturable c ) { } /** * @return int */ public int curar( ) { } }
Ejercicios SQL
Ejercicio A
Ejercicio B
Ejercicio C
SELECT City, CompanyName FROM customers WHERE City LIKE 'ber%'
Ejercicio B
SELECT CompanyName, ContactName FROM customers ORDER BY ContactName
Ejercicio C
SELECT COUNT(ContactName) FROM customers WHERE ContactName LIKE 'Ma%'
Ejercicio D
SELECT ContactName, City FROM customers WHERE ContactName LIKE 'g%' AND City LIKE 'b%'
Ejercicio A
SELECT Materias.Materia, Count(Calificaciones.Clave) FROM Materias, Calificaciones WHERE Materias.Clave = Calificaciones.Clave GROUP BY Materia
Ejercicio B
SELECT Materias.Materia, Calificaciones.Calificacion FROM Materias, Calificaciones WHERE Clave.Materias = Clave.Calificaciones HAVING Calificaciones > 76 ORDER BY Calificaciones
jueves, 3 de noviembre de 2011
Patrones de Diseño
El patrón de diseño aplicado a mi proyecto será el Modelo
Vista Controlador (MVC). Este modelo o arquitectura me será útil para poder
separar la parte gráfica, controlador y
el modelo. Este modelo será de gran ayuda para mantener en orden las
partes y por ejemplo no tener todo junto
la interfaz gráfica (GUI) con los eventos.
- Modelo: Aquí se implementa la lógica del movimiento de las piezas.
- Vista: Aquí se implementa la interfaz gráfica con la que actúa el usuario y además implementan los listeners.
- Controlador: Aquí se implementan los eventos de mi proyecto.
Eventos, Errores y Excepciones
Eventos
Errores y Excepciones
Componente gráfico generador
|
Tipo de evento
|
Acción que se dispara
|
Botón jugar
|
Ocurre al momento de presionarlo
|
Muestra la inicialización del juego
|
Opción menú juego
|
Ocurre al momento de presionarlo
|
Muestra las opciones de jugar y salir
|
Opción menú
ver
|
Ocurre al momento de presionarlo
|
Muestra la opción de ayuda
|
Opción menú jugar
|
Ocurre al momento de presionarlo
|
Muestra la inicialización del juego
|
Opción menú
salir
|
Ocurre al momento de presionarlo
|
Finaliza el juego
|
Opción menú ayuda
|
Ocurre al momento de presionarlo
|
Muestra información acerca del juego
|
Botones
tablero
|
Ocurre al momento de presionarlo
|
Cambia de posición la pieza
|
Errores y Excepciones
Modo en que se genera
|
Manejo
|
Al momento
que no puede cargar la imagen de fondo
|
Despliega un mensaje que la imagen no se encuentra
|
Al momento
que no se puede cargar la imagen de las piezas
|
Despliega un mensaje que la imagen no se encuentra
|
miércoles, 2 de noviembre de 2011
Interfaz Gráfica
Ventana principal que se compone de un menú, el cual se compone de dos opciones jugar y
ver, además se puede observar un botón para inicializar el juego
Ventana que se muestra al inicializar el juego
martes, 1 de noviembre de 2011
Evento, Errores y Excepciones
Eventos
public void agregarActionListener(ActionListener listener) { biniciar.addActionListener(listener); biniciar.setActionCommand("Jugar"); salir.addActionListener(listener); salir.setActionCommand("Salir"); jugar.addActionListener(listener); jugar.setActionCommand("jugar"); ver.addActionListener(listener); ver.setActionCommand("Ver"); }
public void actionPerformed(ActionEvent e) { vista = new Vista(); String evento = e.getActionCommand(); if(evento.equals("Jugar")) { vista.tablero(); } else if(evento.equals("Salir")){ System.exit(0); } else if(evento.equals("Ver")){ } }Errores y Excepciones
try{ ImageIcon ima = new ImageIcon("damas.png"); } catch(NullPointerException e){ System.out.println("No se pudó cargar la imagen"); }
Patrones de Diseño
Modelo Vista Controlador
Vista
Vista
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Vista{ private JFrame ventana; private JButton b1, b3; private JButton b2 [][] = new JButton [8][8]; private JPanel p1 = new JPanel(); private JPanel der,izq; private JPanel p2, p3,arr,aba; private JLabel l2; private JMenuBar barra; JMenu archivo, ayuda; JMenuItem jugar,salir,ver; Image img; public Vista(){ ventana = new JFrame (); ventana.setTitle("DAMAS"); menu(); ventanai(); ventana.setResizable(false); ventana.setSize(600,600); ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ventana.setVisible(true); } public void menu(){ barra = new JMenuBar(); archivo = new JMenu("Juego"); ayuda = new JMenu("Ayuda"); jugar = new JMenuItem("Jugar"); salir = new JMenuItem("Salir"); ver = new JMenuItem("Ver"); archivo.add(jugar); archivo.add(salir); ayuda.add(ver); barra.add(archivo); barra.add(ayuda); ventana.setJMenuBar(barra); } public void ventanai (){ p1 = new JPanel(); l2 = new JLabel(); ImageIcon ima = new ImageIcon("damas.jpg"); p1.setLayout(null); p1.setBackground(Color.WHITE); b1 = new JButton ("JUGAR"); b1.setBackground(Color.WHITE); b1.setBounds(250, 240, 100, 50); p1.add(l2); l2.setIcon(ima); l2.setSize(600,600); l2.setVisible(true); p1.add(b1); ventana.add(p1); ventana.pack(); p1.setVisible(true); } public void agregarActionListener(ActionListener listener) { b1.addActionListener(listener); b1.setActionCommand("JUGAR"); salir.addActionListener(listener); salir.setActionCommand("SALIR"); } public void tablero(){ p2 = new JPanel(); p2.setBackground(Color.WHITE); p2.setLayout ( new GridLayout(8,8)); for( int i = 0; i < 3; i++){ for( int j = 0; j < 8; j++){ if((i + j) % 2 != 0){ b2[i][j] = new JButton("", new ImageIcon("rojo.png")); b2[i][j].setBackground(Color.BLACK); } else { b2[i][j] = new JButton(""); b2[i][j].setBackground(Color.WHITE); } } } for( int i = 3; i <= 4; i++){ for( int j = 0; j < 8; j++){ if((i + j) % 2 != 0){ b2[i][j] = new JButton(""); b2[i][j].setBackground(Color.BLACK); } else { b2[i][j] = new JButton(""); b2[i][j].setBackground(Color.WHITE); } } } for( int i = 5; i < 8; i++){ for( int j = 0; j < 8; j++){ if((i + j) % 2 != 0){ b2[i][j] = new JButton("", new ImageIcon("azul.png")); b2[i][j].setBackground(Color.BLACK); } else { b2[i][j] = new JButton(""); b2[i][j].setBackground(Color.WHITE); } } } for( int i = 0; i < 8; i++){ for( int j = 0; j < 8; j++){ p2.add(b2[i][j]); } } ventana.add(p2); } }Controlador
import java.awt.event.*; public class Controlador implements ActionListener{ Vista vista; Modelo modelo; public Controlador(Vista vista, Modelo modelo){ this.vista = vista; this.modelo = modelo; vista.agregarActionListener(this); } public void actionPerformed(ActionEvent e) { vista = new Vista(); String evento = e.getActionCommand(); if(evento.equals("JUGAR")) { vista.tablero(); } else if(evento.equals("SALIR")){ System.exit(0); } } }Modelo
public class Modelo { public Modelo(){ } public void iniciar(){ } public void salir(){ } public void terminar(){ } }Main
public class Damas { public static void main (String[] args) { Vista vista1= new Vista(); Modelo modelo1 = new Modelo(); Controlador contr1 = new Controlador(vista1, modelo1); } }
Interfaz Gráfica
Ventana principal que se compone de un botón que nos permite inicializar el juego
Ventana que se muestra al inicializar el juego
Referencia
Imagen
jueves, 20 de octubre de 2011
jueves, 29 de septiembre de 2011
Autogeneración de código
Equipo
Tablero
Pieza
Reina
Comparando mi código con el código autogenerado, se puede apreciar que es practicamente igual, en lo único que varía es que el código autogenerado utiliza métodos set y get.
import java.util.*; /** * Class Equipo */ public class Equipo { // // Fields // private int cantidad; private int color; private String nombre; private boolean activo; // // Constructors // public Equipo () { }; // // Methods // // // Accessor methods // /** * Set the value of cantidad * @param newVar the new value of cantidad */ private void setCantidad ( int newVar ) { cantidad = newVar; } /** * Get the value of cantidad * @return the value of cantidad */ private int getCantidad ( ) { return cantidad; } /** * Set the value of color * @param newVar the new value of color */ private void setColor ( int newVar ) { color = newVar; } /** * Get the value of color * @return the value of color */ private int getColor ( ) { return color; } /** * Set the value of nombre * @param newVar the new value of nombre */ private void setNombre ( String newVar ) { nombre = newVar; } /** * Get the value of nombre * @return the value of nombre */ private String getNombre ( ) { return nombre; } /** * Set the value of activo * @param newVar the new value of activo */ private void setActivo ( boolean newVar ) { activo = newVar; } /** * Get the value of activo * @return the value of activo */ private boolean getActivo ( ) { return activo; } // // Other methods // /** */ public void generar( ) { } }
Tablero
import java.util.*; /** * Class Tablero */ abstract public class Tablero { // // Fields // private int tamaño; private int color; // // Constructors // public Tablero () { }; // // Methods // // // Accessor methods // /** * Set the value of tamaño * @param newVar the new value of tamaño */ private void setTamaño ( int newVar ) { tamaño = newVar; } /** * Get the value of tamaño * @return the value of tamaño */ private int getTamaño ( ) { return tamaño; } /** * Set the value of color * @param newVar the new value of color */ private void setColor ( int newVar ) { color = newVar; } /** * Get the value of color * @return the value of color */ private int getColor ( ) { return color; } // // Other methods // /** */ public void iniciar( ) { } /** */ public void empatar( ) { } /** */ public void salir( ) { } }
Pieza
import java.util.*; /** * Class Pieza */ public class Pieza { // // Fields // protected boolean activa; protected int posicion; // // Constructors // public Pieza () { }; // // Methods // // // Accessor methods // /** * Set the value of activa * @param newVar the new value of activa */ protected void setActiva ( boolean newVar ) { activa = newVar; } /** * Get the value of activa * @return the value of activa */ protected boolean getActiva ( ) { return activa; } /** * Set the value of posicion * @param newVar the new value of posicion */ protected void setPosicion ( int newVar ) { posicion = newVar; } /** * Get the value of posicion * @return the value of posicion */ protected int getPosicion ( ) { return posicion; } // // Other methods // /** */ public void mover( ) { } /** */ protected void capturar( ) { } }
Reina
/** * Class Reina */ public class Reina extends Pieza{ // // Fields // // // Constructors // public Reina () { }; // // Methods // // // Accessor methods // // // Other methods // /** */ public void mover( ) { } }
Comparando mi código con el código autogenerado, se puede apreciar que es practicamente igual, en lo único que varía es que el código autogenerado utiliza métodos set y get.
Suscribirse a:
Entradas (Atom)