franciscogazitua / IIC2113-2024

Consultas sobre el proyecto en las Issues
2 stars 0 forks source link

Clean Code: Código duplicado para que cada función haga una sola cosa #37

Open jcarrascoa7 opened 2 months ago

jcarrascoa7 commented 2 months ago

Hola!

Tengo una duda respecto a cómo aplicar correctamente Clean Code en una situación donde chocan dos de sus filosofías:

1.- No duplicar código 2.- Que cada función haga una sola cosa.

La situación que me causa dudas es aquella en la que quiero validar más de una condición para un mismo atributo de una clase.

Por ejemplo, supongamos que existe una clase Ramo que tiene una lista de varios elementos de una clase Alumno. Cada alumno, a su vez, tiene una lista con todas sus notas obtenidas en ese ramo.

Supongamos que ahora me gustaría verificar que todas las notas estén entre 1 y 7 y que el número de notas esté entre 0 y el número de evaluaciones que se realizaron.

Se me ocurren dos posibles opciones:

1.- Crear dos funciones independientes donde cada una recorra la lista de todos los alumnos del ramo y luego de sus notas, verificando ambas condiciones por separado, pero repitiendo el código de iteración.

2.- Crear una única función que recorra una única vez la lista de alumnos y sus notas, verificando ambas condiciones dentro de esa iteración. En este caso no se duplicaría código, sin embargo, la función no cumpliría con hacer una única cosa a la vez ya que estaría validando dos cosas distintas.

A primera vista me quedaría con la opción 1, sin embargo, cada vez que leo el código veo el código de iteración duplicado y me hace ruido.

RodrigoToroIcarte commented 2 months ago

Tendría que ver un ejemplo con código pa cachar bien. Pero me parece que la segunda solución es mejor. Yo haría algo como esto:

public bool AreMarksCorrect(List<Student> course)
{
    foreach(Student student in couse)
        if(! AreMarksCorrect(student))
            return false;
    return true;
}

private bool AreMarksCorrect(Student student)
    => student.IsEveryMarkBetweenOneAndSeven() &&
         student.IsTheNumOfMarksCorrect();

... yo haría algo de ese estilo. Básicamente tendría un método de alto nivel que chequee si el elemento dentro del foreach (el estudiante en este caso) es válido. Y para ver si ese elemento es válido, tendría llamados a los distintos métodos que chequean cada condición. Así no tienes duplicado el foreach ni tienes que iterar más veces de las necesarias por las listas.

¿Esto responde tu pregunta? :)

jcarrascoa7 commented 2 months ago

Sí, me queda claro!

Muchas gracias!