Ho sentito la frase che viene lanciata in giro e per me gli argomenti sembrano completamente pazzi (mi dispiace se sto facendo impazzire qui, non è mia intenzione), generalmente va qualcosa del tipo di:
Non vuoi creare un'astrazione prima di sapere qual è il caso generale, altrimenti (1) potresti mettere cose nelle tue astrazioni che non appartengono o (2) omettere cose di importanza.
(1) A me sembra che il programmatore non sia abbastanza pragmatico, hanno ipotizzato che nel programma finale esistessero cose che non lo fanno, quindi stanno lavorando con un livello di astrazione basso, il problema non è astrazione prematura, è concrezione prematura.
(2) Omettere cose importanti è una cosa, è del tutto possibile che qualcosa sia omesso dalle specifiche che in seguito si rivelano importanti, la soluzione a questo non è quella di inventare la tua concrezione e sprecare risorse quando ti scopri indovinato, è per ottenere maggiori informazioni dal client.
Dovremmo sempre lavorare dalle astrazioni fino alle concrezioni poiché questo è il modo più pragmatico di fare le cose, e non viceversa.
Se non lo facciamo, rischiamo di fraintendere i clienti e creare cose che devono essere cambiate, ma se costruiamo solo le astrazioni che i clienti hanno definito nella loro lingua, non corriamo mai questo rischio (almeno in nessun luogo vicino come probabile uno scatto nel buio con un po 'di concrezione), sì, è possibile che i clienti cambino idea sui dettagli, ma le astrazioni che hanno usato per comunicare in origine ciò che vogliono tendono ad essere ancora valide.
Ecco un esempio, supponiamo che un cliente desideri che tu crei un robot di insacco di oggetti:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Stiamo costruendo qualcosa dalle astrazioni utilizzate dal cliente senza entrare nel dettaglio con cose che non conosciamo. Questo è estremamente flessibile, ho visto questo essere chiamato "astrazione prematura" quando in realtà sarebbe più prematuro ipotizzare l'implementazione del bagging, diciamo dopo aver discusso con il cliente che vogliono che più di un articolo venga insaccato in una volta . Per aggiornare la mia classe tutto ciò di cui ho bisogno è cambiare la firma, ma per qualcuno che ha iniziato dal basso verso l'alto potrebbe comportare una revisione del sistema di grandi dimensioni.
L'astrazione prematura non esiste, ma solo la concrezione prematura. Cosa c'è di sbagliato in questa affermazione? Dov'è il difetto nel mio ragionamento? Grazie.