おめでとう!プログラミング言語/タイプシステムグローブを一周して、出発地から世界の反対側に到着しました。動的言語/プロトタイプベースのオブジェクトランドの境界に到着しました!
多くの動的言語(JavaScript、PHP、Pythonなど)では、実行時にオブジェクトプロパティを拡張または変更できます。
これの極端な形式は、SelfやJavaScriptのようなプロトタイプベースの言語です。厳密に言えば、クラスはありません。継承を使用して、クラスベースのオブジェクト指向プログラミングのように見えることを実行できますが、JavaやC#などのより明確に定義されたクラスベースの言語と比較して、ルールは大幅に緩和されます。
PHPやPythonのような言語は、その中間に存在します。定期的で慣用的なクラスベースのシステムがあります。ただし、JavaScriptにはないいくつかの制限(「組み込み型を除く」など)にかかわらず、オブジェクト属性は実行時に追加、変更、または削除できます。
このダイナミズムの大きなトレードオフはパフォーマンスです。言語がどれだけ強くまたは弱く型付けされているか、または機械語にコンパイルできるかを忘れてください。動的オブジェクトは、単純な構造ではなく、柔軟なマップ/辞書として表現する必要があります。これにより、すべてのオブジェクトアクセスにオーバーヘッドが追加されます。一部のプログラムはこのオーバーヘッドを削減するために非常に長くなります(たとえば、Pythonでのファントムkwarg割り当てとスロットベースのクラスを使用)が、余分なオーバーヘッドは通常、コースと入場料に見合うだけです。
設計に戻って、クラスのサブセットに動的プロパティを持つ機能を移植しています。AはProduct
、変数の属性を持つことができます。おそらく、またはは、そうInvoice
するOrder
ことはできませんでした。悪い方法ではありません。厳格で統制のとれた言語と型システムを維持しながら、必要な場所にバリエーションを持たせる柔軟性を提供します。欠点は、これらの柔軟なプロパティを管理することです。おそらく、ネイティブの属性とは少し異なるように見えるメカニズムを介して管理する必要があります。p.prop('tensile_strength')
のではなくp.tensile_strength
、例えば、とp.set_prop('tensile_strength', 104.4)
いうよりp.tensile_strength = 104.4
。しかし、私はPascal、Ada、C、Java、さらには非標準の属性タイプに対してまさにそのようなゲッターセッターアクセスを使用する動的言語でさえ、多くのプログラムを使用して構築しました。アプローチは明らかに実行可能です。
ところで、静的型と非常に多様な世界との間のこの緊張は非常に一般的です。特にリレーショナルおよび事前リレーショナルデータストアのデータベーススキーマを設計するときに、類似の問題がよく見られます。想定されるすべてのバリエーションの結合を含むか定義するのに十分な柔軟性を備えた「スーパーロー」を作成し、それらのフィールドに含まれるデータを詰めることで対処する場合があります。WordPressのwp_posts
テーブルには、例えば、などの分野があるcomment_count
、ping_status
、post_parent
およびpost_date_gmt
いくつかの状況下でのみ興味深いものです、実際には、多くの場合、空白を行くことを。別のアプローチは、のような非常に予備の正規化されたテーブルwp_options
です。Property
クラス。より明示的な管理が必要ですが、その中の項目が空白になることはめったにありません。オブジェクト指向データベースとドキュメントデータベース(MongoDBなど)は、オプションを変更するのに簡単に対応できる場合がよくあります。これは、属性を自由に作成および設定できるためです。