1) 環境変数をできるだけ避けることをお勧めします。
環境変数の利点
- どこからでも見えるので使いやすいです。多くの独立したプログラムが情報を必要とする場合、このアプローチは非常に便利です。
環境変数の短所
- どこからでも見える (削除可能、設定可能) ため、正しく使用するのは困難です。環境変数に依存する新しいプログラムをインストールすると、それらは既存のプログラムを踏みにじるでしょうか? 昨日うっかり遊んでいたときに、うっかり環境変数を台無しにしてしまったのでしょうか?
私の意見
- プログラムの個々の呼び出しごとに異なる可能性が最も高い引数には、コマンドライン引数を使用します (つまり、n を計算するプログラムには n!)。
- ユーザーが合理的に変更したいがあまり頻繁ではない引数に構成ファイルを使用します (つまり、ウィンドウがポップアップしたときの表示サイズ)
- 環境変数は控えめに使用してください -- できれば、変更されないと予想される引数 (つまり、Python インタープリターの場所) に対してのみ使用してください。
- あなたの指摘
They are global and accessible from anywhere, which is less elegant from architectural point of view, but limits the amount of code
は、グローバル変数を使用する正当な理由を思い出させます;)
環境変数の乱用の恐怖を直接体験したことによる私の傷跡
- 仕事で必要な 2 つのプログラム。環境の衝突により、同じコンピューターで同時に実行することはできません。
- プログラムの複数のバージョンは、同じ名前でバグが異なります -- プログラムの場所が環境から引き出され、(静かに、微妙に) 間違っていたため、ワークショップ全体が何時間もひざまずきました。
2) 限界
コマンドラインが保持できるもの、または環境が処理できるもののいずれかの限界を押し広げている場合は、すぐにリファクタリングします。
私は過去に、多くのパラメーターを必要とするコマンドライン アプリケーションに JSON を使用しました。文字列や数値だけでなく、辞書やリストも使えるのはとても便利でした。このアプリケーションは、いくつかのコマンド ライン引数しか取りませんでした。そのうちの 1 つは JSON ファイルの場所でした。
このアプローチの利点
- CLI ライブラリと対話するために多くの (面倒な) コードを書く必要はありませんでした -- 複雑な制約を強制するために多くの共通ライブラリを取得するのは面倒な場合があります (「複雑」とは、特定のキーまたは一連のキー間の代替)
- 引数の順序に関する CLI ライブラリの要件について心配する必要はありません。JSON オブジェクトを使用するだけです。
What won't fit into command line parameters?
リストなどの複雑なデータ(回答)を表現しやすい
- 他のアプリケーションからのデータを簡単に使用できます -- プログラムによる作成と解析の両方
- 将来の拡張に対応しやすい
注: これを .config-file アプローチと区別したい - これはユーザー構成を保存するためのものではありません。コマンドラインにうまく収まらない多くの値を必要とするプログラムに使用するため、これを「コマンドラインパラメーターファイル」アプローチと呼ぶ必要があるかもしれません。
3) ソリューションの移植性: 環境変数とコマンド ライン引数に関する Mac、PC、および Linux の違いについてはよくわかりませんが、次のように言えます。
- 3つすべてが環境変数をサポートしています
- それらはすべてコマンドライン引数をサポートしています
はい、わかりました。あまり役に立ちませんでした。ごめんなさい。しかし重要な点は、合理的な解決策が移植可能であると期待できるということですが、プログラムでこれを確認したいことは間違いありません (たとえば、コマンド ライン引数はどのプラットフォームでも大文字と小文字を区別しますか? すべてのプラットフォームで? わかりません) )。
最後のポイント:
Tomasz が述べたように、パラメーターがどこから来たかはほとんどのアプリケーションにとって重要ではありません。