¿Hay una mejor manera de programar sin if y else en PHP?

Como todas las herramientas, depende de cómo lo use.

Como comentó Alex Fortune, el polimorfismo es la respuesta generalmente aceptada, y como Jaanis Kruumins responde, no hay nada de malo si se usa correctamente. Como él dice, no es un patrón “malo”.

Creo que es útil examinar ese umbral como una cuestión de costo, para el desarrollador por mantener el código y para el propietario, para mitigar el riesgo de que los costos del código excedan el valor del código.

El mayor costo que veo es tener múltiples bloques if-else en la misma función o incluso diferentes áreas del proyecto, que dependen de la misma condición para operar. Este es un peligro de “aliasing”. Si alguien cambia incluso una de esas condiciones y no puede cambiarlas todas, entonces el código se volverá incoherente. Como no hay salvaguardas en tiempo de compilación para que esto no ocurra, este es un problema grave.

El polimorfismo lo resuelve seleccionando todas las rutas de código A frente a las rutas de código B a la vez. La condición se evalúa solo una vez, para determinar qué objeto se instancia. A partir de ese momento, la condición no necesita ser reevaluada.

¿Cuándo es demasiado el polimorfismo? En cualquier lugar que una condición se evalúa exactamente una vez para estar seguro. El umbral puede ser mayor cuando considera la cantidad de código que debe invertirse.

(Modo despotricado activado)

Parece haber una tendencia reciente de patrones de programación extraños. Alguien tiene una idea genial acerca de que las expresiones condicionales son malas porque aumentan la complejidad y luego las personas hacen todo tipo de, perdón por el eufemismo, programación a través del imbécil para evitar los patrones “malos”.

En realidad, no hay exactamente nada malo con if y else. No hay nada malo incluso con goto, si sabes lo que estás haciendo (aunque esto es poco probable). Su objetivo es hacer que un programa sea correcto y fácil de mantener. A nadie le importa realmente cómo se hace, siempre que haga que el programa sea correcto y fácil de mantener.

Finalmente, hay programación funcional donde los patrones son ligeramente diferentes. Pero PHP no tiene nada que ver con eso, en su mayor parte.

(modo rant desactivado)

Sí, se llama polimorfismo.

Considere seguir el fragmento de código que calcula la cantidad de puntos de fidelidad dados al usuario y el precio:

class LoyaltyPointsCalculator
{

función pública CalculateLoyaltyPointsFor (Usuario $ u, $ precio)
{
if ($ u-> isVip ()) {
devolver $ precio * 5;
}

devolver $ precio * 2;
}

}

Para deshacerse de eso si, podría refactorizarlo a una interfaz y crear dos implementaciones:

interfaz LoyaltyPointsCalculator {
función pública CalculateLoyaltyPointsFor (Usuario $ u, $ precio);
}

La clase VipLoyaltyPointsCalculator implementa LoyaltyPointsCalculator {
función pública CalculateLoyaltyPointsFor (Usuario $ u, $ precio)
{
devolver $ precio * 5;
}
}

La clase RegularLoyaltyPointsCalculator implementa LoyaltyPointsCalculator {
función pública CalculateLoyaltyPointsFor (Usuario $ u, $ precio)
{
devolver $ precio * 2;
}
}

Tenga en cuenta que, a veces, en realidad es mejor tener una declaración if en lugar de introducir el polimorfismo para una mejor expresión (especialmente cuando trata con los parámetros del método, como aquí, solo quería mostrar el método), pero generalmente es seguro asumir que es mejor refactorizar a una interfaz, ya que es más fácil de mantener y refactorizar más tarde que una instrucción if.

operador ternario $ foo = $ p? $ if: $ else o switch .. case. Si es demasiado tipeo, use plantillas u otro idioma (ocaml / haskell / ruby) eventualmente tendrá declaraciones de casos más cortas o más potentes.

More Interesting

¿Cuál es el mejor generador de XML Sitemap para MacOSX?

¿Cuáles son algunos buenos libros para aprender HTML, CSS, PHP, MySQL y JavaScript con ejercicios prácticos para que pueda practicar lo que aprendo en cada capítulo?

¿Hay una compañía de TI en India que no esté utilizando ningún marco para el desarrollo de Java? No tengo conocimiento de Spring Frame y solo quiero saber si un marco se usa necesariamente en el desarrollo de Java en TI en India. Si es así, ¿por qué?

¿Cuál es una buena herramienta para rastrear el tiempo de carga de la página frontal?

¿Tienes alguna idea sobre cómo hacer un sitio web de reserva de vuelos? De principio a fin.

¿Qué lógica de programación se usa para agrupar elementos similares en un flujo de actividad social?

¿Dónde puedo encontrar trabajos de diseño web?

¿Cómo extraigo datos XML de un sitio web?

¿Cuál debo elegir: MediaWiki o Tiki Wiki?

Cómo saber cuántas veces se ha visitado una página web específica (no un sitio web) de cualquier sitio web en la web

¿Qué tan fácil o difícil es para un programador de .NET MVC crear una aplicación web increíble usando PHP?

¿Cuál es la diferencia entre sitios web optimizados para dispositivos móviles y sitios web receptivos?

¿Puedo construir un equipo sin dinero para crear una plataforma?

¿Cómo hago para que las personas conozcan mi nuevo sitio?

¿Cuántos botones CTA debo poner en una página de inicio? ¿Hay alguna investigación al respecto? Quiero saber si hay alguna mejor práctica.