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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Duda de diseño.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda de diseño.  (Leído 3,878 veces)
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Duda de diseño.
« en: 23 Julio 2013, 21:41 pm »

Estoy haciendo un ejercicio, el cual pide crear el sitio web de una empresa de seguros. Tengo una clase Empresa, la cual implementa métodos para gestionar las clases CorredorSeguros y Cliente. Estas dos últimas clases no tienen nada en común, salvo el atributo nombre.

Ahora, mi preguta: ¿Qué es mas conveniente? ¿Utilizar dos listas genéricas en mi clase Empresa para coleccionar por separado objetos de las clases CorredorSeguros y Cliente? ¿O en cambio, utilizar sólo una lista para coleccionar instancias de ambas clases?

Si colecciono los objetos de cada una de las clases por separado, tendría que implementar métodos específicos para cada una de las dos colecciones; en cambio, si los colecciono en una única lista, me ahorro implementar algunos métodos, pero en cambio debería hacer unos cuantos casteos. Y esta única lista sería de tipo Persona, una clase base que la crearía únicamente para derivar de ella mis clases CorredorSeguro y Cliente. Pero como dije, no tienen nada en común, sería una herencia forzosa, ya que la clase base (Persona) sería prácticamente una clase vacía.

Pongo un ejemplo para que todo sea más entendible:

Coleccionando por separado.

Código:
class Empresa
    {
        List<CorredorSeguros> listaCorredores;
        List<Cliente> listaClientes;

        public void AgregarCorredor(CorredorSeguros c)
        { }

        public CorredorSeguros BuscarCorredor(string nombre)
        { }

        public void AgregarCliente(Cliente c)
        { }

        public Cliente BuscarClientes(double ci)
        { }
    }

    class CorredorSeguros
    {
        string usuario;
    }

    class Cliente
    {
        double cedulaIdentidad;
    }

Coleccionando en una única lista genérica de tipo Persona.

Código:
 class Empresa
    {
        List<Persona> lista;

        public void Agregar(Persona p)
        { }

        public Persona Buscar(string usuario)
        { }

        public Persona Buscar(double ci)
        { }
    }

    class Persona
    { }

    abstract class CorredorSeguros : Persona
    {
        string Usuario;
    }

    class Cliente : Persona
    {
         double cedulaIdentidad;
    }


O sea, lo que gano por un lado lo pierdo por el otro... En el ejemplo, me ahorro implementar dos veces el método Agregar(). Por otra parte, en cuanto al método Buscar(), debo andar verificando si cada elemento de la lista es del tipo que estoy buscando,y después tengo que castear lo que me devuelve el método.


En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Duda de diseño.
« Respuesta #1 en: 23 Julio 2013, 21:56 pm »

Lo haría por separado, incluso los métodos "Buscar" son diferentes, así que no me parece que valga la pena forzar una herencia solo para acumular todo en el mismo sitio.

Saludos


En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Duda de diseño.
« Respuesta #2 en: 24 Julio 2013, 00:25 am »

No vale la pena que implementes una herencia nada más con una propiedad de por medio, además el código tiende a complejidad cuando combinas varios tipos herederos en una lista, la lógica que tienes que aplicar termina siendo absurda, es mejor que tengas tus dos listas separadas, más fácil, más comprensible y de mejor practica que forzar una herencia de una sola propiedad...
En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: Duda de diseño.
« Respuesta #3 en: 24 Julio 2013, 01:04 am »

Ok. Muchísimas gracias a ambos por la pronta respuesta.
Conclusión: Evitando esta herencia innecesaria, en un primer momento debo implementar algunos métodos más, pero de esta forma me ahorro muchos problemas de cabeza a futuro.

Saludos.
En línea

DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: Duda de diseño.
« Respuesta #4 en: 24 Julio 2013, 02:14 am »

Tengo otra pequeña consulta (aunque ya no tiene mucho que ver con el título del tema...):

Ahora tengo una clase con dos listas genéricas, y me gustaría acceder a los elementos de cada una de ellas a través de un indizador. El problema está en que cada clase no permite tener más de un indizador. Lo que se puede hacer es sobrecargarlo, pero el parámetro sería el mismo, un entero que indique la posición dentro de la lista, así que esto tampoco me sirve.

¿Puede ser que la única forma de conseguir un comportamiento parecido al de un indizador sea implementando funciones tales como GetCorredor(int i) y GetCliente(int i) para que me devuelvan los elementos de cada lista?
En línea

Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: Duda de diseño.
« Respuesta #5 en: 24 Julio 2013, 09:54 am »

La clase forma una capa sobre el objeto list, cualquier función, propiedad o método que quieras exponer tienes que hacerlo tu mismo, ya que no puedes acceder a ningún miembro del objeto list externamente, debido a que este es privado.
En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: Duda de diseño.
« Respuesta #6 en: 24 Julio 2013, 18:36 pm »

Sí, eso lo entiendo bien. Pero por razones de practicidad, quiero acceder a las listas desde afuera de la clase, pero manteniendo la misma notación que uso para acceder a los elementos de cada lista dentro de la clase misma (esto es, acceder a los elementos de cada lista a través de un índice encerrado entre paréntesis rectos [int i]). Esto lo logro a través de un indizador.
El problema es que necesitaría implementar dos en una misma clase.

Sería algo así:

Código:
class Empresa
    {
        List<CorredorSeguros> listaCorredores;
        List<Cliente> listaClientes;

        public CorredorSeguros this[int i]
        {
            get { return listaCorredores[i]; }
        }

        public Cliente this[int i]
        {
            get { return listaClientes[i]; }
        }
    }

Esto no es posible en C#, el compilador me va a tirar un error por ambos índices tener el mismo parámetro.

Y mi pregunta era cual sería una solución alternativa para conseguir un comportamiento similar.

Lo más parecido que se me ocurre hacer es:

Código:
 class Empresa
    {
        List<CorredorSeguros> listaCorredores;
        List<Cliente> listaClientes;

        public CorredorSeguros getCorredorSeguros(int i)
        {
            return listaCorredores[i];
        }

        public Cliente getCliente(int i)
        {
            return listaClientes[i];
        }
    }

O sea, hacer una función para cada lista que me devuelva sus elementos.
Pero quería saber si hay alguna otra opción, o que sería lo más recomendado.

En línea

Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Duda de diseño.
« Respuesta #7 en: 25 Julio 2013, 03:50 am »

Hacer una función para cada lista que te devuelva sus elementos

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
DanteInfernum

Desconectado Desconectado

Mensajes: 60


Ver Perfil
Re: Duda de diseño.
« Respuesta #8 en: 25 Julio 2013, 21:31 pm »

Bien. Gracias por las respuestas.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda en diseño de photoshop
Diseño Gráfico
Error 404 5 2,778 Último mensaje 25 Febrero 2006, 18:19 pm
por Maox
Duda de diseño
Diseño Gráfico
dapucaz 9 3,644 Último mensaje 3 Marzo 2006, 04:27 am
por dapucaz
Duda de diseño BBDD
Bases de Datos
Sieg0 4 3,312 Último mensaje 21 Junio 2015, 23:13 pm
por fran800m
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines