Trabajo con clases de Negocio

26/09/2008 - 17:04 por Guillermo Peralta | Informe spam
Hola que tal,
Les planteo una consulta acerca de cual es la manera que uds creen conviente
para realizar lo siguiente utilizando una metodologia en Capas y Orientada a
Objetos.

El planteo es tener una clase Cliente y un clase Domicilios como propiedad
de la primera que realizan el mapeo de la Base de datos a un modelo OO

Cliente

IdCliente
Nombre
Domicilios


Domicilios
Calle
Numero


Hasta ahi todo bien. Ahora necesito tener una manera de cargar tanto los
datos del cliente como los de sus domicilios, eso lo implementaria a traves
de una clase de negocio llamada NegocioClientes


El 1º planteo es tener un metodo static dentro de NegocioClientes que
provea metodos de servicios para llevar a cabo las distintas acciones

Entidades.Clientes EntidadCliente = new Entidades.Cliente ( 123 );
//inicializo con el Id del Cliente

NegocioClientes.Fill (EntidadCliente ); //cargo los datos basicos del
Cliente
NegocioClientes.FillDomicilios (EntidadCliente); //cargo los domicilios
del cliente


//accedo a los datos del cliente de la siguiente manera
string Nombre = EntidadCliente.Nombre;

string Calle = EntidadCliente.Domicilios[0].Calle;



El 2º planteo es tener dentro de la clase de NegocioClientes un objeto
EntidadClientes como propiedad y disponer dentro de Negocio metodos para la
carga de estos datos:

NegocioClientes Cliente = new NegocioClientes ( 123); //inicializo con
el Id del Cliente

Cliente.Load (); //cargo los datos del cliente

Cliente.LoadDomicilios (); //cargo los domicilios

//accedo a los datos del cliente de la siguiente manera

string Nombre = Cliente.EntidadCliente.Nombre;

string Calle = Cliente.EntidadCliente.Domicilios[0].Calle;



Espero que se entiendan los distintos planteos, funcionalmente no encuentro
mayores diferencias entre uno y otro, y es por eso que me encuentro un poco
confundido en que metodología seguir.


Saludos
Guillermo Peralta

Preguntas similare

Leer las respuestas

#16 Jesús López
30/09/2008 - 11:41 | Informe spam
Alfredo,

La discusión inicial es acerca de cual es la manera más adecuada de
implementar un modelo de "clases de negocio" en el que se mapean clases con
tablas y/o vistas y propiedades con columnas. No si para crear aplicaciones
que acceden a bases de datos el mejor enfoque es usar tal modelo u otro
modelo más genérico como el que defiendes y en cuya discusión no pienso
entrar.

Saludos

Jesús López



"Alfredo Novoa" escribió en el mensaje
news:
Hola Jesús,

On 30 sep, 09:24, "Jesús López"
wrote:

Si te has decidido por usar clases para las entidades de negocio me parece
que usar data tables también, es inconsistente y produce falta de
homogeneidad.



Pero rectificar es de sabios, y si resulta que así avanza más rápido
que con las clases de negocio aun puede estar a tiempo para
abandonarlas.

Por otra parte ¿No sería mejor generalizar los métodos de
carga o búsqueda y llamarlos todos igual? Por ejemplo que todas las clases
de servicio de acceso a datos para una determinada entidad tuvieran un
método llamado Search con un parámetro llamado criteria y que ese método
devuelva una colección de entidades en vez de un datatable



Eso sería reinventar una rueda cuadrada. Sería mucho mejor tener un
solo método al que se le pasa una sentencia SQL como parámetro. Y
además es que ya está hecho y son los DataReader.

> No claro, pero la clase puede tener distintos metodos, e ir llenando los
> campos de acuerdo a la necesidad, en el ejemplo de cliente y domicilios
> FillBasico () //cargo solo los datos basicos de un cliente, digamos ID,
> nombre o razon social
> FillCompleto () //carga todos los datos del tiemp
> FillDomicilios () //carga solo los domicilios de ese cliente

Lo mismo para esto: un único método Fill con un parámetro que inique qué
se
quiere cargar.



Para eso ya está el Fill de los DataAdapter.

Aunque es un sistema bastante primitivo. Yo utilizo mi propia
implementación de IBindingList que resuelve automáticamente un montón
de cosas como la paginación de los datos y las actualizaciones, y me
sirve para cualquier "entidad".

