Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Transformar IFs anidados en SWITCH-CASE

Estas en el tema de Transformar IFs anidados en SWITCH-CASE en el foro de PHP en Foros del Web. Transformar IFs anidados en SWITCH .. CASE por claridad : La duda es casi como "ser o no ser" .. sera que si ? Hace ...
  #1 (permalink)  
Antiguo 08/08/2013, 08:30
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Transformar IFs anidados en SWITCH-CASE

Transformar IFs anidados en SWITCH .. CASE por claridad:

La duda es casi como "ser o no ser" .. sera que si ?

Hace años que me debato entre hacer transformaciones rapidas que me permitan trabajar anidamientos de IF de forma lineal con SWITCH-CASE, esta muy mal ? :)

Ejemplo...

Código PHP:
Ver original
  1. if ($condA)
  2.         if (condB)
  3.             return fAB();
  4.         else
  5.             return fAnoB();
  6.     else
  7.         if (condB)
  8.             return fnoAB();
  9.         else
  10.             return fnoAnoB();

Transformacion ...


Código PHP:
Ver original
  1. switch ($condA*10 + condB)
  2. {
  3.     case (11): return fAB();
  4.     case (10): return fAnoB();
  5.     case (01): return fnoAB();
  6.     case (00): return fnoAnoB();
  7. }


Otra posible transformacion ...


Código PHP:
Ver original
  1. switch ($condA*2 + condB)
  2. {
  3.     case (3): return fAB();
  4.     case (2): return fAnoB();
  5.     case (1): return fnoAB();
  6.     case (0): return fnoAnoB();
  7. }


En general puedo pasar algo N-dimensional a uni-dimensional con este tipo de transformaciones con un costo muy pequeño en tiempo de ejecucion.

PD: es un ejemplo... logicamente no tienen porque ser "returns" en los CASEs
__________________
Salu2!
  #2 (permalink)  
Antiguo 08/08/2013, 09:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Transformar IFs anidados en SWITCH-CASE

Si no se entienden las condiciones del if-then-else entonces es absurdo transformar a switch-case no más por que sí.

Muestra código real, de otra forma no se entiende nada de lo que pretendes.

No hay una forma genérica para convertir ambas estructuras.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 08/08/2013, 09:22
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Transformar IFs anidados en SWITCH-CASE

Creo que este tipo de cuestiones queda a gusto personal, yo no soy muy dado a usar switch, porque me parece más legible/manejable con if's y llaves, pero tal vez tú prefieras otra opción y, no es que esté bien o mal, simplemente es lo que mejor te acomoda.

Por supuesto, es mi humilde opinión.
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 08/08/2013, 09:39
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Transformar IFs anidados en SWITCH-CASE

Cita:
Iniciado por pateketrueke Ver Mensaje
Si no se entienden las condiciones del if-then-else entonces es absurdo transformar a switch-case no más por que sí.

Muestra código real, de otra forma no se entiende nada de lo que pretendes.

No hay una forma genérica para convertir ambas estructuras.
Cada condicion puede ser LO QUE TU QUIERAS: ($nombre=='jose', $var!=null, $b<$a) ... diria que que es util cuando se procesan datos de entrada a una funcion / metodo.


No es algo "volado" ... lo he probado
__________________
Salu2!

Última edición por Italico76; 08/08/2013 a las 09:45 Razón: u
  #5 (permalink)  
Antiguo 08/08/2013, 09:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Transformar IFs anidados en SWITCH-CASE

¿De menos sí sabes como funcionan los switch-case?

A diferencia de if-then-else no esperan valores booleanos necesariamente, reciben cualquier valor y los case se encargan de hacer el matching.

Es por eso que una expresión booleana de un if-then-else no tiene el mismo significado en switch-case, pues en switch-case se esperan más de un tipo de valor, no una expresión booleana.

Vamos a ver tus "ejemplos".

Código PHP:
Ver original
  1. // ($nombre=='jose', $var!=null, $b<$a)
  2.  
  3. if ($nombre=='jose') {
  4. } elseif ($var!=null) {
  5. } elseif ($b<$a) {
  6. }
  7.  
  8. switch (/* ¿aquí cual de las tres expresiones colocarías ? */) {
  9.   case /* aquí que tipo de resultado esperarías */
  10. }

¿Verdad que no tiene sentido?

Ahora vamos a tratar de hacer lo mismo con switch-case usando un valor en común, un booleano.

Código PHP:
Ver original
  1. switch (true) {
  2.   case $nombre=='jose'; break;
  3.   case $var!=null; break;
  4.   case $b<$a; break;
  5. }

Y es exactamente lo mismo que el if-then-else, pero sigo sin ver la "ventaja" más alla del gusto por hacerlo así.

PDTA: Aun sigo tratando de entender lo que dices aquí:
Cita:
En general puedo pasar algo N-dimensional a uni-dimensional con este tipo de transformaciones con un costo muy pequeño en tiempo de ejecucion.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 08/08/2013, 12:35
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Transformar IFs anidados en SWITCH-CASE

Cita:
Iniciado por pateketrueke Ver Mensaje
¿De menos sí sabes como funcionan los switch-case?
Tu sabes hablar sin insultar o agredir ? haz el intento

Mira... he re-escrito el ejemplo que has planteado:

Código PHP:
// ($nombre=='jose', $var!=null, $b<$a)
 
