Dies ist eine Einführung in das selbst erstellte Bibliothekspaket OSS design_pattern_for_c. Das Wiki ist hier. Der Doxygen-Code für jede Bibliotheks-API lautet hier.
Die neueste Version ist V1.00.
(Ich habe zuvor einen Artikel mit demselben Titel in der Vorabversion v0.0.1 geschrieben. Ich habe den vorherigen Artikel gelöscht und ihn als offiziellen öffentlichen Artikel neu erstellt.)
Es ist ein Bibliothekspaket, das unter Linux ausgeführt wird und es Ihnen ermöglicht, die Vorteile von Entwurfsmustern in C-Sprache zu nutzen.
Immer wenn ich bei der Entwicklung eines Systems für C von objektorientiertem Design und Designmustern höre, habe ich oft den Eindruck, dass solche Ideen und Ausdrücke auch in C verwendet werden. Aus der Perspektive einer objektorientierten Sprache kann sie jedoch so verwendet werden, dass Sie denken: "Ist das nicht das XXX-Muster?" Der Grund ist, dass ** ein gut gemachtes C-System Entwurfsmuster auf effiziente Weise für die C-Sprache verwendet **. ** Es kann gesagt werden, dass es nicht nur das Design reproduziert, sondern dass es gut zu C und dem Designmuster passt **.
Ich denke, es ist in jeder Sprache das gleiche. Verwenden Sie praktische Designs und Tools sprachspezifisch, um ein besseres System zu erstellen. Machen wir ein gutes System, nicht ob es genau zu diesen ursprünglichen Ausdrücken passt! Ist der Zweck.
Die C-Sprache ist jedoch keine objektorientierte Sprache. Wenn Sie also nur eine objektorientierte Sprache imitieren, wird die Verwendung nur schwieriger. Im Gegenteil, wenn Sie die Spezialität von C mit einem hohen Freiheitsgrad wie "void *" und "function pointer" verwenden, sollten Sie in der Lage sein, ein nettes Werkzeug zu verwenden, das als Entwurfsmuster bezeichnet wird, obwohl die Ausdrucksmethode möglicherweise unterschiedlich ist. .. Diese Bibliothek wurde unter diesem Gesichtspunkt erstellt.
Hier werden wir kurz die Support-Bibliotheken im Paket vorstellen. Bitte beachten Sie, dass es fast wie eine Einführung in Designmuster ist.
Threadpool
Eine Bibliothek, die das Abhören mehrerer Dateideskriptoren (FD) erstellt und FD-Ereignisse umschließt. Der Benutzer der Bibliothek registriert einfach den FD und den Funktionszeiger und wartet in einem freien Thread in der Bibliothek auf den FD. Die Registrierungsfunktion wird entsprechend dem FD-Ereignis aufgerufen.
Stellen Sie sich das als einen Multithread-Ereignis-Standby-Prozess für Select, Epoll usw. vor.
memorypool
Indem Sie Speicher für denselben Typ (dieselbe Größe) zuweisen, anstatt ihn jedes Mal zuzuordnen, können Sie die Geschwindigkeit der Bereichszuweisung und -initialisierung erhöhen. Dies gilt für Daten mit einer festen Obergrenze, deren Initialisierung lange dauert.
Da der Benutzer der Bibliothek zusätzlich zur Datengröße und -nummer den Konstruktor angeben kann, führt die Bibliothek die Initialisierung mit dem Konstruktor durch, wenn der Bereich gesichert ist.
Es gibt keine japanische Kommentarseite, aber diese Bibliothek ist eine verbesserte Version des aktualisierten Wrappers auf dieser Seite. OSS-Seite
State, StateMachine
Durch Registrieren des Zustands und der in diesem Zustand auszuführenden Funktion kann der Zustandsübergang durch die API der Zustandsbibliothek realisiert werden. Ich denke, dass es für Programme mit komplizierten Zuständen und Programmen nützlich ist, bei denen das Verhalten jedes Zustands leicht geändert werden kann.
SateMachine ist eine Bibliothek, die der Statusbibliothek Statusübergangsereignisse hinzufügt. Dies ist nützlich für die Realisierung der Zustandsübergangstabelle.
Japanische Kommentarseite OSS-Seite
Observer(Publish-Subscribe)
Es ist eine Bibliothek, die die folgende Abonnenten-Publisher-Beziehung realisiert.
⇒ Abonnent ist nur registriert. Dann werden Sie benachrichtigt, wenn der Verlag veröffentlicht!
Im Publisher können mehrere Ereignisfunktionen mit derselben ID registriert werden, und viele Ereignisfunktionen können einfach durch Ausführen der Publish-API des Publishers gleichzeitig aufgerufen werden. Ist es nicht effektiv, wenn mit dem Ereignis eine große Menge an Verarbeitung verbunden ist?
Japanische Kommentarseite OSS-Seite
Chain of Responsibility
Diese Bibliothek kann für Programme verwendet werden, die nach dem Aufruf eine Funktion in einer Zeichenfolge damit aufrufen möchten. Wenn Sie die Funktionen in der Bibliothek registrieren, werden die Funktionen in der Reihenfolge der Registrierung mit einer API ausgeführt. Sie können die Unterbrechung in der Mitte steuern, indem Sie den Rückgabewert der Funktion ändern.
Japanische Kommentarseite OSS-Seite
Flyweighy, Singleton
Mit der Flyweighy-Bibliothek können Benutzer dieselbe Instanz wiederverwenden, ohne die Instanzerstellung zu kennen. Instanzen werden erstellt und in der Bibliothek gespeichert. Durch Registrieren der gleichen Bedingung als Funktion wird bestimmt, ob die erstellte Instanz dieselbe Instanz ist, und wenn sie dieselbe ist, wird die bereits erstellte Instanz wiederverwendet.
Grob gesagt ist Singleton ein Entwurfsmuster, das nur ein und dieselbe Instanz wiederverwendet. Dies ist gleichbedeutend damit, dass die Bedingung Flyweighy = immer auf true gesetzt wird. Es gibt also nur eine Flyweighy-Bibliothek.
Japanische Kommentarseite OSS-Seite
Prototype
Durch Registrieren der Daten in einem bestimmten Zustand und der Methode zum Kopieren dieser Daten können Sie die Daten jederzeit in diesem Zustand kopieren. Dies ist effektiv, wenn Sie problematische Aufgaben nur einmal ausführen möchten, z. B. das Registrieren und Wiederverwenden nach der Initialisierung einer Verarbeitung mit hohem Initialisierungsaufwand.
Japanische Kommentarseite OSS-Seite
Builder
Dies unterscheidet sich ein wenig vom Design Pattern Builder. Diese Bibliothek ist beispielsweise nützlich, wenn Sie mehrere Module steuern möchten, die Initialisierungssequenz jedoch für jedes Modul geringfügig unterschiedlich ist. Die Bibliothek übernimmt die Erstverarbeitung und macht es einfach, während Module mit leicht unterschiedlicher Erstverarbeitung verwendet werden können.
Definieren Sie die Initialisierungs-API in der conf-Datei und lassen Sie jedes Modul die API implementieren (wenn dies nicht erforderlich ist, können Sie sie nicht implementieren). Wenn Sie danach die conf-Datei und das Modul in die Bibliothek beißen und die API ausführen, übernimmt die Bibliothek die Initialisierung des Moduls.
Japanische Kommentarseite OSS-Seite
~~ Ehrlich gesagt gibt es Raum für Verbesserungen (die Reihenfolge ist gut, aber ich kann die mangelnde Überlegung, wie die Parameter übergeben werden sollen, nicht leugnen). ~~ ⇒ Die API-Spezifikationen wurden überprüft.
Ich habe dieses Paket verwendet, um lighttpd multithreaded zu machen. https://github.com/developer-kikikaikai/lighttpd_multithread
Der Bibliotheksnutzungsdatensatz ist ungefähr so.
--Multi-Thread-Operation für jede TCP-Verbindung wurde mit Thread-Pool und Zustandsmaschine realisiert. Sie können jetzt andere Clients verarbeiten, ohne von starken HTTP-Clientanforderungen betroffen zu sein.
Das von mir erstellte Multithread-Programm ist auf der Fastcgi-Seite immer noch fehlerhaft oder nicht fixiert, aber dank jeder Bibliothek passt der Multithread-Erfolg && in Bezug auf die Geschwindigkeit gut zur Head-Familie.
Der Artikel, der die Leistung zusammenfasst, bevor die folgenden drei unterstützt werden, ist hier. (Cgi ist langsam und die Speichernutzung ist schrecklich (-_-;). Dies wird langsam aktualisiert.)
Mit dem Builder habe ich einen Router erstellt, den sowohl Wifi als auch Ethernet auf der LAN-Netzwerkseite verwenden können. https://github.com/developer-kikikaikai/linux_router
Kommentarseite https://qiita.com/developer-kikikaikai/items/0d8ea1c057302ad26ea9
Hierbei wird ein Builder verwendet, und die zu ladende Bibliothek wird auch von der JSON-Datei verwaltet, sodass dem LAN-Netzwerk ein neues Modul hinzugefügt werden kann.
Sie können es von [hier] herunterladen (https://github.com/developer-kikikaikai/design_pattern_for_c/releases).
Sie können erstellen und installieren, indem Sie die folgenden Schritte ausführen.
Der Standard ist in / usr / local / installiert. Sie können den Installationspfad auch mit ./configure --prefix = XXX
angeben.
Weitere Informationen finden Sie unter Wiki oder in der README-Datei.
Danach können Sie es verwenden, indem Sie die erforderliche Bibliothek verknüpfen. Weitere Informationen zur API finden Sie unter Doxygen Code.
Mit Ausnahme einer Plug-In-Bibliothek ist die Basis die MIT-Lizenz. MIT wikipedia
Nur das von Threadpool verwendete libev-Plug-In ist GPL Version 2 oder eine spätere Version.
Ich werde es hinzufügen, wenn es eine Änderung der API-Spezifikation oder eine Funktionserweiterung zum Hauptzweig gibt.
Datum ändern | Inhalt |
---|---|
2018/07/22 | V1.00 Erstausgabe veröffentlicht |
2018/07/29 | ・ Builder, lower_layer_director_Konstruktspezifikationen synchronisieren/Geändert, damit es asynchron angegeben werden kann&&Eingabe als Rückrufargument_Parameter hinzufügen(Speicher freigeben können)。 ・ C verschiedener Header++Korrespondenz |
Wenn Sie Fragen oder Wünsche haben, kommentieren Sie bitte diesen Artikel oder Github-Probleme. Übrigens habe ich vergessen, READ ME zu aktualisieren, und die Beschreibung ist nicht 1.00, aber das liegt daran, dass ich dich liebe (lacht)
Wir möchten uns auch bei allen bedanken, die uns in den Kommentaren viele Kommentare gegeben haben, bei Herrn Sureibu, der uns Übersetzungsratschläge gegeben hat, und bei allen, die viele gute Artikel als Referenz geschrieben haben. Vielen Dank.
Recommended Posts