none
Se podria reducir este trozo de codigo? RRS feed

  • Pregunta

  • Buenas 

    Me gustaria saber si puedo reducir este trozo de codigo 

    Gracias

    Sub config_Estock()
            XmlDocument_Configuracion = New XmlDocument
            XmlDocument_Configuracion.Load("Configuracion/Configuracion.xml")
            XmlNodeList_Configuracion = XmlDocument_Configuracion.SelectNodes("Configuracion/Estock")
    
            For Each node As Xml.XmlNode In XmlNodeList_Configuracion
    
                If Sb_Estock1.Focused = True Then
                    Select Case Sb_Estock1.Value
                        Case True
                            Sb_Estock2.Value = False
                        Case False
                            Sb_Estock2.Value = True
                    End Select
                End If
                If Sb_Estock2.Focused = True Then
                    Select Case Sb_Estock2.Value
                        Case True
                            Sb_Estock1.Value = False
                        Case False
                            Sb_Estock1.Value = True
                    End Select
                End If
                node.ChildNodes(0).InnerText = Sb_Estock1.Value
                node.ChildNodes(1).InnerText = Sb_Estock2.Value
            Next
    
            XmlDocument_Configuracion.Save("Configuracion/Configuracion.xml")
        End Sub

    jueves, 12 de octubre de 2017 8:35

Respuestas

  • XmlDocument_Configuracion = New XmlDocument
    XmlDocument_Configuracion.Load("Configuracion/Configuracion.xml")
    XmlNodeList_Configuracion = XmlDocument_Configuracion.SelectNodes("Configuracion/Estock")
    
    If Sb_Estock1.Focused Then Sb_Estock2.Value = Not Sb_Estock1.Value
    If Sb_Estock2.Focused Then Sb_Estock1.Value = Not Sb_Estock2.Value
    
    For Each node As Xml.XmlNode In XmlNodeList_Configuracion
    	node.ChildNodes(0).InnerText = Sb_Estock1.Value
    	node.ChildNodes(1).InnerText = Sb_Estock2.Value
    Next
    
    XmlDocument_Configuracion.Save("Configuracion/Configuracion.xml")



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta JETET viernes, 13 de octubre de 2017 15:57
    jueves, 12 de octubre de 2017 16:22
  • Hola:

    Entiendo que por 'reducir' te refieres a que vaya más rápido ;-). El problema lo tienes que tienes unas comprobaciones (If... Then & Select Case) que son fijas, solo es necesario calcularlas 1 vez, pero las tienes dentro del bucle, así que se ejecutan 'n' veces. Sacando esas comprobaciones fuera del bucle tendrías solucionado el mayor problema. Luego, reducir o no el código es ya cada uno. Yo si, por ejemplo, si en un bucle 'largo' voy a usar una propiedad de un control, me creo una variable local que siempre es más rapida ;-)

    En tu caso, yo lo 'reduciría' así:


    Sub config_Estock()
       XmlDocument_Configuracion = New XmlDocument            
     XmlDocument_Configuracion.Load("Configuracion/Configuracion.xml")
       XmlNodeList_Configuracion = XmlDocument_Configuracion.SelectNodes("Configuracion/Estock")
    
    ' Configuramos bTmp SOLO una vez para ser usada dentro del bucle
       Dim bTmp As Boolean = If(Sb_Estock1.Focused, Sb_Estock1.Value, Not Sb_Estock2.Value)
    
       For Each node As Xml.XmlNode In XmlNodeList_Configuracion
          node.ChildNodes(0).InnerText = bTmp
          node.ChildNodes(1).InnerText = Not bTmp
       Next         
      
     XmlDocument_Configuracion.Save("Configuracion/Configuracion.xml")
    End Sub

    Un saludo


    • Editado LG DES viernes, 13 de octubre de 2017 10:49
    • Marcado como respuesta JETET viernes, 13 de octubre de 2017 15:58
    viernes, 13 de octubre de 2017 10:48

