Je suis généralement d'accord avec les réponses précédentes, mais il y a un autre aspect important: la facilité d'utilisation.
Par exemple, dans git
, vous pouvez créer un dépôt avec le répertoire .git en dehors de celui-ci. Pour spécifier cela, vous pouvez utiliser un argument de ligne de commande --git-dir
ou une variable d'environnement GIT_DIR
.
Bien sûr, si vous changez le répertoire actuel vers un autre dépôt ou héritez des variables d'environnement dans des scripts, vous obtenez une erreur. Mais si vous devez taper plusieurs commandes git
dans un dépôt détaché pendant une session de terminal, c'est extrêmement pratique : vous n'avez pas besoin de répéter l'argument git-dir
.
Un autre exemple est GIT_AUTHOR_NAME
. Il semble qu'il n'ait même pas de partenaire en ligne de commande (cependant, git commit
a un argument --author
). GIT_AUTHOR_NAME
remplace les paramètres de configuration user.name et author.name.
En général, l'utilisation d'arguments en ligne de commande ou environnementaux est tout aussi simple sur UNIX : on peut utiliser un argument de ligne de commande
$ commande --arg=monarg
ou une variable d'environnement en une seule ligne :
$ ARG=monarg commande
Il est également facile de capturer des arguments de ligne de commande dans un alias
:
alias cfg='git --git-dir=$HOME/.cfg/ --work-tree=$HOME' # pour les fichiers de configuration
alias grep='grep --color=auto'
En général, la plupart des arguments sont passés par la ligne de commande. Je suis d'accord avec les réponses précédentes, selon lesquelles cela est plus fonctionnel et direct, et que les variables d'environnement dans les scripts sont comme des variables globales dans les programmes.
GNU libc dit ceci :
Le mécanisme argv est généralement utilisé pour passer des arguments de ligne de commande spécifiques au programme particulier qui est invoqué. En revanche, l'environnement garde une trace des informations partagées par de nombreux programmes, qui changent rarement et qui sont moins souvent utilisées.
Outre ce qui a été dit sur les dangers des variables d'environnement, il existe de bons cas d'utilisation pour celles-ci. GNU make gère de manière très flexible les variables d'environnement (et est donc très intégré au shell) :
Chaque variable d'environnement que make voit au démarrage est transformée en une variable make portant le même nom et la même valeur. Cependant, une affectation explicite dans le fichier makefile, ou avec un argument de commande, remplace l'environnement. (-- et il y a une option pour changer ce comportement) ...
Ainsi, en définissant la variable CFLAGS dans votre environnement, vous pouvez faire en sorte que toutes les compilations C dans la plupart des makefiles utilisent les commutateurs du compilateur que vous préférez. Cela est sûr pour les variables avec des significations standard ou conventionnelles car vous savez qu'aucun fichier make ne les utilisera pour d'autres choses.
Enfin, je voudrais souligner que ce qui est le plus important pour un programme n'est pas le programmeur, mais l'expérience utilisateur. Peut-être avez-vous inclus cela dans l'aspect design, mais le design interne et externe sont des entités assez différentes.
Et quelques mots sur les aspects de la programmation. Vous n'avez pas mentionné le langage que vous utilisez, mais imaginons que vos outils vous permettent l'analyse des arguments la plus optimale possible. En Python, j'utilise argparse, qui est très flexible et riche. Pour obtenir les arguments analysés, on peut utiliser une commande comme
args = parser.parse_args()
args peut être ensuite divisé en arguments analysés (disons args.my_option), mais je peux aussi les passer dans leur ensemble à ma fonction. Cette solution n'est absolument pas "difficile à maintenir pour un grand nombre d'arguments" (si votre langage le permet). En effet, si vous avez de nombreux paramètres et qu'ils ne sont pas utilisés lors de l'analyse des arguments, passez-les dans un conteneur vers leur destination finale et évitez la duplication de code (ce qui conduit à l'inflexibilité).
Et enfin, il est beaucoup plus facile de parser des variables d'environnement que des arguments de ligne de commande. Une variable d'environnement est simplement une paire, VARIABLE=valeur
. Les arguments de ligne de commande peuvent être beaucoup plus complexes : ils peuvent être des arguments positionnels ou par mot-clé, ou des sous-commandes (comme git push
). Ils peuvent capturer zéro ou plusieurs valeurs (pensez à la commande echo
et aux drapeaux comme -vvv
). Voir argparse pour plus d'exemples.
Et une dernière chose. Votre préoccupation concernant la mémoire est un peu perturbante. Ne créez pas de programmes surgénéraux. Une bibliothèque doit être flexible, mais un bon programme est utile sans aucun argument. Si vous devez en passer beaucoup, il s'agit probablement de données, pas d'arguments. Comment lire des données dans un programme est une question beaucoup plus générale sans solution unique pour tous les cas.