Wann ist eine verallgemeinerte Lösung der Lösung bestimmter Fälle vorzuziehen?


18

Bei der Programmierung stehen wir oft vor der Wahl: decken Sie jeden denkbaren Anwendungsfall einzeln ab oder lösen Sie das allgemeine Problem:

XKCD - Das allgemeine Problem

Es liegt auf der Hand, dass die Lösung des unmittelbaren Problems schneller ist, die Erstellung einer allgemeinen Lösung jedoch in Zukunft Zeit spart.

Woher weiß ich, wann es am besten ist, eine endliche Liste von Fällen abzudecken oder ein generisches System zu erstellen, das alle Möglichkeiten abdeckt?


4
Warum so viele Abstimmungen?
Pureferret

3
Scheint mir eine vernünftige Frage zu sein. Es sieht so aus, als hätten Sie eine unvollendete Bearbeitung; Vielleicht möchten Sie sich darum kümmern.
Stuart Marks


@gnat das ist zwischen verschiedenen Programmen / Projekten. Ich frage nach im selben Projekt / Szenario.
Pureferret

Zu vage. Alle Fälle abdeckt ist das allgemeine Problem zu lösen. Danach geht es nur noch darum, wie Sie Ihren Code schreiben.
Caleb

Antworten:


29

Zuerst gibst du das Salz. Dann übergibst du den Pfeffer. Dann passiert man den geriebenen Parmesankäse. Zu diesem Zeitpunkt verfügen Sie über genügend Erfahrung, um mit der Entwicklung eines allgemeinen Systems zur Übergabe von Würzmitteln zu beginnen.

Es funktioniert in Softwareprojekten auf die gleiche Weise: Verwenden Sie Spezialsysteme, die Sie als Lernschritte entwickeln, bis hin zu verallgemeinerten. Wenn Sie also mit Ihrem Allzwecksystem beginnen, können Sie sich besser darauf verlassen, was Sie aufbauen Sie haben mehrere Spezialsysteme in der Tasche.


4
Das ist eine großartige Antwort!
Pureferret

Und deshalb rockt Agile.
Euphoric


9

Woher weiß ich, wann es am besten ist, eine endliche Liste von Fällen abzudecken oder ein generisches System zu erstellen, das alle Möglichkeiten abdeckt?

Erfahrung.

Die einzige Möglichkeit, es zu wissen, besteht darin, vorher einen Weg ausprobiert zu haben und zu sehen, wie er dich in den Arsch gebissen hat (oder du hast eine Menge Zeit verschwendet). Wiederholen, bis Sie weniger in den Arsch gebissen werden.

Selbst dann müssen Sie nicht wirklich wissen ; Sie haben nur eine bessere Vermutung.


3

Um auf den Antworten von dasblinkenlight und Paddy3118 aufzubauen , müssen Sie nicht verallgemeinern , wenn Sie nicht mehrere Fälle implementieren müssen! Der Grund, warum der XKCD-Cartoon lustig ist, ist, dass er eine vorzeitige Verallgemeinerung hervorruft . Auf die Aufforderung hin, das Salz weiterzugeben, springt der unsichtbare Charakter sofort zum "Entwickeln eines Systems, um willkürliche Gewürze weiterzugeben", wenn der erste Charakter, um den gebeten wurde, das Salz war. Dies ist ein guter Witz für Entwickler, da ich denke, wir alle Fälle vorzeitiger Verallgemeinerung gesehen haben.

Das Prinzip, das einer vorzeitigen Verallgemeinerung entgegengesetzt ist, ist YAGNI (You Ain't Goonna Need It). Im Internet sind viele Materialien zu diesem Thema verfügbar. Grundsätzlich weist YAGNI jedoch auf eine Reihe von Risiken bei der Verallgemeinerung hin, ohne dass mehrere tatsächliche Anwendungsfälle vorliegen, einschließlich der Möglichkeit, dass mehrere Anwendungsfälle möglicherweise nicht tatsächlich auftreten. Oder, subtiler, das Fehlen tatsächlicher Anwendungsfälle erfordert, dass man Annahmen darüber macht, was in Zukunft notwendig ist. Diese Annahmen können und sind oft falsch.


2

Im Kleinen scheint es einfacher zu sein, generisch zu sein. Bilden Sie also keine Klasse, um eine Nachschlagetabelle zu behandeln, die Ganzzahlen auf Zeichenfolgen abbildet, wenn Sie eine vernünftige Dictionary-Klasse erstellen können, die ein beliebiges Typenpaar behandelt (wobei der erste Typ einen bestimmten Typ unterstützt) Vergleich).

In einem früheren Leben habe ich viele industrielle Automatisierungsprojekte für Maschinen durchgeführt, die eine kontinuierliche Materialbahn handhabten. Stahl, Aluminium, Papier, Kunststoff, .... Sie wickeln es an einem Ende ab und am anderen wieder auf, nachdem Sie in der Mitte etwas Nützliches getan haben. In einer Branche startet man an der "Payoff Reel", nicht am "Abwickler". Wenn Sie die falsche Terminologie verwenden, sind Sie ein Idiot in den millionenschweren Augen des Kunden. Sie werden erstaunt sein, wie wenig von einem Projekt zum nächsten zur Wiederverwendung abstrahiert werden kann . OTOH, man könnte oft ein Framework oder Template als Ausgangspunkt erstellen. Es wäre auf die jeweilige Aufgabe zugeschnitten, hätte aber zumindest den Vorteil, aus früheren Projekten zu lernen. Und jeder im Team wusste, wo wir anfingen.


2

Mach es einmal, mach es zweimal, mach es dreimal, verallgemeinere.


1

Eins, zwei, viele!

Im zweiten Fall sollten Sie über Verallgemeinerungen nachdenken. Wenn Sie nach dem dritten gefragt werden, sollten Sie ihn aus dem verallgemeinerten Code bereitstellen und den ersten und den zweiten Fall, die zuvor einzeln gelöst wurden, als Testfälle verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.