Lors de l'écriture d'une bibliothèque pour un grand projet sur lequel je travaillais au travail, un problème nécessitant l'envoi d'un jeton à une adresse électronique, puis sa réintégration dans le code, afin de pouvoir l'utiliser ultérieurement.
Mon collègue me dit simplement de lire STDIN (en utilisant Python:) code = input("Enter code: ")
, puis de le faire passer par un utilisateur. Toutefois, cela me semble une mauvaise pratique, car la bibliothèque pourrait (dans ce cas, le sera certainement) être utilisée dans une tâche en arrière-plan sur un serveur. .
Je me demandais si cela était considéré ou non comme un anti-modèle.
programming-practices
libraries
anti-patterns
Paradoxis
la source
la source
Réponses:
En règle générale, les bibliothèques doivent être totalement déconnectées de l'environnement. Cela signifie qu’ils ne doivent pas effectuer d’opérations sur des flux standard, sur des fichiers spécifiques, ni s’attendre à l’environnement ou au contexte dans lequel ils sont utilisés.
Bien sûr, il y a des exceptions à cette règle, mais il doit y avoir une très bonne raison pour cela. Dans le cas de l'utilisation
stdin
, je ne trouve aucune raison (à moins que votre bibliothèque ne fournisse réellement des routines pour lire à partir de stdin, comme àstd::cin
partir de C ++). De plus, prendre les flux d'E / S à partir d'un paramètre plutôt que de les coder en dur ajoute tellement de flexibilité qu'il ne vaut pas la peine de ne pas le faire.la source
/dev/tty
pour communiquer avec le utilisateur. Le programme peut même être lancé sans terminal et ouvrir son propre terminal avecxterm -S
.Je considérerais que ce n’est pas nécessairement un anti-modèle, mais une bibliothèque mal conçue. Il devrait être facile de demander une chaîne en tant que paramètre de méthode, où l'entrée pourrait être passée directement.
Si cela ne correspond pas à cette utilisation, un paramètre de méthode peut être un flux, avec STDIN transmis à la méthode.
Si cela ne correspond pas à cet usage, la bibliothèque n'est pas assez flexible.
la source
Envisagez peut-être d’avoir la possibilité dans votre bibliothèque de définir un rappel sur une fonction fournie par l’utilisateur qui lira les entrées de n’importe où , puis renverra la valeur appropriée à la partie de la bibliothèque qui utilise cette fonction.
la source
Si elle lit à partir de stdin, cela signifie qu'elle aimerait s'approprier stdin au niveau du programme. Cela n’est probablement pas compatible avec les autres bibliothèques qui lisent à partir de stdin, protocole moins spécifique pour la façon dont elles partagent l’utilisation. Dans au moins mon glossaire personnel, cela ferait de la bibliothèque un cadre , ce qui représente un compromis coûteux.
Mais dans ce cas, la bibliothèque devrait probablement prendre uniquement un descripteur de fichier d’entrée.
la source
La réponse de @ Paul92 est une bonne discussion générale, mais je voudrais proposer une solution propre (ish) à cela:
Dans une bibliothèque, ce code doit être adaptable à tout environnement d'exécution. Vous ne pouvez donc pas vraiment demander
STDIN
des données cruciales. D'une part, les utilisateurs de votre bibliothèque pourraient ne pas disposer de stdin pour un certain nombre de raisons. Au lieu de cela, vous souhaiterez peut-être utiliser une forme de modèle de stratégie pour personnaliser le mode de récupération du jeton.En Python, la meilleure option est probablement de passer la stratégie d'extraction de jetons en tant que paramètre de fonction. Quelque chose comme ca:
Pensez-y comme ça. Le jeton dont vous avez besoin est un argument de la fonction de bibliothèque. Étant donné que la valeur du jeton peut ne pas être connue de manière statique sur le site de l'appel, vous ne pouvez pas réellement demander la valeur en tant qu'argument. Au lieu de cela, l'appelant doit fournir une fonction qui sera chargée de fournir le jeton lors de l'appel.
Toute la responsabilité de fournir les mécanismes exacts du jeton est maintenant externalisée de la fonction de bibliothèque. Le consommateur de la fonction est maintenant responsable de l’acquisition du jeton par tout moyen disponible au moment de l’exécution. Il peut demander à STDIN, mais il peut également servir de passerelle de messagerie, attendre que le message apparaisse dans la boîte de réception, le lire, extraire le jeton et automatiser complètement le processus. Il peut s'agir d'une boîte de dialogue graphique ou d'un formulaire Web. N'importe quoi vraiment - toutes les options sont maintenant entre les mains du consommateur de la bibliothèque.
la source