Ich habe gehört, wie der Satz herumgeworfen wurde, und für mich klingen die Argumente völlig verrückt (sorry, wenn ich hier Strohmann bin, es ist nicht meine Absicht), im Allgemeinen geht es etwas in der Art von:
Sie möchten keine Abstraktion erstellen, bevor Sie den allgemeinen Fall kennen. Andernfalls (1) können Sie Dinge in Ihre Abstraktionen einfügen, die nicht dazu gehören, oder (2) wichtige Dinge weglassen.
(1) Für mich klingt dies so, als ob der Programmierer nicht pragmatisch genug ist. Sie haben Annahmen getroffen, dass Dinge im endgültigen Programm existieren würden, die dies nicht tun. Sie arbeiten also mit einem zu geringen Abstraktionsgrad, das Problem ist es nicht vorzeitige Abstraktion, es ist vorzeitige Konkretion.
(2) Das Weglassen wichtiger Dinge ist eine Sache. Es ist durchaus möglich, dass etwas in der Spezifikation weggelassen wird, das sich später als wichtig herausstellt. Die Lösung hierfür besteht nicht darin, Ihre eigene Konkretion zu finden und Ressourcen zu verschwenden, wenn Sie es herausfinden falsch geraten, um mehr Informationen vom Kunden zu erhalten.
Wir sollten immer von Abstraktionen bis hin zu Konkretionen arbeiten, da dies die pragmatischste Art ist, Dinge zu tun, und nicht umgekehrt.
Wenn wir dies nicht tun, riskieren wir, Kunden falsch zu verstehen und Dinge zu schaffen, die geändert werden müssen. Wenn wir jedoch nur die Abstraktionen erstellen, die die Kunden in ihrer eigenen Sprache definiert haben, sind wir diesem Risiko nie ausgesetzt (zumindest bei weitem nicht so wahrscheinlich wie das Eingehen ein Schuss in die Dunkelheit mit einer gewissen Konkretion), ja, es ist möglich, dass Kunden ihre Meinung über die Details ändern, aber die Abstraktionen, mit denen sie ursprünglich kommunizierten, was sie wollen, sind in der Regel immer noch gültig.
Angenommen, ein Kunde möchte, dass Sie einen Artikelverpackungsroboter erstellen:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Wir bauen etwas aus den Abstraktionen auf, die der Kunde verwendet hat, ohne näher auf Dinge einzugehen, die wir nicht kennen. Dies ist äußerst flexibel. Ich habe gesehen, dass dies als "vorzeitige Abstraktion" bezeichnet wird, obwohl es in Wirklichkeit verfrüht wäre anzunehmen, wie das Absacken implementiert wurde. Nehmen wir beispielsweise an, dass nach der Besprechung mit dem Kunden mehr als ein Gegenstand gleichzeitig verpackt werden soll . Um meine Klasse zu aktualisieren, muss ich nur die Signatur ändern, aber für jemanden, der von unten nach oben gestartet ist, kann dies eine umfassende Systemüberholung bedeuten.
Es gibt keine vorzeitige Abstraktion, nur vorzeitige Konkretion. Was ist falsch an dieser Aussage? Wo sind die Fehler in meiner Argumentation? Vielen Dank.