私は Facebook のHack 言語のドキュメントを調べていましたが、利点の 1 つはリファクタリングであると書かれていました。部分的に型付けされているという理由だけで、Hack が PHP よりも簡単にリファクタリングできるのはなぜですか?
2 に答える
まず、PHPを型付けします。静的に型付けされているわけではありませんが、明確に定義された型システムを持っていることは確かです。型システムが異なれば目的も異なりますが、通常、型はコードの一部を特定の「もの」としてラベル付けし、コードの他の部分を特定の「もの」で動作するようにラベル付けするために存在します。たとえば、変数は「this is an int」とラベル付けされ、別の関数は「this parameter must be an int」とラベル付けされます。
これらのラベルがいつ、どこで、どのように使用されるかは、言語によって異なります。PHP は非常に寛容で、int を必要とする関数に文字列を渡すことができます。これは、PHP の型ジャグリングがそのような非互換性をオンザフライで処理するためです (拡張または別の拡張)。それでも、期待される型と一般的に互換性のある値を渡す必要があることを意味します。int を期待する関数に配列を渡すことはできません。これは意味がないからです。
現在、ツールはこの型情報を使用して、有効なコードを構築するのに役立ちます。配列であることがわかっているものを、int が必要であることがわかっている関数に渡そうとすると、IDE は警告を発します。それは非常に早い段階で発見されたバグです。IDE がそれを行わない場合は、コンパイラまたは静的解析ツールで行うことができます。それは少し後に発見されたバグですが、まだ発見されています。ただし、PHP は通常、実行前にコンパイラを介して実行されるわけではありません。最後の手段は、ランタイム システムが互換性のない型に遭遇したときにエラーをスローすることです。これは非常に遅く、キャッチしてデバッグするのが難しい場合があります。
したがって、厳密な型注釈を持つ言語は、このチェーンに沿って多くのツールに多くの情報を提供し、エラーを早期に発見するのに役立ちます。確かに、すべての状況ですべてのエラーが発生するわけではありませんが、早期に大規模なクラスのエラーを排除するのに役立ちます。これは、コードをリファクタリングするときに、互換性のない 2 つのコードをくっつけないようにするのに非常に役立ちます。非常に優れたツールは、互換性のメタ情報に基づいてコード構造を推論し、単純化または再構築を提案することさえできる場合があります。
しかし、単純な古い PHP でも、型注釈の利点を得ることができます。多くの IDE は、次のようなコメント注釈をサポートしています。
/**
* @param int $bar
* @return string
*/
function foo($bar) {
...
}
これは、Hack でこれと同じ型情報を提供します。
function (int): string
ただし、言語自体に組み込まれておらず、実際に正しい場合と正しくない場合があります。しかし、IDE などのツールがこの情報に基づいてコードを作成するのに役立つという点で、同じ利点があります。優れた IDE は、コードに関する推論に基づいて独自に型を検出し、注釈と実際のコードの不一致を指摘することさえあります。
したがって、厳密な型注釈が組み込まれている Hack のような言語には、すぐに使用できる明示的な型システムの利点があり、これらの型をコンパイル プロセスの一部として強制することで、コードが実際に作成される前に特定の問題を早期に発見するのに役立ちます。走る。プレーンな PHP には、外部ツールが使用する場合と使用しない場合がある非公式の型注釈* のみがあり、実行時に実際の問題のみをキャッチします。ただし、これらのツールは存在するため、全体的にはほとんどウォッシュ、IMO です。
* PHPは、その OO コンポーネント、および配列や callable などのいくつかの複雑な型に対して、完全な正式な型ヒントをサポートしています。ただし、これらは実行時に PHP 自体によってのみ使用されます。実行前の分析のためにサードパーティのツールに依存している。