Pero tener un constructor al que se le pasa el Id parece antinatural.
Parece
más natural tener un método en la clase de servicio llamado por ejemplo
GetByKey al que se le pase como parámetro una de sus claves (la clave
primaria o cualquiera de sus claves candidatas)



Pues a mi eso también me parece antinatural. Es más natural obtener el
conjunto de datos que deseas utilizando una consulta SQL. Y esto
incluye los conjuntos de un elemento.


Saludos
Respuesta Responder a este mensaje
#17 Alfredo Novoa
30/09/2008 - 12:04 | Informe spam
Jesús,

El Tue, 30 Sep 2008 11:41:07 +0200, Jesús López escribió:

La discusión inicial es acerca de cual es la manera más adecuada de
implementar un modelo de "clases de negocio" en el que se mapean clases con
tablas y/o vistas y propiedades con columnas.



Si, y es un gran error de partida. Le haríamos un flaco favor a Guillermo
no advirtiendole de ello.

No si para crear aplicaciones
que acceden a bases de datos el mejor enfoque es usar tal modelo u otro
modelo más genérico como el que defiendes y en cuya discusión no pienso
entrar.



Tu mismo.


Saludos
Respuesta Responder a este mensaje
#18 Guillermo Peralta
30/09/2008 - 14:29 | Informe spam
Si te has decidido por usar clases para las entidades de negocio me parece
que usar data tables también, es inconsistente y produce falta de
homogeneidad. Por otra parte ¿No sería mejor generalizar los métodos de
carga o búsqueda y llamarlos todos igual? Por ejemplo que todas las clases
de servicio de acceso a datos para una determinada entidad tuvieran un
método llamado Search con un parámetro llamado criteria y que ese método
devuelva una colección de entidades en vez de un datatable




Lo que sucede es que seguramente, debido a mi inexperiencia, no alcanzo a
dimensionar esa inconsistencia y falta de homogeneidad, los dataTable son lo
más parecido al Recordset de VB6 ADO donde yo levantaba los datos de la BD y
trabajaba con cada uno de los campos con mucha flexibilidad.
En nuestro modelo (y me imagino que en el de muchos que se dedican a
aplicaciones de gestion) las consultas o los datos son necesarios extraerlos
de muchas tablas y me encontre con la dificultad de encontrar una coleccion
de entidades que pueda representarme lo que estoy buscando.

Supongamos que un reporte necesito mostrar los datos de un proveedor
detallando la venta de sus articulos, agrupado por la categoria de los
mismos y con el saldo de su cuenta corriente.

En este ejemplo bastante básico por cierto, nos encontramos con la Entidad
Proveedor, con la entidad Cuenta Corriente, con la entidad Artículos, con la
entidad Categoria de los artículos, y hasta con 4 o 5 entidades más.
Entonces la duda puntual es, cómo hago para devolver una coleccion de
entidades con semejante complejidad?


Ahora, si solo necesito devolver un listado de clientes para llenar una
lista, bueno, es mucho más simple, porque simplemente "bindeo" la
List<Cliente> al datasource que necesito y listo.

Ojo, no quiero que se me malinterprete y digan "al final pide consejo pero
hace lo que quiere" realmente valoro la opinion de todos, porque de todos
algo se aprende, y pienso que es bueno generar discusión con respeto con
temas que creo nos pueden pasar a la mayoría.
Respuesta Responder a este mensaje
#19 Jesús López
30/09/2008 - 15:16 | Informe spam
"Guillermo Peralta" @SPAM.com.ar> escribió en el
mensaje news:%


Si te has decidido por usar clases para las entidades de negocio me
parece
que usar data tables también, es inconsistente y produce falta de
homogeneidad. Por otra parte ¿No sería mejor generalizar los métodos de
carga o búsqueda y llamarlos todos igual? Por ejemplo que todas las
clases
de servicio de acceso a datos para una determinada entidad tuvieran un
método llamado Search con un parámetro llamado criteria y que ese método
devuelva una colección de entidades en vez de un datatable




Lo que sucede es que seguramente, debido a mi inexperiencia, no alcanzo a
dimensionar esa inconsistencia y falta de homogeneidad, los dataTable son
lo más parecido al Recordset de VB6 ADO donde yo levantaba los datos de la
BD y trabajaba con cada uno de los campos con mucha flexibilidad.
En nuestro modelo (y me imagino que en el de muchos que se dedican a
aplicaciones de gestion) las consultas o los datos son necesarios
extraerlos de muchas tablas y me encontre con la dificultad de encontrar
una coleccion de entidades que pueda representarme lo que estoy buscando.




