職場で取り組んでいる大規模なプロジェクトのライブラリを作成しているときに、トークンを電子メールアドレスに送信し、コードに戻して後で使用できるようにするという問題が発生しました。
私の同僚は、STDINから(Python:code = input("Enter code: ")
を使用して)読み取り、それをユーザーに渡すように言っていますが、ライブラリーが使用される可能性があるため(この場合は間違いなく)、これは悪い習慣のようですサーバー上のバックグラウンドタスクで。
これがアンチパターンと見なされているのかどうか疑問に思っていました。
一般的なガイドラインとして、ライブラリは環境から完全に切り離されている必要があります。つまり、標準のストリームや特定のファイルに対して操作を実行したり、使用されている環境やコンテキストについて期待したりしないでください。
もちろん、このルールには例外がありますが、それには十分な理由があるはずです。 stdin
を使用する場合、理由がわかりません(ライブラリが実際にstdinから読み取るためのルーチン(C++のstd::cin
など)を提供している場合を除く)。また、I/Oストリームをハードコードするのではなくパラメーターから取得すると、柔軟性が大幅に向上するため、実行する価値がありません。
これは必ずしもアンチパターンではなく、不十分に設計されたライブラリであると考えます。入力を直接渡すことができるメソッドパラメータとして文字列を要求するのは簡単です。
これがこの使用法に適合しない場合は、メソッドパラメータをストリームにして、STDINをメソッドに渡します。
それがこの使用法に適合しない場合、ライブラリは十分に柔軟ではありません。
whereverから入力を読み取るユーザー提供の関数にコールバックを設定し、適切な値をライブラリーのその部分を使用しているライブラリーの任意の部分に戻す、ライブラリーの機能を検討することを検討してください。
Stdinから読み取る場合は、プログラムレベルのstdinの所有権を取得することを意味します。 stdinから読み取る他のどのライブラリとも互換性がない可能性が高く、使用方法を特定するプロトコルとしてはそれほど具体的ではありません。少なくとも私自身の個人用語集では、これはライブラリをframeworkにしますが、これはコストのかかるトレードオフです。
ただし、この場合、ライブラリはおそらく入力ファイル記述子のみを取得する必要があります。
@ Paul92による答えは良い一般的な議論ですが、可能な限りclean(ish)ソリューションを提供したいと思います。
ライブラリの場合、このコードはどのランタイム環境にも適応できる必要があるため、STDIN
に重要なデータを要求することはできません。 1つには、ライブラリのユーザーがさまざまな理由でstdinを使用できない場合があります。代わりに、何らかの形式のstrategyパターンを使用して、トークンの取得方法をカスタマイズすることができます。
Pythonでは、おそらく最良のオプションは、トークンフェッチ戦略を関数パラメーターとして渡すことです。そんな感じ:
def stdin_Prompt():
return input("Enter code: ")
def my_library_function(arg1, arg2, ... argn, token_provider = stdin_Prompt):
...
token = token_provider()
...
return stuff
# somewhere in the user code
stuff = my_library_function(a1, a2, ... an, lambda: "123456")
このように考えてください。必要なトークンは、ライブラリー関数の引数です。トークンの値は呼び出しサイトで静的に認識されていない可能性があるため、実際には値を引数として要求することはできません。代わりに、呼び出し元は、呼び出されたときにトークンを提供する必要がある関数を提供する必要があります。
提供のすべての責任==トークンの正確なメカニズムは、ライブラリ関数から外部化されます。関数のコンシューマーは、実行時に利用可能な手段によってトークンを取得する責任があります。 STDINを要求することもありますが、メールゲートウェイとして機能し、メッセージが受信トレイに表示されるのを待って、それを読み取り、トークンを抽出して、プロセスを完全に自動化することもできます。 GUIダイアログまたはWebベースのフォームの場合があります。本当に何でも-すべてのオプションは今や図書館の消費者の手に渡っています。