Copy-und-Paste-Programmierung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Unter Copy-und-Paste-Programmierung versteht man das verbreitete Vorgehen, ein Programm oder einen Programmteil nicht "von Null" neu zu schreiben sondern ein etwa passendes Stück Quelltext zu kopieren und an die neuen Gegebenheiten anzupassen.

Vor- und Nachteile

Der große Vorteil von Copy-und-Paste-Programmierung ist die dadurch erreichte Wiederverwendung – warum das Rad immer wieder völlig neu erfinden, wenn das, was man braucht, schon anderweitig vorhanden ist und nur etwas angepasst werden muss?

Deshalb ist dagegen zunächst auch nichts einzuwenden, insbesondere sollte sich der Chef doch freuen, wenn man nach einem halben Tag "10.000 lines of code" aus dem Boden gestampft hat? Wird er auch – aber vielleicht auch nicht, abhängig davon, wie "geringfügig" die Anpassungen waren und ob hinterher noch jemand weiß, woher der Originaltext stammte und ob ggf. der Autor des Originals weiß, dass sein Programm die Vorlage für ein anderes war.

Je mehr gleichartiger Quelltext mit minimalen Variationen existiert, desto höher ist die Chance, irgendwo nachträglich noch einen Fehler zu finden, den eine andere Version auch enthält. Und so schön es ist, mit Copy-und-Paste-Programmierung in einem halben Tag fertig zu sein, so ärgerlich ist es, ein Jahr später nach drei Tagen Fehlersuche einen Bug zu finden, bei dem einem schließlich einfällt, dass man vor längerer Zeit genau die selbe Sache schon einmal an einem anderen Programm "reparieren" musste. Nur gut, wenn man jetzt noch weiß, welche weiteren Kopien mit dem selben Bug im Umlauf sind.

Alternativen

Spätestens wenn per Copy-und-Paste-Programmieren die dritte oder vierte nahezu übereinstimmende Version erstellt wird, sollte man nach besseren Möglichkeiten der Wiederverwendung suchen. Diese sind

  • Wiederverwendbare Unterprogramme (Assembler, C, C++, allg. prozedurale Sprachen)
  • Wiederverwendbare Klassen (C++, allg. Objektorientierte Sprachen)
  • Konfiguration über (Präprozessor-) Makros (Assembler, C, C++)
  • Wiederverwendbare Templates (C++, allg. Generische Programmierung)
  • Little Languages, problemspezifische Programgeneratoren

Der große Vorteil ist, dass der Quelltext in solchen Fällen nur ein einziges Mal existiert, nachträglich entdeckte Fehler somit auch nur einmal behoben werden müssen und evtl. Verbesserungen automatisch überall einfließen – vorausgesetzt, ein Konfigurationsmamagement sorgt für ggf. erforderliche Neuerstellungen.

Der große Nachteil ist, dass meist – bevor Wiederverwendung möglich ist – bestimmte Aspekte parametrisiert werden müssen, damit sie in zwei verschiedenen Verwendungen unterschiedliche Ausprägung haben können. Dies erfordert

  • zum einen Zeit, die betreffenden Stellen zu identifizieren und zu parametrisisieren,
  • birgt zum zweiten die Gefahr, Fehler in bisher funktionierende Programmteile einzubringen,
  • und hat manchmal eine gewisse Tendenz, am Ende übermäßig flexible und schwierig zu handhabende Komponenten zu produzieren, deren Komplexität in einer einzelnen Verwendung unnötigen Overhead verursacht.

Letzteres kann bei der Mikrocontroller-Programmierung ganz und gar unerwünschte Auswirkungen haben. Z.B. könnte ein Stack-Überlauf entstehen, weil an ein Unterprogramm zusätzliche Argumente übergeben werden müssen, oder Werte, die in einer einzelnen Verwendung eigentlich Konstanten sein könnten, stehen in Variablen (= mehr RAM-Bedarf, zusätzlicher Initialisierungs-Code).

Somit ist eine Abwägung wichtig, welcher der oben genannten Mechanismen für ein bestimmtes Problem am besten geeignet ist. Handelt es sich bei den parametrisierten Aspekten um Dinge, die bereits zur Kompilierzeit feststehen, sind C-Präprozessor-Makros, C++-Templates oder problemspezifische Programmgeneratoren in der Regel der optimale Weg.