Evitar efectos colaterales
Clase 10 de 26 • Curso de Patrones de Diseño y Buenas Prácticas en PHP
Contenido del curso
Clase 10 de 26 • Curso de Patrones de Diseño y Buenas Prácticas en PHP
Contenido del curso
Miguel Angel Soler
Héctor Hugo Sandoval Marcelo
Bernardo Aguayo Ortega
Javier Eduardo
Alejandro Dh
Juan Pablo Campuzano Monsalve
Carlos Eduardo Gomez García
Andrés Felipe Lopez gomez
German David Lievano Suarez
Emmanuel Hernández Morán
Oscar Daniel Bernal Guzman
Jherom Chacon
Bernardo Aguayo Ortega
GARCIA CAMARENA EZEQUIEL
Julian Carelli
Lyn Harold Grimaldo Mantilla Lobaton
Guillermo Ruiz Alvarado
Cristian Florez
Moisés Cedeño
Jaime Andres Valencia Gaviria
Hanssel Neira
Mayra Lopez
Eduardo Reyes
Cristian Andres Ladino Peña
Rafael Soriano Ramírez
Ivan Aguilar Huelitl
Jhony Alexander Garcia Gómez
CASAREZ HINOSTROZA ANGEL ARIEL
Eddy Arellanes
Danelia Sanchez Sanchez
David Antonio Ordóñez Cornejo
Para evitar efectos colaterales, les recomiendo el curso de scope y clousures en js, si bien está hecho para JS, se puede entender la importancia de mantener la integridad de la data, otorgando ámbito a las variables.
Gracias por el consejo bro
Gracias migue, cuando acabe este iré a ver ese
Oh gracias!! 😎
Que gran aporte!
Lo mejor es no usar estas variables globales, sin embargo, a veces son necesarias, por ejemplo en casos donde tienes un flag y necesitas evaluar ciertas condiciones, en ese caso el flag debe ser global, pero la diferencia es que tu sabes de entrada que ese flag va a cambiar su valor, en el ejemplo de esta clase no tenías ni idea de que iba a cambiar, ahí está la diferencia
Gracias por la aclaracion
Ademas que si los programadores que hicieron el programa PHP inventaron esa opcion, no era para no usarla o sino para que la crearon? Pienso tambien un poco lo mismo lo que hay que saber es como usarla, yo he visto lo mismo con otros programas, la gente dice no usar una herramienta, argumenta porque no se debe usar, pero no enfatiza en el hecho que existe y la crearon para usar esa herrramienta...
Reto
Reto 4 La clase Orden es un ejemplo de código no modularizado, ya que contiene varios métodos que podrían extraerse.
Reto 4b El método process de la clase ProjectManagement cuenta con una condición por cada tipo de parametro que recibe, y dependiendo de éste ejecuta cierto método exclusivo de cada clase. Por lo que si en un futuro se crea una nueva clase, el método process tendrá que ser modificado.
Las clases Programmer y Tester podrían hacer uso de una interfaz que cuente con un método work por ejemplo, y cada clase implementaría ese método a sus necesidades.
Al realizar este cambio, el método process quedaría más limpio ya que podría llamar un método que todas la clases tienen en común, en lugar de evaluar la clase del parámetro que recibe y con base en eso ejecutar el método correspondiente
Reto 4c La clase Animal cuenta con una función llamada fly sin embargo, no todos los animales pueden volar. La clase Dog, al heredar de la clase Animal, abre la posibilidad de que se pueda a llamar este método desde clase Dog, por lo que el código sobreescribe el método heredado para evitar que éste se pueda ejecutar, lo cual no me parece lo más adecuado. Esto se puede resolver removiendo el método fly de la clase Animal, y creando una nueva clase Ave que herede de Animal y que cuente con su propio método fly. De esta manera, las clases que hereden de **Animal **en un futuro no tendrán el método **fly **disponible, y las clases que hereden de Ave sí tendrán el método fly disponible,
Reto 4d La clase Consultant no implementa el método collate. Si una clase no implementa todos los métodos de la interfaz de la cual extiende, entonces no debería de extender de esa interfaz.
Reto 4e La clase ContadorDeManzanas podría ser un poco más generica y de este modo sería reutilizable. Actualmente, si queremos obtener el numero de manzanas de un manzano, tenemos que crear una instancia de ContadorDeManzanas. Si tuvieramos 100 instancias de Manzano, y quisieramos obtener el numero de manzanas de cada uno de ellos, tendríamos que crear 100 instancias de ContadorDeManzanas, lo cual no me parece eficiente.
Tu respuesta fue la que más me ayudó a entender los retos, gracias por tu aporte!
Es importante conocer las características del lenguaje de programación con el que se está codificando. Por ejemplo, yo en realidad no conozco PHP, pero en otros lenguaje de programación compilados y orientados a objetos, existe algo llamado el ámbito de las variables, concepto que evita (o busca evitar) lo que conocemos cómo código espagueti. Hablando estrictamente de las variables globales, si bien estas deben ser usadas al mínimo, siguen siendo un recurso que es importante tener en cuenta, no son prohibidas, solamente hay que saber usarlas, y por supuesto: evitar que se modifiquen una vez asignadas, por ejemplo las variables de inicio de sesión que necesitaremos para validar el acceso por roles a distintas partes de nuestros sistemas. Un par de links al respecto: Ámbito Espagueti Variables globales
Gracias hermano, increíble info
Nota Clase: algo que sucede algo más allá del código del código que se esta leyendo, un ejemplo de esto es la modificación de una variable global. Mas preciso es realizar cosas que no van el la función, es decir que la función no haga mas de una cosa, lo que indica su nombre.
Logré hacer un par de retos y aca muestro los resultados.
Reto4A.php
Reto4B.php
Reto4C.php
Reto4E.php
Reto se usa mismo nombre de variable para asignar el valor normalizado, esto inducirá side effects.
$empl_num = str_replace("?", 'Ñ', $empl_num);,
Reto4e no entendí bien, pero imagino que la variable manzanas al ser private en la clase Manzano, siempre retornará un array vacío.
Reto4b no encontre side effects.
Reto4 no encontre side effects.
Reto4d El hecho de extender la función UnderlingInterface, y exponer el mismo nombre de función en distintas clases de manera global generará side effects.
Recto4c Similar al reto 4d, se tiene el mismo nombre de función que tiene scope global en distintas clases.
¿Cuando es recomendable usar variables globales?
No uses variables globales.
Cuando necesitas usar una variable en todo el cuerpo de tu aplicación.
No se me viene a la mente un buen uso para una variable global. Es más, las buenas prácticas recomiendan el evitar en lo posible el uso de variables globales:
En este vídeo tratan acerca de las variables globales y constantes.
resumen patatero, nunca usar variables globales y tener especial cuidado al alcance o scope de las mismas en su contexto especifico de uso
En estos retos no hay una solución propuesta, o algo con lo que uno pueda contrastar las respuestas de los retos? Es que veo que varios a ninguno le dieron feedback.
Hola, principalmente damos FB a los que tiene dudas,y no todos los restos tiene un solucioón única. si tu tienes alguna duda o pregunta especifica con gusto intentaremos responderla
🍃 Debemos analizar muy bien nuestro código para evitar efectos colaterales y evitar que nuestro código deje de funcionar. Un consejo de nuestro profesor en esta clase: No uses variables globales.
El uso de variables globales en este código puede ser una mala práctica por varias razones:
<?php $nombre = 'Mauro'; $edad = 18; imprimirDatos(); if ( esMayorDeEdad( $edad ) ) { echo 'Es mayor!'; } function esMayorDeEdad( int $edad ) { return $edad > 18; } function imprimirDatos() { GLOBAL $edad, $nombre; echo "$nombre: $edad"; $edad++; }
En el ejemplo proporcionado, la función imprimirDatos() utiliza la declaración GLOBAL para acceder a las variables $nombre y $edad. Esto hace que la función dependa directamente de las variables globales, lo que puede hacer que sea más difícil de entender y depurar el código.
En lugar de utilizar variables globales, es una buena práctica utilizar argumentos de función y valores de retorno para comunicar información entre funciones, lo que hace que el código sea más modular y fácil de entender. En el ejemplo anterior, sería mejor pasar las variables $nombre y $edad como argumentos a la función imprimirDatos() y devolver el valor modificado de la edad, en lugar de modificar la variable global.
Reto 4a - No veo muy claro que se puede mejorar.
Reto 4b -
<?php class Programmer { public function actionCoding() { return 'coding'; } } class Tester { public function actionTesting() { return 'testing'; } } class ProjectManagement { public function printAction($member) { if ($member instanceof Programmer) { $member->actionCoding(); } elseif ($member instanceof Tester) { $member->actionTesting(); }; throw new Exception('Invalid input member'); } }
Reto 4c - Creo que la función Fly ya existe en la clase Animal y al extenderlo en la clase Dog no hace falta declarar la función nuevamente en Dog ya que ha sido heredada de Animals.
<?php class Animal { public function fly() { } } class Dog extends Animal { fly(){ if (! $this->hasWings) { throw new Exception; } } }
Reto 4d - Algo confundido en esta 🤔
Reto 4e - Solo vi un error en el nombre de construct
public function __construct(Manzano $manzano)
Algo que es de mucha ayuda para evitar efectos colaterales es hacer el código modular
Reto
Se puede usar una clase para traerse los datos de cada fila e identificar que es lo que hace especificamente o para que son esos datos
En el reemplazo del caracter se podría usar una función y así podemos reutilizar código, en este mismo punto se estan usando 2 tipos de estandares para definir variables
La condicion debería moverse a una funcion
Definicion explicita de que es hora, horas
Reto4
Reto4b
Reto4c
Definicion de funcion innecesaria ya que no todos lo animales vuelan
No hay funciones que seten la información
Reto4d
Reto4e
No utilizar variables globales
Un efecto colateral es algo que sucede mas halla del codigo que se esta leyendo
Las funciones puras, que vienen del concepto de Programación Funcional. Evitan los side effects x)
Esto me recuerda a programación funcional en Javascript.
Esta clase nos lleva sin querer al maravilloso mundo de la programación funcional, donde las buenas practicas suceden sin que te des cuenta que las estas haciendo.