Ceci est une introduction du package de bibliothèque OSS design_pattern_for_c. Le wiki est ici. Le code Doxygen pour chaque API de bibliothèque est ici.
La dernière version est la V1.00.
(J'ai écrit un article avec le même titre dans la pré-version v0.0.1 auparavant. J'ai supprimé l'article précédent et je l'ai recréé en tant qu'article public officiel.)
C'est un package de bibliothèque qui tourne sous Linux et vous permet de profiter des bons points des modèles de conception en langage C.
Chaque fois que j'entends parler de conception orientée objet et de modèles de conception lors du développement d'un système pour C, j'ai souvent l'impression que de telles idées et expressions sont souvent utilisées également en C. Cependant, du point de vue d'un langage orienté objet, il peut être utilisé d'une manière qui vous fait penser: "N'est-ce pas le modèle XXX?" La raison en est que ** un système C bien fait utilise des modèles de conception de manière efficace pour le langage C **. ** On peut dire qu'il ne s'agit pas seulement de reproduire le dessin, mais que c'est une bonne correspondance entre C et le modèle de dessin **.
Je pense que c'est la même chose dans toutes les langues. Utilisez des conceptions et des outils pratiques d'une manière spécifique à la langue pour créer un meilleur système. Faisons un bon système, pas le but de savoir s'il correspond exactement à ces expressions originales! Est le but.
Cependant, le langage C n'est pas un langage orienté objet, donc le simple fait d'imiter un langage orienté objet le rend plus difficile à utiliser. Au contraire, si vous utilisez la spécialité de C avec un degré de liberté élevé tel que void *
et function pointer
, vous devriez pouvoir utiliser un outil merveilleux appelé modèle de conception, bien que la méthode d'expression puisse être différente. .. Cette bibliothèque a été créée dans cet esprit.
Ici, nous présenterons brièvement les bibliothèques de support dans le package. Veuillez noter que c'est presque comme une introduction aux modèles de conception.
Threadpool
Une bibliothèque qui crée l'écoute de plusieurs descripteurs de fichier (FD) et encapsule les événements FD. L'utilisateur de la bibliothèque enregistre simplement le FD et le pointeur de fonction, et attend le FD dans un thread libre de la bibliothèque. Il appellera la fonction d'enregistrement en fonction de l'événement FD.
Considérez-le comme un processus de veille d'événements multi-thread pour select, epoll, etc.
memorypool
En allouant de la mémoire pour le même type (taille) au lieu de la malaxer à chaque fois, vous pouvez augmenter la vitesse d'allocation de zone et d'initialisation. Il est efficace pour les données qui ont une limite supérieure fixe et qui prennent beaucoup de temps à s'initialiser.
Étant donné que l'utilisateur de la bibliothèque peut spécifier le constructeur en plus de la taille et du nombre de données, la bibliothèque effectuera l'initialisation à l'aide du constructeur lorsque la zone est sécurisée.
Il n'y a pas de page de commentaires en japonais, mais cette bibliothèque est une version améliorée du wrapper mis à jour sur cette page. Page OSS
State, StateMachine
En enregistrant l'état et la fonction à exécuter dans cet état, la transition d'état peut être réalisée par l'API de la bibliothèque d'état. Je pense que c'est utile pour les programmes avec des états compliqués et les programmes où le comportement de chaque état est facilement modifié.
SateMachine est une bibliothèque qui ajoute des événements de transition d'état à la bibliothèque d'état. Cela sera utile pour réaliser la table de transition d'état.
Page de commentaires en japonais Page OSS
Observer(Publish-Subscribe)
C'est une bibliothèque qui réalise la relation Abonné-Éditeur suivante.
⇒ L'abonné est uniquement enregistré. Ensuite, vous serez averti lorsque l'éditeur publiera!
Plusieurs fonctions d'événement peuvent être enregistrées dans l'éditeur avec le même identifiant, et de nombreuses fonctions d'événement peuvent être appelées à la fois simplement en exécutant l'API de publication de l'éditeur. N'est-ce pas efficace lorsqu'il y a une grande quantité de traitement associée à l'événement?
Page de commentaires en japonais Page OSS
Chain of Responsibility
Cette bibliothèque peut être utilisée pour les programmes qui souhaitent appeler une fonction dans une chaîne avec this après avoir appelé this. Si vous enregistrez les fonctions dans la bibliothèque, les fonctions seront exécutées dans l'ordre d'enregistrement avec une API. Vous pouvez contrôler l'interruption au milieu en modifiant la valeur de retour de la fonction.
Page de commentaires en japonais Page OSS
Flyweighy, Singleton
La bibliothèque Flyweighy permet aux utilisateurs de réutiliser la même instance sans avoir connaissance de la création de l'instance. Les instances sont créées et conservées dans la bibliothèque. En enregistrant la condition d'égalité en tant que fonction, il est déterminé si l'instance créée est la même instance, et si elle est la même, l'instance déjà créée est réutilisée.
En gros, Singleton est un modèle de conception qui ne réutilise qu'une seule et même instance, ce qui est synonyme de toujours définir la condition Flyweighy = sur true. Il n'y a donc qu'une seule bibliothèque Flyweighy.
Page de commentaires en japonais Page OSS
Prototype
En enregistrant les données dans un certain état et la méthode de copie de ces données, c'est une bibliothèque qui vous permet de copier les données dans cet état à tout moment. Il est efficace lorsque vous ne souhaitez effectuer qu'une seule fois des choses gênantes, telles que l'enregistrement et la réutilisation après l'initialisation d'un traitement lourd en initialisation.
Page de commentaires en japonais Page OSS
Builder
Ceci est un peu différent du générateur de modèles de conception. Par exemple, cette bibliothèque est utile lorsque vous souhaitez contrôler plusieurs modules, mais la séquence d'initialisation est légèrement différente pour chaque module. La bibliothèque prend en charge le traitement initial et le facilite, tout en permettant d'utiliser des modules avec un traitement initial légèrement différent.
Définissez l'API d'initialisation dans le fichier conf et demandez à chaque module d'implémenter l'API (si cela n'est pas nécessaire, vous pouvez la laisser non implémentée). Après cela, si vous mordez le fichier conf et le module dans la bibliothèque et exécutez l'API, la bibliothèque entreprendra l'initialisation du module.
Page de commentaires en japonais Page OSS
~~ Honnêtement, il y a place à l'amélioration (la séquence est bonne, mais je ne peux pas nier le manque de considération sur la façon de passer les paramètres). ~~ ⇒ Les spécifications de l'API ont été revues.
J'ai utilisé ce package pour rendre lighttpd multithread. https://github.com/developer-kikikaikai/lighttpd_multithread
L'enregistrement d'utilisation de la bibliothèque est à peu près comme ça.
Le programme multi-thread que j'ai créé est toujours bogué ou non résolu du côté de fastcgi, mais grâce à chaque bibliothèque, le succès multi-thread && est un bon match avec la famille principale en termes de vitesse.
L'article qui résume les performances avant que les trois suivants ne soient pris en charge est ici. (Cgi est lent et l'utilisation de la mémoire est terrible (-_-;). Cela sera mis à jour lentement)
En utilisant le constructeur, j'ai créé un routeur que le Wifi et l'Ethernet peuvent utiliser du côté du réseau LAN. https://github.com/developer-kikikaikai/linux_router
Page de commentaire https://qiita.com/developer-kikikaikai/items/0d8ea1c057302ad26ea9
Cela utilise un générateur, et la bibliothèque à charger est également gérée par le fichier json, il est donc possible d'ajouter un nouveau module au réseau LAN.
Vous pouvez le télécharger depuis ici.
Vous pouvez créer et installer en suivant les étapes ci-dessous.
La valeur par défaut est installée dans / usr / local /. Vous pouvez également spécifier le chemin d'installation avec ./configure --prefix = XXX
.
Voir wiki ou README pour plus de détails.
Après cela, vous pouvez l'utiliser en liant la bibliothèque requise. Veuillez consulter Code Doxygen pour plus de détails sur l'API.
À l'exception d'une bibliothèque de plug-ins, la licence de base est la licence MIT. MIT wikipedia
Seul le plug-in libev utilisé par Threadpool sera GPL version 2 ou toute version ultérieure.
Je l'ajouterai quand il y aura un changement de spécification d'API ou un ajout de fonction à la branche principale.
Date de modification | Contenu |
---|---|
2018/07/22 | V1.00 Première édition publiée |
2018/07/29 | · Constructeur, lower_layer_director_Synchroniser les spécifications de construction/Modifié pour pouvoir être spécifié de manière asynchrone&&Entrée comme argument de rappel_Ajouter un paramètre(Pour pouvoir libérer de la mémoire)。 ・ C de divers en-têtes++Correspondance |
Si vous avez des questions ou des demandes, veuillez commenter cet article ou problèmes github. Au fait, j'ai oublié de mettre à jour le READ ME, et la description n'est pas 1.00, mais c'est parce que je t'aime (rires)
Nous tenons également à remercier tous ceux qui nous ont fait part de nombreux commentaires dans les commentaires, M. Sureibu qui nous a donné des conseils en matière de traduction, et tous ceux qui ont écrit beaucoup de bons articles pour référence. Merci beaucoup.
Recommended Posts