none
Buenas practicas de programacion RRS feed

  • Pregunta

  • hola aca con una duda en la estructura de mis capas

    Entidad

    Datos

    Logica

    Presentacion

    ----------------

    en mi capa entidad defino 3 clases

    SeccionBe,CategoriaBe ,LineaBE

    las tres tienen en sus tablas como atributos : SQL

    Seccion

    SecID , DesID

    Categoria

    CatID, DesID

    Linea

    LinID, DesID

    --------------------------------------------------------------

    en mi capa entidades :

    pregunta: deberia definir 3 clases ? SeccionBe, CategoriaBe y LineaBe ???

    o solo una que englobe a las tres ?

    ----------------------------------------------------------------------

     en mi capa de datos :

    deberia utilizar una solo metodo que englobe a las tres ?

    -------------------------------------------------------------------

    en la capa logica :

    Deberia pasar el nombre del store procedure segun convenga o eso ya lo definiria en mi capa de datos?

    -----------------------------------------------------------------

    Espero sus respuestas


    QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..

    martes, 9 de diciembre de 2014 17:39

Respuestas

  • >>pregunta: deberia definir 3 clases ? SeccionBe, CategoriaBe y LineaBe ???  o solo una que englobe a las tres ?

    como harias para definir una sola ?

    acaso hay algun tipo de herencia entre estas clases?  sino la hay entonces debes definir 3 clases

    >>deberia utilizar una solo metodo que englobe a las tres ?

    idem a la respuesta anterior

    ademas seria un verdadero espagueti de codigo definir un solo metodo para entidades independientes

    >>Deberia pasar el nombre del store procedure segun convenga o eso ya lo definiria en mi capa de datos?

    desde la capa de logica no puede definir el procedure porque estas violando las responsabilidades

    solo la capa de datos conoce conceptos de "procedure", si necesitas definirlo desde la logica entonces algo estas planteando de forma incorrecta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 9 de diciembre de 2014 18:41
  • Clases separadas. Una entidad es una unidad de negocio como cliente, proveedor, producto etc. No puedes juntar. Será legible, escalable y fácil de mantener.

    Veo además que tratas mucho de comprimir tu código llegando al extremo de acoplar funcionalidad o responsabilidades. El código tiene que ser legible, no caigas en querer compactar líneas porque puede ser contraproducente.

    Una clase hace algo que tiene que hacer y punto, no hace más. Principio de OOP.

    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.



    jueves, 11 de diciembre de 2014 22:17

