Hola

Entiedo lo que queres hacer, mucho no me husta el enfoque....
Que una de las responsabilidades de cliente sea Buscarse es poco natural,
como sería poco natural que una de sus responsabilidades sea guardarse, por
ejemplo...

Yo particularmente enfocaría la cuestión de alguna otra manera.

Pondría la responsabilidad en un tercero, no se en donde vas a buscar, en un
dataset?, en la base de datos?, en una collection?

Yo tendría, dependiendo el caso un Buscar en la DAO correspondiente a la
entidad, si es alga mas general, que no siempre vas a bauscar en la DB haria
un helper, especializado o no..., no se, posiblemente usaria genric, algo
del estilo:

Cliente c=EntityService.Find<Cliente>( myDataset, condition1, condiction2 );

ó
Cliente c=EntityHelper.Find<Cliente>( myCollection,condition1, condiction2
);
ó
IList<Cliente> cList=i EntityHelper.FindAll<Cliente, List<Cliente>>(
myCollection,condition1, condiction2 );

La implementación sería algo asi:

public static class Entity
{
                public static T Find<T>( DataSet source, params Condition[]
condition )
                {
                               T  t=default(T);
                               ...
                               ...
                               return t;
                }

                public static T Find<T>( IList source, params Condition[]
condition )
                {
                               T  t=default(T);
                               ...
                               ...
                               return t;
                }

}

Bue, escribo sin IDE, de memoria, una cosa así.

Un aopción mas interesante es usar predicados en vez de un array de
parametros y esos predicados ser específicos por clase.

Entonces las responsabilidades te quedan mejor asignadas.
Dependiendo de que framework estes usando tenes mejores opciones.

Ahora, si no te sirve la idea y necesitas que sea responsabilidad de la
propia clase podes hacer algo asi, ( fijate que en el ejemplo anterior no te
hay case ni if ( typeof, ni nada feo ) :

public class Cliente
{
           public static Cliente Find( mis parametros de busqueda)
           {
                     Cliente c=null;
                     ...
                     ...
                     ...
                     return c;
           }

}

Pero no me gusta mucho, es una solución muy acoplada, seguramente implicará
dependencias con algunos artefactos que nadatienen que ver con la capa en la
que estas...

Saludos

Daniel Calvin
2008/5/29 Ghiggeri Sistemas <[EMAIL PROTECTED]>:

> Hola a todos, ando buscando urgentemente un "buscador" (valga la
> redundancia).
> El tema es asi: estoy desarrollando un sistema en 3 capas, en donde trabajo
> con datasets.
> Necesito una clase genérica que pertenezca a la capa de negocio, que reciba
> como argumento cualquier objeto que necesite buscar, en donde cada objeto
> sabe como buscarse a si mismo. El problema se presenta en como hacer que una
> clase "Buscador", dependiendo del párametro que reciba, se instancie de una
> u otra manera, para buscarse a sí misma. Tiene algo que ver con
> "Polimorfismo", y no utilizando un case para hacerlo.
>
> Por ejemplo: tenemos la clase "Cliente" con todos sus atributos y sus
> métodos, en el cual tenemos un método que es "Buscar()", el cual sirve para
> buscarse a sí mismo dependiendo del parámetro que le pasemos. De la misma
> manera tenemos las clases "Personal" y "Empresa".
> Por otro lado tenemos la clase "Buscar", la cual se debe instanciar como un
> "Cliente", o "Personal", o "Empresa", dependiendo de un parámetro que se
> recibe desde la capa de aplicación para hacer uso de su método "Buscar()"
>
>


-- 
Daniel A. Calvin
Cooperator Team Member
http://www.cooperator.com.ar
Microsoft Certified Professional

Responder a