La inconsistencia está en lo siguiente. En principio hay dos modelos para
hacer aplicaciones centradas en datos:

1) El modelo de "entidades de negocio" o "clases de negocio" donde se mapean
las clases a tablas/vistas y propiedades a columnas y además las relaciones
con colecciones y tal.
2) El modelo de clases genericas de datos como los datatables y datasets o
cualquier otro tipo de clases similares.

Pero resulta que tú por una parte usas simultáneamente el modelo 1, y por
otra parte el modelo 2. Eso es como mezclar churras con merinas. ¡O una cosa
o la otra! ¡Decídete de una vez!



Supongamos que un reporte necesito mostrar los datos de un proveedor
detallando la venta de sus articulos, agrupado por la categoria de los
mismos y con el saldo de su cuenta corriente.

En este ejemplo bastante básico por cierto, nos encontramos con la Entidad
Proveedor, con la entidad Cuenta Corriente, con la entidad Artículos, con
la entidad Categoria de los artículos, y hasta con 4 o 5 entidades más.
Entonces la duda puntual es, cómo hago para devolver una coleccion de
entidades con semejante complejidad?




Entity Framework resuelve perfectamete este problema. Y el modelo de dataset
también, en un único dataset puedes tener toda esta información.

Lo que te recomiendo es que uses una framework ya exitente, no te la
inventes tú.



Ahora, si solo necesito devolver un listado de clientes para llenar una
lista, bueno, es mucho más simple, porque simplemente "bindeo" la
List<Cliente> al datasource que necesito y listo.

Ojo, no quiero que se me malinterprete y digan "al final pide consejo pero
hace lo que quiere" realmente valoro la opinion de todos, porque de todos
algo se aprende, y pienso que es bueno generar discusión con respeto con
temas que creo nos pueden pasar a la mayoría.



Respuesta Responder a este mensaje
#20 Alfredo Novoa
30/09/2008 - 15:44 | Informe spam
El Tue, 30 Sep 2008 09:29:17 -0300, Guillermo Peralta escribió:

Lo que sucede es que seguramente, debido a mi inexperiencia, no alcanzo a
dimensionar esa inconsistencia y falta de homogeneidad, los dataTable son lo
más parecido al Recordset de VB6 ADO donde yo levantaba los datos de la BD y
trabajaba con cada uno de los campos con mucha flexibilidad.



Lo que le parece inconsistente es usar las "clases de negocio" para unas
cosas si y para otras no. Querrá decir que o las usas para todo o no las
usas, y así el beneficio o el torzazo que te vas a dar si aciertas o te
equivocas será el máximo. Y por supuesto el tortazo máximo es el que te vas
a llevar si se te ocurre usar las clases de negocio para todo, como podrás
comprobar muy pronto si lo intentas.

En nuestro modelo (y me imagino que en el de muchos que se dedican a
aplicaciones de gestion) las consultas o los datos son necesarios extraerlos
de muchas tablas y me encontre con la dificultad de encontrar una coleccion
de entidades que pueda representarme lo que estoy buscando.



Si, te estás encontrando con las razones por las que se abandonó la gestión
de datos basada en referencias (punteros) en los años 70. El que no conoce
la historia está condenado a repetirla.

Supongamos que un reporte necesito mostrar los datos de un proveedor
detallando la venta de sus articulos, agrupado por la categoria de los
mismos y con el saldo de su cuenta corriente.

En este ejemplo bastante básico por cierto, nos encontramos con la Entidad
Proveedor, con la entidad Cuenta Corriente, con la entidad Artículos, con la
entidad Categoria de los artículos, y hasta con 4 o 5 entidades más.
Entonces la duda puntual es, cómo hago para devolver una coleccion de
entidades con semejante complejidad?



Ejecutas una instrucción SQL y obtienes la colección de los datos que
necesitas. Para eso se creo SQL.

Ahora, si solo necesito devolver un listado de clientes para llenar una
lista, bueno, es mucho más simple, porque simplemente "bindeo" la
List<Cliente> al datasource que necesito y listo.



¿Y por que no aplicar este mecanismo tan productivo a todo lo demás?

Ojo, no quiero que se me malinterprete y digan "al final pide consejo pero
hace lo que quiere"



Pues eso es justo lo que deberías de hacer :-)


Saludos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida