この記事は Medium でも読むことができます。
プログラミング言語が時間の経過とともにどのように進化するかを見るのはいつも面白いです。
私がソフトウェア開発の世界へ足を踏み入れたとき、Python、PHP、JavaScript などの動的言語は、迅速な開発に適した柔軟性と簡潔な構文で高く評価されていました。
しかし、これらの弱く型付けされた言語は進化するにつれて、強く型付けされた言語の機能を組み込んでおり、C や Java に非常に似ています。
厳密な型指定言語では、コード内で変数の型を明示的に定義します。目的は、プログラムを実行する前の開発段階でエラーを捕捉し、これらの変数に割り当てるメモリ サイズに関するヒントをコンパイラに提供することです。
// C example: 'y' will be an integer float x = 3.14; int y = x; // y = 3 (ignored the decimal part of the number)
一方、Python、PHP、JavaScript などの動的型付け言語では、変数を作成し、実行時にインタプリタにその型を暗示させることができます。
# In python and PHP: 'y' will take the same type as 'x' x = 3.14 y = x // y = 3.14 (float)
次の例では、動的型付けと静的型付けを使用して同じ関数を宣言します。
Python:
# using the classic syntax: def add(x, y): return x y # using explicit typing: def add(x: int, y:int) -> int: return x y
JavaScript / TypeScript:
// using the classic syntax function add(x, y) { return x y; } // using explicit typing function add(x: number, y: number): number { return x y; }
PHP:
// using the classic syntax: function add($x, $y) { return $x $y; } // using explicit typing: function add(int $x, int $y): int { return $x $y; }
PHP 8.2 (2022 年 12 月リリース) では、スタンドアロン型として null、true、および false のサポートを導入することで、さらにそれを推し進めています:
public null $nil = null; public false $false = false;`
この記事をこれらの新機能に対する異議とは受け取らないでください。厳密に型指定された言語を使用する利点は認めます。ただし、たとえば、Python で型アノテーションを使用しても、変数の型を変更できます:
x: int = 0 x = "John" print(type(x)) #
PHP の場合も同様で、コンソールには非推奨の警告のみが表示されます。
ではなぜインタプリタがこのコードの実行を許可するのか疑問に思うかもしれません?
それは、これらの言語がそのように構築されているためです。それらは定義により動的に型付けされます。この特性を削除すると、それらは動的ではなくなります。 C のような厳密に型指定された言語になりますが、速度は遅くなります。
できれば、PHP ファイルで strict_types を true に設定することで、インタープリタをより厳密にすることができます。
declare(strict_types=1);
Python を使用している間、「mypy」パッケージを使用してコードを分析し、バグをキャッチできます:
$ mypy program.py error: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
「mypy」がアドバイザーとして表示され、何が間違っていたかを教えてくれますが、危険を冒してコードを実行することを妨げるものではありません。
変数の型がわからない場合でも、union 演算子を使用して、受け入れられる型のリストを減らすことができます:
次の PHP と Python の例は、その方法を示しています。
y: int | float = f(x) # introduced in Python 3.10 int | float $y = f($x) // introduced in PHP 8.0 let y: number | string // typescript
10 年前、私は博士号取得のために Python を使用することに決めました。その理由は、そのシンプルさと新しいアイデアのプロトタイプをすぐに作成できるからです。その後、他のプロジェクトにもそれを使い始めました。
今、私は奇妙な PEP を読んで、これらの新機能を組み込んでコードベースを複雑にする価値が本当にあるのか自問していることに気づきました。
辞書の項目を出力する関数の例を見てみましょう。初期バージョンは次のとおりです:
def print_attributes(**kwargs): for key, value in kwargs.items(): print(key, value) person = {"name": "John", "height": 1.84} print_attributes(**person)
Python 3.12 で導入された PEP 692 の推奨事項を使用すると、コードは次のようになります:
from typing import TypedDict, Unpack class Person(TypedDict): # create a class inheriting from TypedDict name: str height: float def print_attributes(**kwargs: Unpack[Person]) -> None: # use the Unpack operator for key, value in kwargs.items(): print(key, value) person: Person = {"name": "John", "height": 1.84} # create an instance of the class print_attributes(**person)
要約すると、TypedDict を継承するクラスを作成し、各項目の名前と型を指定し、Unpack 演算子を使用して、受け取ったオブジェクトが TypedDict であることを「mypy」に伝えました。
その結果、コードのサイズが 2 倍になりました。オブジェクトにさらに多くの項目がある場合は、さらに長くなります。
幸いなことに、コードの一部に静的型付けを使用し、残りを動的のままにしておくことができます。あるいは、希望に応じて、まったく使用しないことも選択できます。
新しい素晴らしい機能を学んだからといって、コードベース全体を書き直さなければならないというプレッシャーを感じる必要はありません。
これらの新機能はツールのようなものです。私のアドバイスは、これらを賢く使うことです:
次のシナリオでは静的型付けを使用します:
次の場合は静的型指定の使用を避けてください:
コーディングに関しては、物事を複雑にする正当な理由がある場合を除き、常にシンプルさを追求することが黄金律であるということを覚えておいてください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3