Permítanme comenzar con esto diciendo que este no es mi código ni el de mis compañeros de trabajo. Hace años, cuando nuestra empresa era más pequeña, teníamos algunos proyectos que necesitábamos que no teníamos capacidad, por lo que fueron subcontratados. Ahora, no tengo nada en contra de la subcontratación o los contratistas en general, pero la base de código que produjeron es una masa de WTF. Dicho esto, funciona (en su mayoría), así que supongo que está en el 10% superior de los proyectos subcontratados que he visto.
A medida que nuestra compañía ha crecido, hemos tratado de tomar más de nuestro desarrollo en casa. Este proyecto en particular aterrizó en mi regazo, así que lo he estado revisando, limpiando, agregando pruebas, etc.
Hay un patrón que veo que se repite mucho y parece tan terrible que me pregunté si tal vez hay una razón y no la veo. El patrón es un objeto sin métodos o miembros públicos, solo un constructor público que hace todo el trabajo del objeto.
Por ejemplo, (el código está en Java, si eso importa, pero espero que sea una pregunta más general):
public class Foo {
private int bar;
private String baz;
public Foo(File f) {
execute(f);
}
private void execute(File f) {
// FTP the file to some hardcoded location,
// or parse the file and commit to the database, or whatever
}
}
Si se está preguntando, este tipo de código a menudo se llama de la siguiente manera:
for(File f : someListOfFiles) {
new Foo(f);
}
Hace mucho tiempo, me enseñaron que los objetos instanciados en un bucle generalmente son una mala idea y que los constructores deberían hacer un mínimo de trabajo. Mirando este código parece que sería mejor eliminar el constructor y hacer de execute
un método estático público.
Le pregunté al contratista por qué se hizo de esta manera, y la respuesta que obtuve fue "Podemos cambiarlo si lo desea". Lo que no fue muy útil.
De todos modos, ¿hay alguna razón para hacer algo como esto, en cualquier lenguaje de programación, o es solo otra presentación al Daily WTF?