He escuchado la frase arrojándose y para mí los argumentos suenan completamente locos (lo siento si estoy dando vueltas aquí, no es mi intención), generalmente va algo en la línea de:
No desea crear una abstracción antes de saber cuál es el caso general, de lo contrario (1) podría estar poniendo cosas en sus abstracciones que no pertenecen, u (2) omitiendo cosas importantes.
(1) Para mí, esto suena como que el programador no está siendo lo suficientemente pragmático, han asumido que las cosas existirían en el programa final que no existe, por lo que están trabajando con un nivel de abstracción bajo, el problema no es abstracción prematura, es concreción prematura.
(2) Omitir cosas importantes es una cosa, es completamente posible que se omita algo de la especificación que luego resulta ser importante, la solución a esto no es crear su propia concreción y desperdiciar recursos cuando se entera de que adivinado mal, es para obtener más información del cliente.
Siempre deberíamos trabajar desde las abstracciones hasta las concreciones, ya que esta es la forma más pragmática de hacer las cosas, y no al revés.
Si no lo hacemos, corremos el riesgo de malinterpretar a los clientes y crear cosas que necesitan ser cambiadas, pero si solo construimos las abstracciones que los clientes han definido en su propio idioma, nunca correremos el riesgo (al menos ni tan cerca como tomar un tiro en la oscuridad con cierta concreción), sí, es posible que los clientes cambien de opinión sobre los detalles, pero las abstracciones que solían comunicar originalmente lo que quieren tienden a ser válidas.
Aquí hay un ejemplo, digamos que un cliente desea que cree un robot de ensacado de artículos:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Estamos construyendo algo a partir de las abstracciones que el cliente usó sin entrar en más detalles con cosas que no sabemos. Esto es extremadamente flexible, he visto que esto se llama "abstracción prematura" cuando en realidad sería más prematuro suponer cómo se implementó el ensacado, digamos después de discutir con el cliente que quieren que se empaquete más de un artículo a la vez . Para actualizar mi clase, todo lo que necesito es cambiar la firma, pero para alguien que comenzó desde abajo, eso podría implicar una gran revisión del sistema.
No existe la abstracción prematura, solo la concreción prematura. ¿Qué hay de malo en esta declaración? ¿Dónde están los defectos en mi razonamiento? Gracias.