RodrigoToroIcarte / IIC2113-2023-1

6 stars 0 forks source link

Dudas Clean Code #45

Open felipefuentesporras opened 1 year ago

felipefuentesporras commented 1 year ago

Hola! Tengo 4 dudas respecto al uso de clean code.

1.- Cual será el criterio para el paso de argumentos en las funciones? Que lo mejor es no pasar ni un argumento, pero lo que si había que evitar es pasar 3. En este sentido, si paso 2 no habría problema? 2.- En el documento se habla del uso de switch y de que es inevitable utilizarlos. No me queda claro en que contextos se justificaría usarlo. 3.- Es una mala practica tener un if dentro de un for? Suponiendo que no me paso de usar 5 lineas de la función. Pregunto por ejemplo, por casos en que quiero hacer esto:

lista_objetos for i...n if criterio1 lista_objeto.append(objeto) end if end for

Que no veo como podria hacerlo teniendo el if aislado en otra función.

4.- Y finalmente, si tengo esto: if criterio { función() }

Este código se cuenta que tiene 2 líneas o 4?

De antemano gracias!!

RodrigoToroIcarte commented 1 year ago

Hola Felipe,

Son buenas preguntas y creo que vas bien encaminado con la materia del curso. Clean code es mucho de mirar nuestro código y cuestionarnos si hay algo que pudimos hacer mejor. La respuesta no siempre es obvia pero llegará a ti si lo intentas :)

Acá respondo tus preguntas:

  1. El criterio es "minimizar la cantidad de argumentos que reciben tus funciones". Hay veces en que tus funciones tendrán que recibir 2 argumentos y no hay nada que hacer. Pero si tienes una función con n argumentos es deseable que pienses si existe alguna forma de reducir el número de argumentos que recibe. En ese sentido si para el ayudante resulta obvio cómo pasar de 2 a 1 argumento entonces te lo pondrá en los comentarios y penalizará ligeramente tu nota. Lo mismo ocurre con el largo de funciones. La regla no es 5 líneas y ya está limpia. La regla es minimizar el número de líneas de tus funciones siempre que sea posible. Entonces si tienes una función con 5 líneas que incluye un for con 4 líneas dentro eso es muy achicable (basta con mover esas 4 líneas a otro método). En ese caso el ayudante también lo mencionará.

  2. Primero que nada es bueno recordar a qué se refiere el libro cuando ataca los switch. La crítica va en que si usamos mal herencia y polimorfismo (o si simplemente no la usamos) terminaremos con códigos que tienen switch por todos lados. Esos códigos resultan imposibles de mantener y son una señal de mal diseño. El libro es muy crítico ante esos caso. Un ejemplo de esto sería que manejaras los efectos de las cartas sin usar herencia. Eso te obligaría a tener cadenas de ifs por todos lados para manejar sus efectos. Para esta entrega creo que una situación donde vas a necesitar varios ifs/switch es para manejar los enums que te da la vista y así hacer lo que te pide el usuario. Lamentablemente no hay mucho que se pueda hacer ahí más que tener un if por cada caso. Dicho eso, los cuerpos de los ifs deberían ser llamados a otros métodos que manejen esos casos. Eso permitirá que el código de la función sea lo más corto posible. Y si el ayudante ve una forma obvia de mejorar tu código lo pondrá en los comentarios. Pero recuerda que eso igual es bueno. El objetivo es que tu nota de clean code vaya mejorando entrega a entrega (cada nueva entrega vale un porcentaje más alto de la nota del proyecto). Mientras más feedback recibas mejor. Curiosamente, el caso al que se refiere el libro sobre donde se justifica un switch es otro. El switch se justifica en la creación de objetos. Digamos que tienes una clase por cada habilidad de las superestrellas. Entonces tienes una clase Kane, una clase HHH, etc. Lo que ocurrirá es que para crear a la superestrella apropiada vas a necesitar un switch (o una cadena de ifs) que cree el objeto apropiado según el nombre de la carta (y ahí no hay nada que hacer, vas a tener que poner un switch o algo equivalente):

    private Superstar BuildSuperstar(string superstarName)
    {
    if(superstarName == "KANE")
        return new Kane();
    if(superstarName == "HHH")
        return new HHH();
    if(superstarName == "THE ROCK")
        return new TheRock();
    // ...etc...
    }
  3. El if dentro del for está limpio. En particular en el ejemplo que das no me hace sentido pasar el if a otra función porque la idea es filtrar elementos de una lista. Esto es idéntico al ejemplo que vimos en la clase sobre funciones para obtener las celdas con banderas en el buscaminas (clase 12, diapo 11).

  4. Cuenta como 2 líneas. No hay que considerar los brackets al contar líneas. Igual recuerda que el objetivo no es llegar a las 5 líneas. Es minimizar el número de líneas de tus funciones mediante extraer bloques de código a otros métodos hasta que ya "no tenga sentido seguir extrayendo". Existen casos donde te quedarán funciones con 7 líneas y estará bien. Pero siempre cuestiona si es posible extraer algo de ahí o hacer un refactoring que te permita hacer lo mismo pero con funciones más cortas.

Me tomó mucho tiempo escribir esta respuesta. Ojalá te haya servido. Si te quedan dudas pregunta no más :)

felipefuentesporras commented 1 year ago

Muchas gracias profe, me quedo super claro, y gracias por su tiempo

felipefuentesporras commented 1 year ago

Profesor, una consulta más. Que recuerdo al inicio de semestre comento que no le importaba si usábamos chatgpt para ayudarnos a programar. Quería saber si esto siguen en pie, que me estoy apoyando en esto para hacer clean code de mi codigo.

RodrigoToroIcarte commented 1 year ago

No me importa que uses chatgpt. Aunque veo dos posibles problemas:

  1. Si tu código aparece en nuestra detección de copias será difícil que nos convensas que es coincidencia por haber usado chatgpt.
  2. En el examen no podrás usar chatgpt... entonces no sé si sea buena idea que lo uses en el proyecto.

Eso. El objetivo de este mensaje es simplemente compartir información. Al final tú decides qué hacer :)

felipefuentesporras commented 1 year ago

Perfect! Gracias profe