[PYTHON] Lors de l'ajout de fonctionnalités hautement indépendantes

Lors de la mise en œuvre de nouvelles fonctions hautement indépendantes dans les projets ayant participé au développement, je voudrais garder à l'esprit les points suivants.

** - Prototype uniquement des processus hautement indépendants pour vérifier le fonctionnement. ** **

À ce stade, utilisez une combinaison de langage et de bibliothèque qui facilite la vérification de l'algorithme.

Dans mon cas, j'utilise souvent des langages d'interprétation tels que MATLAB et python. Il est important d'avoir suffisamment de bibliothèques pour vérifier graphiquement que l'algorithme se comporte comme prévu, et du code pour montrer que le comportement est ce que vous attendez, plutôt que l'implémentation réelle de l'algorithme lui-même. Est extrêmement plus.

** - Parmi les processus hautement indépendants, ne réimplémentez que les fonctions utilisées à la destination du port dans la langue cible. ** **

Il n'est pas utilisé à la destination du port et les fonctions de test et de contrôle de fonctionnement ne doivent pas être portées.

Dans mon cas, j'utilise souvent des langages d'interprétation tels que python, des lots et des scripts shell comme outils qui facilitent la vérification en exécutant uniquement les algorithmes implémentés dans le langage de développement cible. Par exemple, créez une fonction qui traite un fichier afin qu'il reçoive des arguments de ligne de commande et le traite, puis l'exploite avec la fonction system () dans le langage d'interprétation. De cette manière, le code source dans le langage de développement cible peut être simplifié afin que le code source ne soit pas altéré inutilement et que la fiabilité du code ne soit pas compromise.

** ・ Ne portez pas de force le processus de vérification. ** **

Ne forcez pas le processus de vérification, qui n'est pas nécessaire pour l'implémentation de production, dans la langue cible.

** - Transformez des processus hautement indépendants en fichiers indépendants. ** **

En en faisant un fichier indépendant, il devient un fichier séparé pour chaque objectif, de sorte que SVN indique clairement quand et qui a mis à jour la fonction hautement indépendante. De plus, l'emplacement de la division de chaque fichier devient clair.

Dans l'implémentation prototype, tout en confirmant l'utilité de l'algorithme, nous refactoriserons l'implémentation prototype afin qu'elle soit facile à maintenir. Dans la version initiale de l'implémentation du prototypage, le code de vérification de l'opération et l'algorithme lui-même sont mélangés. Séparez-le et éliminez les importations et les #includes inutiles de la bibliothèque. Ensuite, vous pouvez voir ce qu'est un processus hautement indépendant et comment il doit être conçu. Après ça. Mettre en œuvre la conception vérifiée en refactorisant l'implémentation du prototypage dans la langue cible. Ce faisant, vous pouvez procéder à la conception en toute confiance plutôt que de concevoir soudainement dans la langue cible.

** - Refléter les parties importantes dans la langue cible, non requises dans le langage de prototypage. ** **

Dans le langage C ++, ajoutez le modificateur const à l'argument de la fonction. Les variables passées en arguments sont passées par référence. Le passage par valeur entraîne une grande quantité de copies inutiles de données, alors passez par référence. Le passage par pointeur nécessite un codage plus soigné que le passage par référence, donc lorsque le passage par référence est suffisant, il est souvent passé par référence.

** - Quelle devrait être la valeur de retour de la fonction / méthode dans la langue cible? ** **

Dans les langages d'interprétation comme MATLAB et Python, les fonctions peuvent renvoyer plusieurs variables. Par conséquent, il est possible de coder la valeur d'entrée comme argument et la valeur de sortie comme valeur de retour. Dans le langage C / C ++, la valeur de retour d'une fonction ou d'une méthode est limitée à une seule structure de données, de sorte que la valeur de sortie est souvent reçue en tant qu'argument de la fonction ou de la méthode en passant un pointeur ou par référence. Même ainsi, recevoir la sortie comme valeur de retour d'une fonction de type cv :: Mat présente de nombreux avantages qui facilitent l'écriture du code à utiliser. cv::Mat somefunc(const cv::Mat &img); Déclaré en cv::imwrite("junk.png ", somefunc(cv::imread("lena.jpg ")); Il devient possible de décrire comme. Le contenu du traitement en une ligne s'enrichit de ce montant et le code devient plus facile à comprendre. Vous serez moins conscient de la partie de l'allocation et de la libération de la mémoire, et vous pourrez vous concentrer sur l'algorithme.

Dans le cas de l'IplImage conventionnel, lorsque la variable pointeur de type IplImage est déclarée, si le pointeur de type IplImage est NULL, la zone est réservée, ou la valeur est définie dans la zone, c'est déjà. Dans certains cas, il s'agit d'une référence à un type IplImage existant, et si le traitement est distribué autour du programme, un motif d'oubli de libérer la zone de type IplImage peut se produire.

** ・ Introduisez un espace de noms unique pour le traitement hautement indépendant. ** **

L'utilisation d'un espace de noms unique empêche l'identificateur d'entrer en collision avec un autre code source. N'écrivez pas en utilisant l'espace de noms; du côté qui utilise le module ajouté et du module lui-même.

** ・ Affinez les interfaces à publier. ** **

Affinez les interfaces exposées par des modules supplémentaires. Ajoutez une déclaration statique aux fonctions qui ne sont appelées que dans ce fichier.

** ・ Rédigez des commentaires de documentation suffisants pour que l'interface soit publiée. ** **

Dans mon cas, rédigez un commentaire de documentation en utilisant Doxygen.

** ・ Facilitez les tests unitaires. ** **

En plus du programme principal pour un fonctionnement normal, créez un fichier projet qui génère un programme de test. Permettez aux petits programmes de tester si les fonctionnalités de l'implémentation supplémentaire se comportent comme prévu. Il peut ne pas toujours apparaître dans le cadre de test unitaire représenté par CppUnit au début, mais même ainsi, il est plus facile de tester le programme car il peut être testé avec un petit programme de test qui est différent du programme de fonctionnement normal.

** Examinez l'interface portée **

Examinons de plus près le code source de la destination du port pour voir quelle partie du code source de la destination du port utilisera les fonctions supplémentaires. Si vous n'avez pas d'interface bien ajustée, une fonction peut en faire trop et doit "extraire la fonction".

En faisant cela, je souhaite implémenter des fonctions supplémentaires sans aucun problème.

--

Remarque: Utilisez un langage de script pour une vie C ++ confortable. Implémentation C ++ après vérification avec python

Recommended Posts

Lors de l'ajout de fonctionnalités hautement indépendantes
Écriture intelligente lors de l'ajout de statistiques d'apprentissage automatique en tant que fonctionnalités