if ($nombre=='jose') {
    echo 
'Jose';
} elseif (
$var!=null) {
    echo 
'Not null';
} elseif (
$b<$a) {
    echo 
'Menor';

Lo cual... yo lo escribiria (leer al final) asi:

Código PHP:
  switch (($nombre=='jose')*100 10*($var!=null) + ($b<$a))
    {
        case (
111):  break;
        case (
110):  break;
        case (
101):  break;
        case (
100):  echo 'Jose';     break;
        case (
11):  break;
        case (
10):  echo 'Not null'; break;
        case (
1):  echo 'Menor';    break;        
        case (
0):         
    } 
Y el resultado NO es el mismo PORQUE..... no es el objetivo (cosa que veo me falto explicar bien) --mi FAIL

El uso es demasiado particular y aplicaria solo cuando necesitas todas las combinaciones posibles de las condiciones evaluadas como FALSE / TRUE... en mi caso lo he usado para esto:

Código PHP:
    public function findSub(TagSequence $sub,$gaps=false,$deep=false)
    {
        if (!
is_bool($gaps))
            throw new 
InvalidArgumentException ("Gaps debe ser bool en ".__METHOD__); 

        if (!
is_bool($deep))
            throw new 
InvalidArgumentException ("Deep debe ser bool en ".__METHOD__);

        
tagSecuenceSearch::setHaystack($this);

        switch (
$gaps*10 $deep)
        {
            case (
11): return tagSecuenceSearch::findSubWithGapsWithDeep($sub);
            case (
10): return tagSecuenceSearch::findSubWithGapsNoDeep($sub);
            case (
1): return tagSecuenceSearch::findSubNoGapsWithDeep($sub);
            case (
0): return tagSecuenceSearch::findSubNoGapsNoDeep($sub);
        }
    } 
Reduciendo varios IF anidados... que incluso podrian ser 3 niveles (o dimensiones) si tuviera 3 condiciones distintas...

Que pensa sino fui claro..... pero POR FAVOR... NO ME AGREDAS.....GRACIAS
__________________
Salu2!

Última edición por Italico76; 08/08/2013 a las 12:41
  #7 (permalink)  
Antiguo 08/08/2013, 12:43
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: Transformar IFs anidados en SWITCH-CASE

Despues de leer los comentarios, me inclino por que esto es una eleccion mas de gustos... de todas maneras no he hecho la prueba con tiempos de ejecucion si es que efectivamente una u otra gana en ejecucion.

Seria algo como: "usar echo o print" o "usar comilla simple o doble" ?... (hay gente que le gustan gorditas y otros no )

Saludos!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #8 (permalink)  
Antiguo 08/08/2013, 12:56
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Transformar IFs anidados en SWITCH-CASE

Pues yo lo veo bastante rebuscado, a tal grado que no entiendo ni una papa de lo que haces con switch-case.

Al parecer estás haciendo trucos chinos para implementar bit-wise, que te permite exactamente lo mismo, pues estás convirtiendo los resultados booleanos en máscaras de bytes.

PDTA: ¿Yo agresivo?

No, para nada, soy directo.

Honestamente se me hace una pérdida de tiempo tu manera de hacer bit-wise.

Marvin, la programación no sólo se trata de gustos, se trata de escribir programas para que otros humanos lo entiendan, no al revés.

Usar if-then-else / switch-case no es una cuestión de "sabor", es una cuestión de legibilidad y claridad de lo que se expone.

Si todo fuera cuestión de gustos seguiríamos usando goto, la estructuras de control tienen razón de ser.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 08/08/2013, 13:02
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Transformar IFs anidados en SWITCH-CASE

Cita:
Iniciado por pateketrueke Ver Mensaje
Al parecer estás haciendo trucos chinos para implementar bit-wise, que te permite exactamente lo mismo, pues estás convirtiendo los resultados booleanos en máscaras de bytes.
Eso mismo......gracias
__________________
Salu2!
  #10 (permalink)  
Antiguo 08/08/2013, 16:39
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: Transformar IFs anidados en SWITCH-CASE

pateketrueke no estoy de acuerdo contigo pero que le vamos a hacer...

Con respecto a si esta mal o no... si necesitas llegar de un punto A a un punto B hay millones de posibilidades. Que este mal o no si tu planteamiento no fuese eficaz... podria discutirse, pero al menos en las dos opciones que presentas tienes un final feliz.

Saludos!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #11 (permalink)  
Antiguo 10/08/2013, 01:14
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Transformar IFs anidados en SWITCH-CASE

Cita:
Iniciado por Italico76 Ver Mensaje

Código PHP:
    public function findSub(TagSequence $sub,$gaps=false,$deep=false)
    {
        if (!
is_bool($gaps))
            throw new 
InvalidArgumentException ("Gaps debe ser bool en ".__METHOD__); 

        if (!
is_bool($deep))
            throw new 
InvalidArgumentException ("Deep debe ser bool en ".__METHOD__);

        
tagSecuenceSearch::setHaystack($this);

        switch (
$gaps*10 $deep)
        {
            case (
11): return tagSecuenceSearch::findSubWithGapsWithDeep($sub);
            case (
10): return tagSecuenceSearch::findSubWithGapsNoDeep($sub);
            case (
1): return tagSecuenceSearch::findSubNoGapsWithDeep($sub);
            case (
0): return tagSecuenceSearch::findSubNoGapsNoDeep($sub);
        }
    } 
Reduciendo varios IF anidados... que incluso podrian ser 3 niveles (o dimensiones) si tuviera 3 condiciones distintas...

Que pensa sino fui claro..... pero POR FAVOR... NO ME AGREDAS.....GRACIAS
Italico76 te comente algo relacionado con esto en otro consulta que hiciste. pero igual te recomiendo la misma lectura: http://www.informit.com/articles/art...98607&seqNum=2
y si puede lee el libro: Pro PHP Refactoring o el de Refactoring to Patterns
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: anidados, transformar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:04.