Todas las respuestas

  • >>pregunta: deberia definir 3 clases ? SeccionBe, CategoriaBe y LineaBe ???  o solo una que englobe a las tres ?

    como harias para definir una sola ?

    acaso hay algun tipo de herencia entre estas clases?  sino la hay entonces debes definir 3 clases

    >>deberia utilizar una solo metodo que englobe a las tres ?

    idem a la respuesta anterior

    ademas seria un verdadero espagueti de codigo definir un solo metodo para entidades independientes

    >>Deberia pasar el nombre del store procedure segun convenga o eso ya lo definiria en mi capa de datos?

    desde la capa de logica no puede definir el procedure porque estas violando las responsabilidades

    solo la capa de datos conoce conceptos de "procedure", si necesitas definirlo desde la logica entonces algo estas planteando de forma incorrecta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 9 de diciembre de 2014 18:41
  • bueno esa es la idea, aunque no lo e puesto en practica.

    en la entidad
    --------------------
    DatosBE
      Public Property cod As Integer
        Public Property des As String

    en la capa datos
    ---------------------
    DatosDAO
      Public Function get_datos(procedure as string) As List(Of datosBE)
            Using cnx As New SqlConnection(SringCnn)
                Dim ListaBE As New List(Of datosBE)()
                Using cmd As New SqlCommand
                    Dim dr As SqlDataReader
                    cmd.Connection = cnx
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.CommandText = procedure
                    cnx.Open()
                    dr = cmd.ExecuteReader
                    Dim BE As datosBE
                    While dr.Read()
                        BE = New datosBE
                        With BE
                            BE.Cod = If(dr.IsDBNull(0), Nothing, dr("Cod"))
                            BE.Des = If(dr("Des") Is DBNull.Value, Nothing, dr("Des"))
                        End With
                        ListaBE.Add(BE)
                    End While
                    dr.Close()
                    Return ListaBE
                End Using
            End Using
        End Function
    ------------------------------------------------
    logica
    ------
      Dim obj As New datosDAO
        Public Function get_datos_Cateogira (procedure as string) As List(Of datosBE)
            Return obj.get_datos("SP_GetCategoria")
        End Function


    QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..

    jueves, 11 de diciembre de 2014 18:57
  • Hola,

    La capa de lógica de negocio no tiene porque saber que procedimiento utilizará la capa de datos.

    La capa de negocios sólo pide y espera que se le entreguen Datos y para eso utilizas la función getDatos() que a lo mucho podrías pasarle algún parámetro.

    La capa de datos es la que sabe que método usar para devolver o persistir datos: procedimientos almacenados, tablas, consultas en línea, etc.

    'en la entidad
    DatosBE
      Public Property cod As Integer
      Public Property des As String
    
    'en la capa datos
    DatosDAO
    Public Function get_datos() As List(Of datosBE)
      Using cnx As New SqlConnection(SringCnn)
      Dim ListaBE As New List(Of datosBE)()
      Using cmd As New SqlCommand
      Dim dr As SqlDataReader
      cmd.Connection = cnx
      cmd.CommandType = CommandType.StoredProcedure
      cmd.CommandText = "SP_GetCategoria"
      cnx.Open()
      dr = cmd.ExecuteReader
      Dim BE As datosBE
      While dr.Read()
        BE = New datosBE
        With BE
          BE.Cod = If(dr.IsDBNull(0), Nothing, dr("Cod"))
          BE.Des = If(dr("Des") Is DBNull.Value, Nothing, dr("Des"))
        End With
        ListaBE.Add(BE)
      End While
      dr.Close()
      Return ListaBE
      End Using
      End Using
    End Function
    
    'logica
      Dim obj As New datosDAO
        Public Function get_datos_Cateogira () As List(Of datosBE)
            Return obj.get_datos()
        End Function

    Como consejo adicional no antepongas el prefijo sp en tus procedimientos almacenados. En n foros te comentarán el porque.

    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.


    jueves, 11 de diciembre de 2014 19:11
  • hola

    la verdad no soy muy partidario de hacer algo como esto

      Public Function get_datos(procedure as string) As List(Of datosBE)

    definir metodo que reciban un procedure no me parece correcto, deberias definir funcionalidad que sea ObtenerSeccion() obtenerCategorias(), etc

    despues estos metodo si quieres puede retornar una entidad datosBE si lo necesitas, pero que la funcionalidad sea clara, no generica

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 11 de diciembre de 2014 19:12
  • Hola wilians  gracias por esponder

    el ejemplo que me mandaste es casi parecido a como yo lo hago en realidad,

    lo que puse en el post solo es un ejemplo, sobre la duda que tengo de acortar un poco el codigo

    y sobre el sp también lo puse como ejemplo.

    gracias por responder.....  se me aclara la duda


    QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..

    jueves, 11 de diciembre de 2014 21:11
  • según la respuesta tanto de wilians como tuya leandro

    entiendo lo que me quieren decir. sobre la capa de datos y logica

    ....

    entonces

    sobre la capa entidad, estaría bien defina una clase para los tres (datosBE)?

    o clases independientes (sescionBe, CategoiraBe , LineaBe)

    cual seria la recomendacion ...


    QUIERO MATAR ESTA DUDA ... ANTES QUE EL MUNDO DEJE DE EXISTIR..

    jueves, 11 de diciembre de 2014 21:14
  • Clases separadas. Una entidad es una unidad de negocio como cliente, proveedor, producto etc. No puedes juntar. Será legible, escalable y fácil de mantener.

    Veo además que tratas mucho de comprimir tu código llegando al extremo de acoplar funcionalidad o responsabilidades. El código tiene que ser legible, no caigas en querer compactar líneas porque puede ser contraproducente.

    Una clase hace algo que tiene que hacer y punto, no hace más. Principio de OOP.

    Espero haberte ayudado con mi respuesta, si te fue útil no olvides marcarla como correcta.



    jueves, 11 de diciembre de 2014 22:17