web-dev-qa-db-ja.com

javascriptのような動的言語では、引数が何であるかをどのようにして知るのですか?

JavaまたはScala引数configuration: Confがある場合、Confclass/trait/case classを検索して、その構造体なので、どの引数を渡すかがわかります。

最近、JavaScriptの処理を開始しました。次のような関数が表示されます。

function init(conf) {
  some body // as external developer to init I should not mess 
            // with the internals here I just use init, proper design.
 }

知りたいのですが、confで何を送信するかを正確に知るにはどうすればよいですか?ドキュメンテーション?例? initの実装をスニッフィングしますか?開発者が書いたか、ドキュメントが提供されなかったか、例ではないかによって、すべてが私にとって悪い形式のように見えます。より正式なstrict confの意味を知る方法はありませんか?

静的に型付けされた言語を日常的に使用しているので、ドキュメントはほとんど必要ありません。関数が受け取る型を見るだけで、ほとんどの場合、何を渡さなければならないかわかります。

7
Jas

あなたはしません。それが問題です。型がメソッドの引数で宣言されておらず、コードが受け取ることを期待していることをコメントに記述していない場合、渡そうとしているものを理解する方法は2つしかありません。関数自体を調べて、入力で何が行われているかを確認するか、ドキュメントを確認してください。 (または、実際に別の形式のドキュメントであるサンプルコード。)

残念ながら、コードを見ると、それが「小さくてよく書かれた関数」であっても、David Arnoが彼の答えで示唆しているほど簡単ではないかもしれません。多くの小さくて単純な関数は、引数を1つ以上の関数呼び出しに渡すだけで構成されており、より便利に適合するように再配置されています。その後、掘り下げるコードがどんどん増えていきます。何をしているのかによっては、実際に何かを実行するコードに到達する前に、数十のレイヤーを下に移動しなければならない場合があります。 (これは、データベースアクセスコードなどで不愉快に一般的です。)そして、途中でいずれかのメソッドが不明な型のメソッドを呼び出すと、ジョブはさらに混乱します。

TLDR:自明ではないコードでは、適切なcorrectのドキュメントがない場合、型なし引数に何を渡すかを知ることは非常に困難です。これが、動的言語で書かれた大規模で複雑なプロジェクトをめったに見ない大きな理由の1つです。

6
Mason Wheeler

これはJavaScriptに固有の問題ではなく、動的言語だけの問題でもありません。たとえば、同等のJavaコードがあるとします。

void init(Configuration conf) {
    ...
}

次に、Configurationfinalクラスであり、パブリックコンストラクターがないことを発見すると、そのクラスのインスタンスを取得する方法を探し回る必要があります。

通常、ソースを利用できる場合は、コードを確認することが最初の行動となります。ソースは、関数が何をするかについての唯一の公式で最新の、正しいことが保証されたドキュメントです。それが小さくてよく書かれた関数である場合、confが何である必要があるかを理解することは簡単な作業でなければなりません。

問題のライブラリ/フレームワークに付属のドキュメントがある場合は、それを使用して関数の使用方法を理解できる場合があります。

最後に、JavaScriptに固有で、静的型付けが必要な場合は、JavaScriptに対する無料のオープンソースの静的型付け拡張である TypeScript を使用します。

6
David Arno