Słyszałem, jak fraza jest rzucana na ziemię i dla mnie argumenty brzmią całkowicie szalone (przepraszam, jeśli mam tu słomkę, to nie moja intencja), ogólnie rzecz biorąc idzie coś w stylu:
Nie chcesz tworzyć abstrakcji, zanim dowiesz się, jaki jest ogólny przypadek, w przeciwnym razie (1) możesz umieszczać w swoich abstrakcjach rzeczy, które nie należą, lub (2) pomijając rzeczy ważne.
(1) Dla mnie brzmi to tak, jakby programista nie był wystarczająco pragmatyczny, przyjęli założenia, że w ostatecznym programie coś by nie istniało, więc pracują z niskim poziomem abstrakcji, problem nie jest przedwczesna abstrakcja, to przedwczesna konkrecja.
(2) Pominięcie ważnych rzeczy jest jedną rzeczą, jest całkowicie możliwe, że coś zostało pominięte w specyfikacji, która później okaże się ważna, rozwiązaniem tego nie jest wymyślenie własnej konkrecji i marnowanie zasobów, kiedy się dowiesz źle się domyśliłem, aby uzyskać więcej informacji od klienta.
Zawsze powinniśmy pracować od abstrakcji po konkrecje, ponieważ jest to najbardziej pragmatyczny sposób robienia rzeczy, a nie na odwrót.
Jeśli tego nie zrobimy, ryzykujemy nieporozumienie klientów i tworzenie rzeczy, które należy zmienić, ale jeśli zbudujemy tylko abstrakcje zdefiniowane przez klientów w ich własnym języku, nigdy nie narażymy się na to ryzyko (przynajmniej nie jest tak prawdopodobne, jak podjęcie strzał w ciemność z pewną konkrecją), tak, możliwe, że klienci zmieniają zdanie na temat szczegółów, ale abstrakcje, których używali, aby przekazać to, czego chcą, nadal są aktualne.
Oto przykład, powiedzmy, że klient życzy sobie stworzenia robota do pakowania przedmiotów:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Budujemy coś na podstawie abstrakcji, których używał klient, bez wchodzenia w szczegóły z rzeczami, których nie znamy. Jest to niezwykle elastyczne, widziałem to nazywane „przedwczesną abstrakcją”, podczas gdy w rzeczywistości bardziej przedwczesne byłoby zakładanie, jak realizowany jest workowanie, powiedzmy po rozmowie z klientem, że chcą, aby więcej niż jeden przedmiot był pakowany jednocześnie . Aby zaktualizować moją klasę, wystarczy zmienić podpis, ale dla kogoś, kto zaczął od podstaw, może to wymagać dużego przeglądu systemu.
Nie ma czegoś takiego jak przedwczesna abstrakcja, tylko przedwczesna konkrecja. Co jest złego w tym stwierdzeniu? Gdzie są wady mojego rozumowania? Dzięki.