[LINUX] Verwenden wir das Entwurfsmuster wie die Sprache C mit OSS design_pattern_for_c!

** Einführung **

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.)

** Was ist design_pattern_for_c? ** ** **

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.

** Was kannst du tun? ** ** **

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.

Japanische Seite OSS-Seite

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.

  1. Ich habe einen Abonnenten eines Buches.
  2. Abonnenten abonnieren die Veröffentlichungen dieses Herausgebers.
  3. Wenn der Verlag das Buch veröffentlicht, kann der Abonnent wissen, dass das Buch veröffentlicht wurde.

⇒ 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.

** Welche Art von Programm können Sie zum Beispiel machen? ** ** **

** HTTP-Server Multithreaded **

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.)

** Multi-Geräte-kompatibler LAN-Router **

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.

** Wie benutzt man **

herunterladen

Sie können es von [hier] herunterladen (https://github.com/developer-kikikaikai/design_pattern_for_c/releases).

** Wie benutzt man **

Sie können erstellen und installieren, indem Sie die folgenden Schritte ausführen.

  1. ./configure
  2. make
  3. sudo make install

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.

Lizenz

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.

Geschichte verändern

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

Schließlich

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

Verwenden wir das Entwurfsmuster wie die Sprache C mit OSS design_pattern_for_c!
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Designmuster "Facade" mit Python
Lassen Sie uns mit TDD ~ Design pattern ~ etwas entwickeln, das dem Integrierten nahe kommt
Schreiben der C-Sprache mit Sympy (Metaprogrammierung)
Segfo mit 16 Zeichen in C-Sprache