Recientemente me encontré con la siguiente situación.
class A{
public:
void calculate(T inputs);
}
En primer lugar, A
representa un objeto en el mundo físico, que es un fuerte argumento para no dividir la clase. Ahora, calculate()
resulta ser una función bastante larga y complicada. Percibo tres posibles estructuras para ello:
- escríbalo como un muro de texto - ventajas - toda la información está en un solo lugar
- escribir
private
funciones de utilidad en la clase y usarlas encalculate
el cuerpo de la persona - desventajas - el resto de la clase no sabe / no se preocupa por esos métodos escribe de
calculate
la siguiente manera:void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); }
¿Se puede considerar esto una buena o mala práctica? ¿Este enfoque revela algún problema? Con todo, ¿debería considerar esto como un buen enfoque cuando me enfrento nuevamente a la misma situación?
EDITAR:
class A{
...
public:
// Reconfiguration of the algorithm.
void set_colour(double colour);
void set_density(double density);
void set_predelay(unsigned long microseconds);
void set_reverb_time(double reverb_time, double room_size);
void set_drywet(double left, double right);
void set_room_size(double value);;
private:
// Sub-model objects.
...
}
Todos esos métodos:
- obtener un valor
- calcular algunos otros valores, sin usar el estado
- llame a algunos de los "objetos de submodelo" para cambiar su estado.
Resulta que, con excepción set_room_size()
, esos métodos simplemente pasan el valor solicitado a los subobjetos. set_room_size()
, por otro lado, hace un par de pantallas de fórmulas oscuras y luego (2) hace media pantalla para llamar a los colocadores de subobjetos para aplicar los diversos resultados obtenidos. Por lo tanto, he separado la función en dos lambdas y las llamo al final de la función. Si hubiera podido dividirlo en partes más lógicas, habría aislado más lambdas.
En cualquier caso, el objetivo de la pregunta actual es determinar si esa forma de pensar debe persistir o, en el mejor de los casos, no agrega valor (legibilidad, facilidad de mantenimiento, capacidad de depuración, etc.).
Firstly, A represents an object in the physical world, which is a strong argument for not splitting the class up.
Seguramente A
representa datos sobre un objeto que podría existir en el mundo físico. Puede tener una instancia de A
sin el objeto real y un objeto real sin una instancia de A
, por lo que tratarlos como si fueran uno y lo mismo no tiene sentido.
calculate()
sabrá sobre esas subfunciones.
A
, eso lo lleva un poco al extremo.
A
representa un objeto en el mundo físico, que es un fuerte argumento para no dividir la clase". Desafortunadamente, me dijeron esto cuando comencé a programar. Me llevó años darme cuenta de que es un montón de hockey sobre caballos. Es una razón terrible para agrupar cosas. No puedo expresar cuáles son buenas razones para agrupar cosas (al menos para mi satisfacción), pero esa es una que debes descartar ahora mismo. Al final, todo de "buen código" es que funciona correctamente, es relativamente fácil de entender y es relativamente fácil de cambiar (es decir, los cambios no tienen efectos secundarios extraños).