Todas las respuestas

  • Se podrian sustituir los dos bloques "If" por dos llamadas a una unica subrutina que reciba el Estock1 y el Estock2 (en orden contrario en cada una de las dos llamadas). Pero no creo que merezca la pena; aunque al final quede cinco lineas mas corto, no va a ganar gran cosa en cuanto a claridad.
    jueves, 12 de octubre de 2017 12:05
  • XmlDocument_Configuracion = New XmlDocument
    XmlDocument_Configuracion.Load("Configuracion/Configuracion.xml")
    XmlNodeList_Configuracion = XmlDocument_Configuracion.SelectNodes("Configuracion/Estock")
    
    If Sb_Estock1.Focused Then Sb_Estock2.Value = Not Sb_Estock1.Value
    If Sb_Estock2.Focused Then Sb_Estock1.Value = Not Sb_Estock2.Value
    
    For Each node As Xml.XmlNode In XmlNodeList_Configuracion
    	node.ChildNodes(0).InnerText = Sb_Estock1.Value
    	node.ChildNodes(1).InnerText = Sb_Estock2.Value
    Next
    
    XmlDocument_Configuracion.Save("Configuracion/Configuracion.xml")



    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta JETET viernes, 13 de octubre de 2017 15:57
    jueves, 12 de octubre de 2017 16:22
  • Sb_Estock2.Value = Not Sb_Estock1.Value
    Ojo, esto "petará" muchísimo si tienes puesto el "Option Strict On" (cosa que deberías hacer si quieres que tu código sea fiable). La razón es que el Value es de tipo String, mientras que el operador Not se aplica al tipo Boolean, por lo que ahí tenemos entre medias un par de conversiones implícitas que conviene evitar.
    jueves, 12 de octubre de 2017 18:30
  • Alberto, ¿el identificador 'Sb_Estock1|2' a que tipo refiere?, el prefijo no me da pistas.

    Por el contexto del código adjunto, y entendiendo que los literales se escribieron correctamente según el tipo, supuse que la propiedad Value es de tipo Boolean.

    jueves, 12 de octubre de 2017 18:57
  • Puedo estar equivocado, pero me suena de una pregunta anterior, en la que Jetet preguntaba por la forma de extraer ciertos nodos de un XML, que el Sb_Estock era un XmlNode. Desde luego, si es otro objeto y el Value es Boolean, entonces es perfectamente adecuado hacerle un Not.
    jueves, 12 de octubre de 2017 19:13
  • Que quereis decir cuando si es boalean a true o false?
    jueves, 12 de octubre de 2017 19:50
  • Que quereis decir cuando si es boalean a true o false?

    Una variable de tipo Boolean puede contener True o False:

    Dim b as Boolean = True

    Mientras que una variable string puede contener cualquier texto, y el texto podría ser "True" o "False" (entre comillas), que el compilador salva como 4 letras, a diferencia del True o False (sin comillas) del Boolean, que el compilador salva como un valor binario (creo que 1 para True y 0 para False).

    Dim s as String = "True"

    ¿Qué pasa si a un String le metemos el True sin comillas s=True? Pues que el compilador compila el True para dar lugar al valor binario 1, y luego se produce una conversión implícita de ese valor binario a cadena de caracteres, resultando lo que al compilador le dé la gana (hay que probarlo, puede que ponga "1" o que ponga "true").

    viernes, 13 de octubre de 2017 6:49
  • Gracias por responder 

    no tengo activado Option Strict On

    viernes, 13 de octubre de 2017 8:01
  • no tengo activado Option Strict On

    Mal hecho. Deberías tenerlo activado.

    Es una medida de protección, mediante la cual el compilador te avisa cuando en tu código estás haciendo algo "potencialmente peligroso", que podría fallar en tiempo de ejecución.

    Por ejemplo, si haces esto:

    Dim s as String = ....
    ....
    Dim d as DateTime = s

    y no tienes puesto el "option strict on", funciona perfectamente... a condición de que dentro de "s" exista una fecha correcta. Si esa fecha se obtiene en tiempo de ejecución, hay una posibilidad de que sea incorecta y dé un error al ejecutar esa sentencia. Y además, incluso aunque no dé error, existe una conversión que aplica un formato arbitrario )el que esté configurado en el panel de control), que podría "fastidiarte" cuando ejecutes el programa en otro equipo que tenga otra configuración.

    Esos problemas podrían ser o no ser importantes, dependiendo de qué haga con esos valores el programa. Pero lo malo es que no te das cuenta en el momento de compilar. El compilador se lo "traga" todo, y solo te das cuenta de que algo falla cuando lo ejecutas en otro equipo que tenga otra configuración, o cuando lo alimentas con ciertos datos que no tenías presentes cuando estabas desarrollando.

    Si pones "Option Strinct On", el compilador trata esa conversión como un error, con lo que no te pasa desapercibida la conversión implícita y te das cuenta de que ahí podría haber un potencial problema. Si depués de considerarlo decides que sí que quieres hacer esa conversión, siempre puedes escribirla expresamente (por ejemplo, d=DateTime.Parse(s)), pero antes de hacerlo te fuerzas a considerar las potencials consecuencias y a tomar medidas para evitarlas si procede, con lo que tus programas ser'an m'as robustos y fiables.

    viernes, 13 de octubre de 2017 9:41
  • Hola:

    Entiendo que por 'reducir' te refieres a que vaya más rápido ;-). El problema lo tienes que tienes unas comprobaciones (If... Then & Select Case) que son fijas, solo es necesario calcularlas 1 vez, pero las tienes dentro del bucle, así que se ejecutan 'n' veces. Sacando esas comprobaciones fuera del bucle tendrías solucionado el mayor problema. Luego, reducir o no el código es ya cada uno. Yo si, por ejemplo, si en un bucle 'largo' voy a usar una propiedad de un control, me creo una variable local que siempre es más rapida ;-)

    En tu caso, yo lo 'reduciría' así:


    Sub config_Estock()
       XmlDocument_Configuracion = New XmlDocument            
     XmlDocument_Configuracion.Load("Configuracion/Configuracion.xml")
       XmlNodeList_Configuracion = XmlDocument_Configuracion.SelectNodes("Configuracion/Estock")
    
    ' Configuramos bTmp SOLO una vez para ser usada dentro del bucle
       Dim bTmp As Boolean = If(Sb_Estock1.Focused, Sb_Estock1.Value, Not Sb_Estock2.Value)
    
       For Each node As Xml.XmlNode In XmlNodeList_Configuracion
          node.ChildNodes(0).InnerText = bTmp
          node.ChildNodes(1).InnerText = Not bTmp
       Next         
      
     XmlDocument_Configuracion.Save("Configuracion/Configuracion.xml")
    End Sub

    Un saludo


    • Editado LG DES viernes, 13 de octubre de 2017 10:49
    • Marcado como respuesta JETET viernes, 13 de octubre de 2017 15:58
    viernes, 13 de octubre de 2017 10:48
  • Muchisimas gracias a todos por responder 

    el que va mucho mejor es este

    XmlDocument_Configuracion = New XmlDocument
    XmlDocument_Configuracion.Load("Configuracion/Configuracion.xml")
    XmlNodeList_Configuracion = XmlDocument_Configuracion.SelectNodes("Configuracion/Estock")
    
    If Sb_Estock1.Focused Then Sb_Estock2.Value = Not Sb_Estock1.Value
    If Sb_Estock2.Focused Then Sb_Estock1.Value = Not Sb_Estock2.Value
    
    For Each node As Xml.XmlNode In XmlNodeList_Configuracion
    	node.ChildNodes(0).InnerText = Sb_Estock1.Value
    	node.ChildNodes(1).InnerText = Sb_Estock2.Value
    Next
    
    XmlDocument_Configuracion.Save("Configuracion/Configuracion.xml")

    viernes, 13 de octubre de 2017 15:57