User Tag List

Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 28

Tema: [PROGRAMACIÓN] ¿Hacer un SWITCH CASE con 200 opciones?

  1. #1

    Fecha de ingreso
    Dec 2005
    Ubicación
    Santiago de Compostela
    Mensajes
    519
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    19
    Agradecer Thanks Received 
    9
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts

    [PROGRAMACIÓN] ¿Hacer un SWITCH CASE con 200 opciones?

    Estoy trabajando con un proyectillo y me gustaría saber si existe alguna forma elegante de hacer la guarrada que estoy haciendo.

    ¿Cómo se hace en un texto tipo XML cualquiera para procesar el contenido de las etiquetas? Es decir, un navegador web cuando se encuentra el típico <b> </b> en una página web ¿cómo funciona? Si hubiese pocas opciones mi forma de pensar sería recorrer una lista de CASE buscando alguna que coincida con lo de dentro, pero si tienes 500 etiquetas posibles tiene que ser un gasto brutal de recursos así que me gustaría saber cómo se suele solucionar/gestionar eso. (me sirve un link o incluso las palabras mágicas que buscar en google)

    Me explico como el culo, gracias por molestaros en leer.

  2. #2

    Fecha de ingreso
    Sep 2006
    Ubicación
    Zaragoza
    Mensajes
    1,243
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,546
    Agradecer Thanks Received 
    139
    Thanked in
    Agradecido 110 veces en [ARG:2 UNDEFINED] posts
    Normalmente se utiliza XSLT para transformar el resultado XML a otro tipo de documento, inclusive otro XML.

    Si utilizas JAVA, JAXB es tu amigo.
    "256K son suficientes para cualquier tarea" Bill Gates

  3. El siguiente usuario agradece a romeroca este mensaje:

    ^MiSaTo^ (27/01/2015)

  4. #3

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Una solución es http://en.wikipedia.org/wiki/Command_pattern, envuelves el comportamiento en un objeto al que poder llamar, y creas y ejecutas ese objeto en vez de pasar por los switch cases. No vas a reducir código, sólo a moverlo, pero al menos es más mantenible. Y si hay 500 etiquetas con 500 comportamientos radicalmente distintos habrá 500 clases, no es descabellado.

    Los switch cases en si según el lenguaje se hacen por pattern matching, que se supone es bastante eficiente con la ayuda del compilador. En otros como java un case no es mas que un tag en un goto envuelto por el switch a un integer, de ahí que el break sea obligatorio para evitar falldowns.
    Última edición por pakoito; 27/01/2015 a las 18:39

  5. Los siguientes 2 usuarios agradecen a pakoito este post:

    NEKRO (27/01/2015), TRaFuGa (27/01/2015)

  6. #4

    Fecha de ingreso
    Jun 2005
    Ubicación
    Ourense
    Mensajes
    4,314
    Mencionado
    30 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    281
    Agradecer Thanks Received 
    223
    Thanked in
    Agradecido 129 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    No entendí una mierda, pero agradezco tu mensaje, de mayor quiero ser como tu

  7. #5

    Fecha de ingreso
    Dec 2003
    Ubicación
    Monte Tharsis
    Mensajes
    8,802
    Mencionado
    29 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    386
    Agradecer Thanks Received 
    238
    Thanked in
    Agradecido 166 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por TRaFuGa Ver mensaje
    No entendí una mierda, pero agradezco tu mensaje, de mayor quiero ser como tu
    Yo igual . Por si sirve de algo el hamigo popihm regala un CASE Logic aquí
    Última edición por NEKRO; 27/01/2015 a las 18:57

  8. #6

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Me estoy releyendo y parezco más ********** de lo normal :P

    A ver, en java hay
    switch (numero){
    case 0: loquesea(); break;
    case 1: otracosa(); break;
    default: nothing(); break;
    }
    internamente comparan el numero con los valores de las etiquetas "case X:", que ya ha indexado el compilador, asi que las encuentra en O(1). Las etiquetas no son código, son como anotaciones específicas para esa línea, luego se puede hacer goto para llegar a ellas. Si ignoras las etiquetas (ya que no son código) lo que tienes es un bloque de código, todo lo que está entre {}, que se va a ejecutar secuencialmente, y como no quieres que cuando encuentre 0 haga también el case 1 por ser la línea de debajo tienes que poner el break para que se salga del bloque.

    En otros lenguajes te dejan hacer switches con mas tipos, como cadenas o tipos multiples

    Rust
    Código:
    match number {
            // Match a single value
            1 => println!("One!"),
            // Match several values
            2 | 3 | 5 | 7 | 11 => println!("This is a prime"),
            // Match an inclusive range
            13...19 => println!("A teen"),
            // Handle the rest of cases
            _ => println!("Ain't special"),
        }
    o


    Código:
    let tup = (4, 5.0); 
    
    match x {
        (x,y) if x > y => { println("Decreasing"); }
        (x,y) if y > x => { println("Increasing"); }
        _              => { println("Equal")}
    }
    o incluso sólo encontrar partes o si son de un tipo concreto

    Código:
    let tup = (4, "sacapuntas"); 
    
    match tup {
    	(0, true) => println("Success"),
    	(_, true) => println("Pyrrhic victory"), // Any first value matches
    	(_, _) => println("Complete loss") // Any pair of values will match
    }

    La mayoría de estas cosas las deja preparaditas el compilador asi que cuando llega el código no tiene que hacer mucho esfuerzo, y en cómo de bueno es el rendimiento casos de ejemplo como éste, que además se parece a la pregunta original:

    http://www.cjqed.com/blog/rust-patte...g-performance/
    Última edición por pakoito; 27/01/2015 a las 19:31

  9. #7

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Si lo que quieres es parsear XML, ya hay un montón de XML parsers hechos en casi cualquier lenguaje. Busca por DOM XML parser por ejemplo y echa un ojo a cómo lo hacen.
    Hacer un command para algo así me parece un poco overkill.

  10. El siguiente usuario agradece a ^MiSaTo^ este mensaje:

    Jonazan2 (28/01/2015)

  11. #8

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Cita Iniciado por ^MiSaTo^ Ver mensaje
    Si lo que quieres es parsear XML, ya hay un montón de XML parsers hechos en casi cualquier lenguaje. Busca por DOM XML parser por ejemplo y echa un ojo a cómo lo hacen.
    Hacer un command para algo así me parece un poco overkill.
    Me juego pasta a que son los pesaos de la uni, con el lexx y el yacc y demás basuras de la clase de compiladores que te hacen hacer todo de cero sin usar librerías para aprender. Qué malos recuerdos para algo que realmente es infinitamente más simple.

  12. #9

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por pakoito Ver mensaje
    Me juego pasta a que son los pesaos de la uni, con el lexx y el yacc y demás basuras de la clase de compiladores que te hacen hacer todo de cero sin usar librerías para aprender. Qué malos recuerdos para algo que realmente es infinitamente más simple.
    Pues no me extrañaría xD

  13. #10

    Fecha de ingreso
    Dec 2005
    Ubicación
    Santiago de Compostela
    Mensajes
    519
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    19
    Agradecer Thanks Received 
    9
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    No, no es la uni, podría resumirse a: "Pero mira que son inútiles, ¿cómo pueden hacer algo así con tantos bugs?" + "¿A que no hay cojones?" + Un par de copitas

    Básicamente, que me quejé de lo inútiles que eren los programadores japoneses de VN por la inmensa cantidad de bugs que tenían y me han picado a hacerlo mejor, no lo haré pero al menos estaba mirando cómo se podría desarrollar un motor para crear VN y el mayor problema que me encuentro es a la hora de hacer un lenguaje de marcas y que el propio motor vaya leyendo de ahí y según lo que aparezca en el mismo ir cargando gráficos, posicinándolos y demás. Sí, podría usar renpy como una persona normal pero la gracia era pelear con SDL y hacerse uno mismo un mierdamotor. La cosa era eso, simplemente saber si existía una forma más eficiente de cara a carga de procesador que hacer un case (ojo, que inicialmente empecé con if anidados).

    En fin sólo eso, saber si existía algo más limpio/eficiente que hacer un case gigante, miraré algún parser XML ya hecho, gracias por la idea.

  14. #11

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    No crees un lenguaje de marcas a menos que sea estrictamente necesario, usa XML, JSON o YAML. Están ordenados de mejor a peor para el ordenador, y peor a mejor para el que lo escribe. Hay librerías para cargarlos en infinidad de lenguajes.

    XML está más orientado a documentos y marcas como lo que tu buscas; JSON y YAML están orientados a datos. Eso significa que si te pasas a uno de ellos te tienes que inventar tu propio set de tags y sus normas para ser interpretado por el parseador. He hecho algo parecido a pequeña escala para definir autómatas finitos, pero a gran escala es una tarea titánica porque el arbol sintactico se va de madre muy rápido. Por si te da un locurón y sigues queriendo usarlos, ésta es mi web preferida de referencia.
    Última edición por pakoito; 28/01/2015 a las 01:08

  15. #12

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    en cuanto a tu pregunta y en lenguaje llano:
    si tienes 500 comportamientos tendras 500 funciones, no? eso es dificil de evitar, y ademas es lo mas directo.

    luego, pues simplemente llama a cada funcion algo tipo funcVolar()

    y cuando te venga un <volar>si</volar> simplemente tienes que llamar a func$equiqueta()

    no se si me he explicado

  16. #13

    Fecha de ingreso
    Apr 2007
    Ubicación
    Rostovillar
    Mensajes
    3,783
    Mencionado
    11 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    1,016
    Agradecer Thanks Received 
    407
    Thanked in
    Agradecido 256 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por ^MiSaTo^ Ver mensaje
    Si lo que quieres es parsear XML, ya hay un montón de XML parsers hechos en casi cualquier lenguaje. Busca por DOM XML parser por ejemplo y echa un ojo a cómo lo hacen.
    Hacer un command para algo así me parece un poco overkill.
    Si el documento es medianamente grande yo usaría un parser SAX, levantar el arbol DOM de ese documento puede llevar muuucho tiempo y comer cantidades ingentes de memoria, y dependiendo de donde ejecute puede ser un problema.

    Tutorial de SAX para Java (no has puesto lenguaje)

    http://docs.oracle.com/javase/tutori...x/parsing.html

    Y para evitar el case gigante usar un proxy en el handler, como aqui:

    http://stackoverflow.com/questions/1...ontenthandlers
    Última edición por Nathrezim; 28/01/2015 a las 08:41
    Buy this car to drive to work. Drive to work to pay for this car.

  17. Los siguientes 2 usuarios agradecen a Nathrezim este post:

    romeroca (28/01/2015), ^MiSaTo^ (28/01/2015)

  18. #14

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por Nathrezim Ver mensaje
    Si el documento es medianamente grande yo usaría un parser SAX, levantar el arbol DOM de ese documento puede llevar muuucho tiempo y comer cantidades ingentes de memoria, y dependiendo de donde ejecute puede ser un problema.

    Tutorial de SAX para Java (no has puesto lenguaje)

    http://docs.oracle.com/javase/tutori...x/parsing.html

    Y para evitar el case gigante usar un proxy en el handler, como aqui:

    http://stackoverflow.com/questions/1...ontenthandlers
    Toda la razón, si es algo grande mejor SAX He puesto Dom porque es lo primero que se me vino a la cabeza pero es menos eficiente para cosas grandes.

  19. #15

    Fecha de ingreso
    Apr 2007
    Ubicación
    Rostovillar
    Mensajes
    3,783
    Mencionado
    11 Post(s)
    Tagged
    1 Tema(s)
    Agradecer Thanks Given 
    1,016
    Agradecer Thanks Received 
    407
    Thanked in
    Agradecido 256 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por ^MiSaTo^ Ver mensaje
    Toda la razón, si es algo grande mejor SAX He puesto Dom porque es lo primero que se me vino a la cabeza pero es menos eficiente para cosas grandes.
    DOM es más fácil de comprender y por tanto de codificar, ya depende de lo que quiera manejar el OP, para ficheros pequeños (de pocos megas) da igual. Eso teniendo en cuenta que solo quiera leer ficheros, si quiere crearlos no le queda otra que usar DOM (o cosas más nuevas como Stax).
    Buy this car to drive to work. Drive to work to pay for this car.

Página 1 de 2 12 ÚltimoÚltimo

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •