Generische Programmierung, wie oft wird sie in der Industrie eingesetzt

11

Ich programmiere momentan in einem akademischen Umfeld, damit ich alles verwenden kann, was ich will. Ich verwende die Boost-Diagrammbibliothek für einige Dinge und frage mich, ob es sich lohnt, Anstrengungen zu unternehmen, um GP besser zu verstehen.

Ich bin neugierig - wird generische Programmierung (GP) in der Industrie häufig verwendet? Ich vermute, dass die meisten Programmierer mit OOP viel besser vertraut sind oder Sprachen verwenden, die GP nicht hervorheben oder unterstützen, so dass ich den Eindruck habe, dass GP außerhalb des Aufrufs von STL-Datenstrukturen / -Funktionen in C ++ nicht allzu häufig verwendet wird in der Praxis. Aber da wir im Moment außerhalb der Industrie sind, wäre es schön, von Praktizierenden darüber zu hören.

(Während ich dies schreibe, sehe ich, dass generische Programmierung nicht einmal ein gültiges Tag ist!)

bd1
quelle
Die Tag-Verteilung auf StackOverflow ist als statistischer Beweis wahrscheinlich viel nützlicher als die hier. Siehe stackoverflow.com/questions/tagged/generic-programming , stackoverflow.com/questions/tagged/generics
Péter Török

Antworten:

7

Ich bin neugierig - wird generische Programmierung (GP) in der Industrie häufig verwendet?

Es hängt wirklich stark vom Kontext des Teams und des Projekts ab.

Beispielsweise ist in Videospielen der Code häufig der "einfachste" (und manchmal sogar zu einfache) Code, jedoch in großen Architekturen. Das liegt daran, dass Spieleentwickler viele Probleme zu beheben haben und sich nicht mit Meta-Programmierung beschäftigen möchten (dies ist eine separate, sehr abstrakte und schwer verständliche Sprache in C ++).

Gleichzeitig ist die grundlegende Verwendung von Vorlagen auch in diesen Shops üblich, und Sie können einige vorlagenbasierte Optimierungen in einigen sehr spezifischen Funktionen einiger Engines sehen.

Aber in Spielentwicklern vermeiden die meisten Leute einfach jede Metaprogrammierung.

Auf der anderen extremen Seite erfordern einige wirklich komplexe oder schwere Verarbeitungsanwendungen, die nicht üblich sind, eine schwere Metaprogrammierung, da die Anforderungen an Leistung und Flexibilität (zur Kompilierungszeit) nicht üblich sind. Ich arbeite gerade in einem.

Es ist nicht üblich, aber es existiert und einige Nischendomänen (in einigen wissenschaftlichen oder in Zahlen verknüpften eingebetteten Kontexten) erfordern Menschen, die viel über Metaprogrammierung wissen oder lernen wollen.

In der Mitte verwenden die meisten Leute nur Meta-Programmierung als "Client", nicht als "Designer". Die meisten Meta-Programmiercodes werden in Bibliotheken gebündelt, da Bibliotheken Tools für Code sind. Was ist besser als eine Bibliothek, die sich an die benutzerdefinierten Typen anpassen kann, mit denen Sie bisher gearbeitet haben?

