elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Mejor diseño para implementacion en Java.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mejor diseño para implementacion en Java.  (Leído 3,042 veces)
SDCC

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Mejor diseño para implementacion en Java.
« en: 17 Abril 2019, 07:42 am »

Hola a todos tengo un problema un tanto sencillo pero que no sè cual de mis ideas sea las mas adecuada.

El problema se reduce a una parte en donde debo tener 2 tipos de directorios.
  • Directorio Empresarial.Almacenada contactos empresariales
  • Directorio Personal.Almacena contactos personales

Practicamente ambos directorios deben realizar los mismos mètodos solo con la diferencia de el tipo de contacto que almacena y algunas consultas que se realizan dentro de los métodos..
Nota.Existe una superclase que es padrede "Contacto Empresarial" y "Contacto Personal" que lleva como nombre "Contacto"

Mi primera solución planteaba crear una interfaz "Directorio" como la siguiente(hacen falta definir un par de metodos).

Pero no sé si esta esta es la manera más correcta de hacerlo, es decir, los argumentos y retornos de los métodos ya estan definidos en la la interfaz lo cual en cierta manera me hace pensar en como tratar los casos especiales de cada clase que lo implemente, es decir, en mi clase "Directorio Empresarial" yo quiero que sus metodos solo acepten como argumentos y constructor datos de tipo "Contacto Empresarial" pero al yo implementar una interfaz esta me esta definiendo argumentos como de tipo "Contacto" que podria provocar errores en algunos metodos por lo cual entonces seria necesario lanzar una exepcion si me envian como argumento un objeto de tipo "Contacto"en vez de uno de tipo "Contacto Empresarial" .... y en ese caso me hace pensar que tal vez mi diseño es erroneo o que no sè como diseñar este tipo de problemas.

Yo necesito definir estos dos tipos de directorios por que aunque realmente tiene los mismos mètodos yo requiero que algunos mètodos hagan la misma tarea pero ademas hagan una consulta especifica a una base de datos en el caso de que sea un directorio empresarial/personal va ser distinta la consulta.

Tengo idea de un segundo planteamiento donde defino una clase abstracta "Directorio " que tiene como atributo un objeto de tipo "Contacto" y los respectivos metodos y que las clases derivadas ("Directorio Empresarial" y "Directorio Personal") solo implementa esos metodos pero caigo en la misma duda. Un Directorio Empresarial al heredar de Directorio va tener como atributo un objeto Contacto que puede almacenar por herencia un Contacto Empresarial pero ¿ Yo debo exigir que a esta clase Directorio Personal solo se le pueda pasar objetos Contacto Empresarial aún cuando los métodos que hereda y sobrescribe de la clase Directorio permiten que se la pase un objeto de Contacto?. Yo podría pasar por alto esto debido a que estoy haciendo el programa y sé como puedo controlar que esta clase de error no suceda pero me da la sensación de que como buena practica las clases no se deben prestar para dejar huecos que puedan causar errores al ser reutilizadas.


« Última modificación: 17 Abril 2019, 07:54 am por SDCC » En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejor diseño para implementacion en Java.
« Respuesta #1 en: 17 Abril 2019, 08:24 am »

Tal cual tus dos afirmaciónes son válidas
  
No hay una clave para crear una herencia perfecta.

Con el uso de super y override puedes hacer lo que estás pidiendo tranquilamente.

Eso de que si te devuelve un objeto de tipo contacto o contactoEmpresarial , puedes comprobarlo por ti mismo tranquilamente, simple y tan llanamente probando

Si tienes un método en tu interface, clase abstract base, o clase, ejemplo, getConexion, las clases que implementa a ese método , es decir que hereden a una de esas clases, tanto por simple herencia, o herencia múltiple, tendrán su propia  implementación y conectarán  a la tabla, o procedimiento almacenado correspondiente, claro está que cada implementación debe apuntar a la tabla correcta.

No te vuelvas loco enredándote, que lo que quieres hacer si que se puede.

Las 2 maneras son validas

 * Eso de la interface que te vuelve objetos de tipo contacto en ves de empresarial? Es Bull shit o algo parecido

