"Wenn du wirklich OO-Zucker willst, dann benutze C ++", war die sofortige Antwort, die ich von einem meiner Freunde erhielt, als ich danach fragte. Ich weiß, dass zwei Dinge hier absolut falsch sind. Erstens ist OO NICHT 'Zucker' und zweitens hat C ++ NICHT C absorbiert.
Wir müssen einen Server in C schreiben (das Front-End, auf das Python zugreifen soll), und deshalb suche ich nach besseren Möglichkeiten, um große C-Programme zu verwalten.
Die Modellierung eines großen Systems in Bezug auf Objekte und Objektinteraktionen macht es einfacher zu verwalten, zu warten und zu erweitern. Wenn Sie jedoch versuchen, dieses Modell in C zu übersetzen, das keine Objekte (und alles andere davon) enthält, stehen Sie vor einigen wichtigen Entscheidungen.
Erstellen Sie eine benutzerdefinierte Bibliothek, um die OO-Abstraktionen bereitzustellen, die Ihr System benötigt? Dinge wie Objekte, Kapselung, Vererbung, Polymorphismus, Ausnahmen, Pub / Sub (Ereignisse / Signale), Namespaces, Introspection usw. (zum Beispiel GObject oder COS ).
Oder Sie verwenden einfach die grundlegenden C-Konstrukte ( struct
und Funktionen), um alle Ihre Objektklassen (und andere Abstraktionen) auf Ad-hoc-Weise zu approximieren. (zum Beispiel einige der Antworten auf diese Frage auf SO )
Der erste Ansatz gibt Ihnen eine strukturierte Möglichkeit, Ihr gesamtes Modell in C zu implementieren. Er fügt jedoch auch eine Komplexitätsebene hinzu, die Sie beibehalten müssen. (Denken Sie daran, dass wir die Komplexität reduzieren wollten, indem wir zunächst Objekte verwendeten.)
Ich kenne den zweiten Ansatz nicht und weiß nicht, wie effektiv er bei der Annäherung aller Abstraktionen ist, die Sie möglicherweise benötigen.
Meine einfachen Fragen lauten also: Was sind die Best Practices für die Realisierung eines objektorientierten Entwurfs in C. Denken Sie daran, ich frage nicht, wie ich das tun soll. Dies und diese Fragen sprechen darüber und es gibt sogar ein Buch darüber. Was mich mehr interessiert, sind einige realistische Ratschläge / Beispiele, die die wirklichen Probleme ansprechen, die sich zeigen, wenn Sie dies tun.
Hinweis: Bitte raten Sie nicht, warum C nicht zu Gunsten von C ++ verwendet werden sollte. Wir haben diese Etappe weit hinter uns gelassen.
extern "C"
und von Python aus verwendet werden kann. Sie können dies manuell tun oder sich dabei von SWIG unterstützen lassen. Der Wunsch nach Python-Frontend ist also kein Grund, C ++ nicht zu verwenden. Das heißt nicht, dass es keine triftigen Gründe gibt, bei C. zu bleiben