Exagg'itive Summary (TM)
いくつかのものがあります。
- プロトタイプの継承とクローニング
- 新しいプロパティの動的な追加
- 同じクラスの異なるバージョン(仕様レベル)のオブジェクトの共存。
- より新しいバージョン(仕様レベル)に属するオブジェクトには、追加の「オプション」プロパティがあります。
- 新旧のプロパティの内観
- 検証ルールのイントロスペクション(以下で説明)
致命的な欠点が1つあります。
- コンパイラは、スペルミスの文字列をチェックしません。
- 自動リファクタリングツールは、プロパティキーの名前を変更しません-豪華なものにお金を払わない限り。
大事なのは、イントロスペクションを使用してイントロスペクションを取得できるということです。これは通常起こることです:
- リフレクションを有効にします。
- 大規模なイントロスペクションライブラリをプロジェクトに追加します。
- さまざまなオブジェクトメソッドとプロパティを属性または注釈でマークします。
- イントロスペクションライブラリに魔法をかけてみましょう。
言い換えれば、FPとのインターフェースが必要ない場合は、Rich Hickeyのアドバイスを受ける必要はありません。
最後になりましたがString
、プロパティキーとして使用するのが最も簡単な意味を持ちますがString
、s を使用する必要はありませんが、少なくとも(最もきれいではありません)。Android™を含む多くのレガシーシステムは、フレームワーク全体で整数IDを広範囲に使用して、クラス、プロパティ、リソースなどを参照します。
AndroidはGoogle Inc.の商標です。
両方の世界を幸せにすることもできます。
Javaの世界では、通常どおりゲッターとセッターを実装します。
FPの世界では、
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
これらの関数の中には、いや、見苦しいコードがありますが、それを埋めるIDEプラグインがあります。コードを読み取るスマートプラグインです。
物事のJava側は、通常と同じようにパフォーマンスが向上します。コードのcodeい部分は決して使用しません。Javadocから非表示にすることもできます。
世界のFP側は、必要な「リート」コードを何でも記述できます。通常、コードが遅いことについては怒りません。
一般に、オブジェクトの代わりにマップ(プロパティバッグ)を使用することは、ソフトウェア開発では一般的です。関数型プログラミングや特定の種類の言語に固有のものではありません。特定の言語に対する慣用的なアプローチではないかもしれませんが、それを必要とする状況があります。
特に、シリアル化/逆シリアル化には多くの場合、同様の手法が必要です。
「オブジェクトとしてのマップ」に関する一般的な考え方。
- そのような「オブジェクトとしてのマップ」を検証するための関数を提供する必要があります。違いは、「オブジェクトとしてマップ」により、より柔軟な(制限の少ない)検証基準が可能になることです。
- 「オブジェクトとしてのマップ」に追加フィールドを簡単に追加できます。
- 有効なオブジェクトの最小要件の仕様を提供するには、以下が必要です。
- マップで予想される「最低限必要な」キーのセットをリストする
- 値を検証する必要があるキーごとに、値検証関数を提供します
- 複数のキー値をチェックする必要がある検証ルールがある場合は、それも提供します。
- 利点は何ですか?このように仕様を提供することは内省的です。最小限必要なキーのセットを照会し、各キーの検証関数を取得するプログラムを作成できます。
- OOPでは、これらすべてが「カプセル化」という名前でブラックボックスにロールアップされます。機械可読な検証ロジックの代わりに、呼び出し元は人間が読める「APIドキュメント」のみを読み取ることができます(幸いなことに存在する場合)。