Tu clase Contacto, debería ser más bien la clase abstracta base de la cual van a heredar las clases hijas, Contacto Empresarial y otros tipos de contactos y ya. No te vuelvas loco, y esa clase abstracta puede a la vez, implementar una interface, que contenga los métodos que quieres que implementen a las clases hijas de diferentes tipos de contactos, o la misma clase abstracta dar implementacion a ellos y las hijas usarlos con dicha implementacion, empresarial,personal, u otros dog.

Añadiendo Generics se puede ahorrar mas código,  pero ahí se complica solo un poco más eso es todo.pero ni tanto, y sobre los Generics hace poco implemente algo parecido, y totalmente funcional, vía herencia múltiple usando una interface de servicio genérico para un log de una db.

Código
  1. public interface ServicioXXX<T extends ServicioBean>


y ese servicio dentro retorna parámetros genéricos tipo T , en cada método. Al heredar de ahí, osea  

Código
  1. public class ServicioXXXImpl implements ServicioXXX<ServicioBean>

ese parámetro específico dentro del operador diamante indica lo que retornará cada método en ServicioXXXImpl o parámetros en dichos métodos, teniendo un solo servicio, ahorrando tener múltiples ServixioXXXA, ServicioXXXB, y casting innecesarios en la mayoría de los casos.



« Última modificación: 18 Abril 2019, 12:42 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
SDCC

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Mejor diseño para implementacion en Java.
« Respuesta #2 en: 17 Abril 2019, 16:36 pm »

Pero por ejemplo en cada método que yo implemente de la interfaz deberia hacer una comprobación de si es de tipo "Contacto Empresarial" o "Contacto Personal" y en caso contrario lanzar una excepcion como IlegalArgumentException? , ¿ Es normal que en estos casos se llene de casteos y de lanzamiento de excepciones para especificar que no se aceptan argumentos de la clase base si no de solo una clase especifica? o se hace la clase sin tomar en cuenta esas cosas pensando en que el programa jamas le va pasar como argumento un objeto de la herencia que no era para ese tipo de directorio.
En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejor diseño para implementacion en Java.
« Respuesta #3 en: 17 Abril 2019, 16:39 pm »

Pero por ejemplo en cada método que yo implemente de la interfaz deberia hacer una comprobación de si es de tipo "Contacto Empresarial" o "Contacto Personal" y en caso contrario lanzar una excepcion como IlegalArgumentException? , ¿ Es normal que en estos casos se llene de casteos y de lanzamiento de excepciones para especificar que no se aceptan argumentos de la clase base si no de solo una clase especifica? o se hace la clase sin tomar en cuenta esas cosas pensando en que el programa jamas le va pasar como argumento un objeto de la herencia que no era para ese tipo de directorio.


 :xD has un código ya, y ponlo aquí, y veremos qué hacemos dog, creo que te estás rompiendo el coco tú solo dog, pero tranquilo como decía el popular Jack el destripator, empecemos por peñascos.

El operador instanceof te puedo ayudar para comprobar tipos en runtime, si es que te entiendo, otra cosa es tu posible código.
« Última modificación: 17 Abril 2019, 16:47 pm por rub'n » En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
SDCC

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Mejor diseño para implementacion en Java.
« Respuesta #4 en: 17 Abril 2019, 17:05 pm »

Interfaz.
Código
  1. import java.util.Vector;
  2.  
  3. public interface Directorio {
  4.    public boolean eliminarContacto(Contacto c);
  5.    public boolean agregarContacto(Contacto c)throws IllegalArgumentException;
  6.    public boolean modificarContacto(int id,Contacto c)throws IllegalArgumentException;
  7.    public Vector<Contacto> getContactos();
  8. }
  9.  
  10.  

