Die Wiederverwendung von Code ist eine ziemlich gute Idee. Kein großer .
Ich habe eine Perspektive aus ungefähr 30 Jahren Softwareentwicklung, die versucht, "wiederzuverwenden".
Ich begann in den 80er Jahren, die Wiederverwendung von Code als Forschungsthema zu untersuchen, nachdem ich herausgefunden hatte, dass ich das Design eines Betriebssystems, das ich in den frühen 70er Jahren gebaut hatte, für ein anderes Betriebssystem, das ich in den späten 70er Jahren gebaut hatte, wiederverwendet hatte.
Der gute Teil der Wiederverwendung von Code ist die Möglichkeit, manchmal ehrlichen Code wiederzuverwenden. Aber die Welt ist voller Code. Wie finden Sie, was Sie wollen? Folgendes nenne ich den Fluch der Wiederverwendung :
Ich bin der Weihnachtsmann (ok Open Source) und habe eine Tüte mit 1 Milliarde Softwarekomponenten. Sie können einen von ihnen haben.
Viel Glück bei der Auswahl.
Um das Wiederverwendungsproblem gut zu lösen:
- Der Wiederverwender muss irgendwie spezifizieren, was er benötigt (Funktionalität, Leistung, Zielsprache, Umgebungsannahmen, ...)
- Es muss eine Bibliothek mit "wiederverwendbarem" Code geben, die auf verschiedene Weise nach diesen potenziellen Kriterien indiziert wurde
- Es muss einen Mechanismus geben, mit dem Kandidatenelemente ausgewählt werden können (bei einer Milliarde Elementen kann man nicht alle persönlich betrachten).
- Es muss eine Möglichkeit geben, zu charakterisieren, wie weit die ausgewählten Kandidaten von der Spezifikation entfernt sind
- Es sollte einen regulären Prozess geben, der es dem Wiederverwender ermöglicht, den ausgewählten wiederverwendbaren Code zu ändern (hier ist der größte Beitrag von OOP: Sie können eine vorhandene Komponente / ein Objekt bearbeiten, indem Sie die Slots überschreiben. OOP bietet keine andere Hilfe.)
- All dies muss natürlich billiger sein, als es einfach neu zu codieren
Im Laufe der Jahre wurde vor allem festgestellt, dass Code für die Wiederverwendung zu diesem Zweck entwickelt werden muss oder zu viele implizite Annahmen enthält. Die erfolgreichsten Bibliotheken zur Wiederverwendung von Code waren tatsächlich recht klein. Bibliotheken und Frameworks sind vermutlich "wiederverwendbarer" Code und äußerst erfolgreich. Java und C # sind nicht deshalb erfolgreich, weil sie ziemlich gute Computersprachen sind, sondern weil sie über riesige, gut gestaltete, implementierte und dokumentierte Bibliotheken verfügen. Aber die Leute schauen sich den Quellcode in den Bibliotheken nicht an. Sie rufen einfach eine gut dokumentierte API auf (die allgemein verwendbar ist).
Was die Wiederverwendung von Code nicht getan hat (weder OOP noch OOP), ist die Verbesserung unserer Fähigkeit, Systeme zu codieren.
Ich denke, der Hauptfehler ist, dass jede Art der Wiederverwendung von Code grundsätzlich eingeschränkt ist, da in Code zu viele Annahmen eingebaut sind . Wenn Sie den Code winzig machen, minimieren Sie die Annahmen, aber die Kosten für das Erstellen von Grund auf sind nicht sehr hoch und die Wiederverwendungsgewinne sind nicht effektiv. Wenn Sie die Codestücke groß machen, sind sie in einem neuen Kontext so gut wie unbrauchbar. Wie Gulliver sind sie mit einer Million winziger Schnüre an den Strand gebunden, und Sie können es sich einfach nicht leisten, sie alle zu schneiden.
Woran wir arbeiten sollten, ist die Wiederverwendung von Wissen, um Code zu konstruieren . Wenn wir dies tun können, können wir dieses Wissen anwenden, um den Code zu konstruieren, den wir benötigen, und dabei die aktuellen Annahmen berücksichtigen.
Dazu benötigt man immer noch die gleiche Spezifikationsfähigkeit, um Softwarekomponenten zu charakterisieren (man muss immer noch sagen, was man will!). Aber dann wenden Sie dieses Konstruktionswissen auf die Spezifikationen an, um den gewünschten Code zu generieren .
Als Community sind wir noch nicht sehr gut darin. Aber die Leute machen es die ganze Zeit; warum können wir es nicht automatisieren? Es gibt viel Forschung, und dies zeigt, dass dies unter vielen Umständen möglich ist.
Ein Schlüsselelement hierfür sind mechanische Werkzeuge zur Aufnahme von "Komponentenbeschreibungen" (dies sind nur formale Dokumente, die wie Programmiersprachen analysiert werden können) und zur Anwendung von Programmtransformationen auf diese.
Compiler machen das bereits: -} Und sie sind wirklich gut in der Klasse von Problemen, die sie angehen.
UML-Modelle mit Codegenerierung sind ein Versuch, dies zu tun. Kein sehr guter Versuch; In den meisten UML-Modellen heißt es so ziemlich "Ich habe Daten, die so aussehen". Ziemlich schwer, ein echtes Programm zu generieren, wenn die Funktionalität weggelassen wird.
Ich versuche, praktische Programmtransformationssysteme zu erstellen, ein Tool namens DMS . Wir waren ziemlich abgelenkt, als wir Programmtransformationen nicht so sehr auf abstrakte Spezifikationen angewendet haben, um Code zu generieren, sondern auf Legacy-Code, um ihn zu bereinigen. (Dies sind die gleichen Probleme in der Zusammenfassung!). (Solche Werkzeuge zu bauen kostet viel Zeit; ich mache das seit 15 Jahren und in der Zwischenzeit muss man essen).
DMS verfügt jedoch über die beiden oben beschriebenen Schlüsseleigenschaften: Die Fähigkeit, beliebige formale Spezifikationen zu verarbeiten und das Wissen über die Codegenerierung als Transformation zu erfassen und bei Bedarf anzuwenden. Und bemerkenswerterweise generieren wir in einigen speziellen Fällen einen interessanten Code aus Spezifikationen. DMS wird größtenteils aus sich selbst erstellt, um seine Implementierung zu generieren. Das hat für uns zumindest das Versprechen der (Wissens-) Wiederverwendung erfüllt: äußerst signifikante Produktivitätssteigerungen. Ich habe ein Team von ungefähr 7 technischen Leuten; Wir haben wahrscheinlich 1-2 MSLOC "Spezifikationen" für DMS geschrieben, haben aber 10MSLOC generierten Code.
Zusammenfassung: Die Wiederverwendung von Generationswissen ist der Gewinn, nicht die Wiederverwendung von Code .