Boost (http://boost.org) ist eine Reihe von Bibliotheken, von denen einige aus starker metaprogrammierender schwarzer Magie bestehen und in vielen C ++ - Shops als "STL ++" verwendet werden, eine Erweiterung der STL (und das ist es auch). Nicht jeder Shop verwendet es aus verschiedenen Gründen, z. B. aus Gründen der Compilerkompatibilität (einige Boost-Bibliotheken können Ihren Compiler jedes Mal um Verzeihung bitten, wenn er Ihr Gefühl verletzt hat ...) und häufiger, weil einige Entwickler es nicht mögen, nicht verstehen zu können wie ein Tool im Inneren funktioniert (versuchen Sie, Boost.Spirit zu verstehen ...)

Unabhängig von den Unternehmen, für die Sie arbeiten, werden einige dieses Paradigma verwenden, andere weniger oder gar nicht oder sogar verbieten.

Es gibt keinen Konsens, weil niemand die gleichen Bedürfnisse, den gleichen Kontext oder das gleiche Team hat.

Aber offensichtlich wird es immer noch verwendet. Vielleicht fragen Sie, wer Boost auf seiner Mailingliste verwendet, um mehr Beispiele aus der Praxis zu erhalten?

Klaim
quelle
1
+1 für Kunde gegen Designer. Nach meiner Erfahrung verstehen nur wenige Entwickler ihre Implementierung so, dass es keinen Sinn macht, neuen generischen Code in einer Anwendung zu erstellen, es sei denn, dies führt zu einer erheblichen Verbesserung der Wartbarkeit. Bibliotheken, die für eine breite Wiederverwendung ausgelegt sind, fallen viel häufiger unter diese Bedingung als einzelne Anwendungen.
Karl Bielefeldt
Danke für die ausführliche Antwort. Ich bin selbst ein Fan von Boost und habe mich gefragt, ob ich mich mit BGL beschäftigen soll, was wesentlich mehr GP-Kenntnisse erfordert als andere Boost-Bibliotheken. Ihr Kommentar zur Spielentwicklungswelt ist ziemlich faszinierend. Ich bin erstaunt über die Entwicklungsleistungen moderner Spiele und es ist interessant zu hören, dass sie wahrscheinlich eher von neueren Programmiermethoden isoliert sind als an vorderster Front.
BD1
Nun, Spieleentwickler verwalten eine hohe Komplexität, indem sie Spielekonzepte entwickeln müssen. Das Hinzufügen von Meta-Anweisungen komplexiert einfach alles, sodass es wirklich gut begründet sein muss. Die andere Sache ist, dass viele Spieleentwickler auf Konsolen arbeiten, die sehr spezifische Hardware mit sehr spezifischen Compilern sind, die nicht alles zulassen, was Boost versucht (zum Beispiel keine Ausnahme oder keine Mehrfachvererbung oder nicht richtig aus dem Dokument von der Compiler (wahre Geschichte)). Es gibt also gute Gründe.
Klaim
5

Ich bin neugierig - wird generische Programmierung (GP) in der Industrie häufig verwendet?

Generische Programmierung, akademisch als parametrischer Polymorphismus bezeichnet , wird in den Bereichen sehr häufig verwendet. In meinem Unternehmen verwenden wir es hauptsächlich, um typunabhängige Editoren für Daten aufzubauen, unabhängig von ihrer Art. Sie brauchen es einfach nicht so oft wie andere Funktionen, aber es ist definitiv eine Funktion, die ich nicht missen möchte. Sie verwenden es, wenn ein Verhalten für eine große Anzahl von Typen geeignet ist. Es ist ein klares Zeichen dafür, dass Sie Generika benötigen, wenn Sie denselben Code mehrmals für verschiedene Typen schreiben.

Ich vermute, dass die meisten Programmierer mit OOP viel besser vertraut sind oder Sprachen verwenden, die GP nicht hervorheben oder unterstützen, so dass ich den Eindruck habe, dass GP außerhalb des Aufrufs von STL-Datenstrukturen / -Funktionen in C ++ nicht allzu häufig verwendet wird in der Praxis.

Zumindest aus meiner Erfahrung ist Ihr Standpunkt falsch. OOP und generische Programmierung schließen sich nicht gegenseitig aus. In der Tat sollten Sie die Synergieeffekte der Kombination nutzen. Wie ich bereits sagte, ist der Grund, warum Sie es nicht so häufig sehen wie andere Techniken, der, dass Sie es nicht so oft brauchen. Aber es ist eine starke Funktion, die Ihnen dabei hilft, Ihren Code trocken zu halten . Welche Sprachen betonen die Unterstützung von GP bei der Programmierung auf hoher Ebene nicht wirklich? 3 von 5 Sprachen der Tiobe Top 5 unterstützen Generika / Vorlagen. Und PHP wird dynamisch getippt, sodass es sie nicht wirklich benötigt. Na und?

Falke
quelle
Ich habe nicht gemeint, dass OOP und GP eine Entweder-Oder-Wahl sind. Viele der Projekte, die ich gesehen habe, scheinen jedoch in Java streng OOP zu sein. Ich denke, neuere Versionen von Java unterstützen GP, ​​aber welcher Teil der Java-Programmierer nutzt diese Funktionalität wirklich? Wie gesagt, ich arbeite nicht in der Industrie und meine Perspektive ist möglicherweise verzerrt, weshalb ich die Frage gestellt habe.
bd1
@ bd1: Ältere Anwendungen, die geschrieben wurden, bevor Java Generics unterstützte, oder bevor ein bestimmtes Toolset diese Java-Version unterstützte, haben keine Generics, und die Entwickler vermeiden möglicherweise weiterhin Generics für dieses bestimmte Projekt, um den Code konsistent zu halten. Ich habe das gesehen und es variiert je nach Projekt und Entwickler. Alle Projekte, die nach der weit verbreiteten Unterstützung von Java-Generika gestartet wurden, werden bei Bedarf häufig verwendet.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner: Generika in Java unterscheiden sich vollständig von C ++ - Vorlagen. Java-Generika sind 100% reiner syntaktischer Zucker und unterstützen keine Metaprogrammierung.
Kevin Cline
"OOP und generische Programmierung schließen sich nicht gegenseitig aus.": In der Tat handelt es sich bei beiden um Formen des Polymorphismus bzw. des Ad-hoc- und des parametrischen Polymorphismus. Sie sind also zwei verschiedene Werkzeuge für verschiedene Arten von Polymorphismus.
Giorgio
4

C ++ - Vorlagen werden häufig für andere Dinge als Container verwendet - zumindest in meinem Problembereich (quantitative Finanzen). Ich würde sogar sagen, dass es manchmal zu oft verwendet wird, für Zwecke, bei denen einfache alte virtuelle Funktionen ausreichen würden (und die Kompilierungszeit nicht so sehr verlängern würden).

Die Benutzer verwenden es, um Codeduplikationen zu vermeiden und einen Polymorphismus zur Kompilierungszeit zu erzielen (ohne virtuellen Versand).

quant_dev
quelle