Clase Directorio Personal.
Código
  1. import java.util.Iterator;
  2. import java.util.Vector;
  3.  
  4. public class DirectorioPersonal implements Directorio {
  5.  
  6.    Vector<ContactoPersonal> contactos;
  7.  
  8.    public DirectorioPersonal(){
  9.        contactos = new Vector<>();
  10.    }
  11.  
  12.    @Override
  13.    public boolean eliminarContacto(Contacto c){
  14.        /*Hace polimorfismo con el metodo equals . No hay problema */
  15.  
  16.        return contactos.remove(c);
  17.    }
  18.  
  19.    @Override  
  20.    public boolean agregarContacto(Contacto c)throws IllegalArgumentException{
  21.        if(!(c instanceof ContactoPersonal))
  22.            throw new IllegalArgumentException();
  23.         return contactos.add((ContactoPersonal)c);
  24.    }
  25.  
  26.  
  27.  
  28.    @Override
  29.    public Vector<Contacto> getContactos(){
  30.        Vector<Contacto> lista = new Vector<>();
  31.        Iterator itr1 = contactos.iterator();
  32.        while(itr1.hasNext()){
  33.            lista.add((Contacto)itr1.next());
  34.        }
  35.        return lista;
  36.    }
  37.  
  38.    @Override
  39.    public boolean modificarContacto(int id,Contacto c)throws IllegalArgumentException{
  40.        if(!(c instanceof ContactoPersonal))
  41.            throw new IllegalArgumentException();
  42.  
  43.        Contacto contacto = getContacto(id);
  44.        if( contacto == null)
  45.             return false;
  46. //Polimorfismo en metodo swap
  47.        contacto.swap(c);
  48.        return true;
  49.    }
  50.  
  51. /*Metodo auxiliar para modificar contacto */
  52.    private Contacto getContacto(int id){
  53.        Iterator itr = contactos.iterator();
  54.        ContactoPersonal aux = null;
  55.  
  56.        while(itr.hasNext()){
  57.            aux = (ContactoPersonal)itr.next();
  58.            if(aux.getId() == id)
  59.                return aux;
  60.        }
  61.  
  62.        return null;
  63.    }
  64. }
  65.  
  66.  
« Última modificación: 17 Abril 2019, 17:08 pm por SDCC » En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Mejor diseño para implementacion en Java.
« Respuesta #5 en: 17 Abril 2019, 17:18 pm »

Eso es todo el código? No uses Vector es Bull sh$t, mejor List<E>
En línea

rubn0x52.com KNOWLEDGE  SHOULD BE FREE.
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen king
SDCC

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Mejor diseño para implementacion en Java.
« Respuesta #6 en: 17 Abril 2019, 17:32 pm »

En su mayoria si, solo me falta agregar algunas cosas sobre la base de datos pero seria solo agregar llamados a metodos dentro de esas clases "Directorios". Estaba pensando usar el patron de diseño DAO y DTO que hasta donde he visto es practicamente hacer una clase DAO por cada clase DTO que sea la que haga las consultas relacionadas con esa clase a la base de datos.

Esta solo es una parte del problema principal pero el otro segmento del problema ya lo tengo diseñado y en su mayoría ya esta pasado a código.
« Última modificación: 17 Abril 2019, 17:34 pm por SDCC » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Mejor diseño para implementacion en Java.
« Respuesta #7 en: 17 Abril 2019, 19:02 pm »

Sugiero usar HashMap, se eliminan los ciclos que tienes en los metodos modificarContacto y getContacto
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mejor monitor para diseño gráfico « 1 2 »
Diseño Gráfico
Placebo 10 8,341 Último mensaje 4 Enero 2007, 01:24 am
por the_new
programa para diseño industrial me podria ayudar alguien,mejor si es gratuito??
Diseño Gráfico
howie 2 6,225 Último mensaje 6 Junio 2010, 01:43 am
por howie
IMPLEMENTACION EN JAVA, AYUDA X FAVOR
Java
wallman1987 2 2,094 Último mensaje 13 Noviembre 2013, 22:01 pm
por wallman1987
Implementación de red neuronal en Java
Java
TheAIRXX 7 9,565 Último mensaje 27 Julio 2016, 22:42 pm
por gu3r0
Interfaces de usuario en Java y mejor IDE para desarrollo en java
Java
Azazel 0 2,790 Último mensaje 30 Octubre 2017, 23:36 pm
por Azazel
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines