1

私は、データベースに保存してネットワーク経由で送信するためにシリアル化される一連のクラスを含むプログラムを作成しています。

コマンドラインインターフェイスを介してクラスプロパティにアクセスしやすくするために、各プロパティに独自の変数を与えるのではなく、プロパティをMapクラスに格納することを検討しています。

基本的に、次のようなものを使用する代わりに:

String id = account.getUserId();

私はこれをします

String id = account.properties.get("userId");

これは物事を行うための推奨される方法ですか?

4

2 に答える 2

2

はい、それはかなり賢明なモデルです。これは「プロトタイプオブジェクトモデル」と呼ばれることもあり、すべてのオブジェクトが事実上マップであるJavaScriptでの作業方法と非常によく似ています。これにより、非常に人気のあるJSONシリアル化形式が生まれました。

素晴らしい機能:

  • 厄介な継承階層について心配する必要はありません。プロパティを自由に変更できます。
  • 別のオブジェクト(プロトタイプ)からコピーするだけで、新しいオブジェクトを作成できます
  • データを操作するコードは、すべての変数に明示的に名前を付けることなく、統一された方法で操作できます。
  • 静的クラス定義と比較してより「動的」です-オブジェクトの拡張と変更は簡単です

潜在的なリスク/デメリット:

  • 文字列を使用する場合は、プロパティ名を追跡する必要があります。コンパイラはそれを行いません。この問題は、列挙型をキーとして使用することで軽減できますが、柔軟性が失われます...
  • 静的型チェックのメリットは得られないため、結果として、正常に機能していることを確認するために、より多くのJUnitテストを作成する必要がある場合があります。
  • わずかなパフォーマンスのオーバーヘッドがあります(ただし、マップのルックアップは非常に高速であるため、心配する必要はありません)。

私は実際にこのオブジェクトモデル(Tyrant)のバリアントを使用して90年代にゲーム全体を作成しましたが、非常にうまく機能しました。

ただし、Mapオブジェクトを公開するのではなく、この機能をカプセル化して、オブジェクト自体でアクセサメソッドを使用できるようにすることを検討することをお勧めします。

String id = account.getProperty("userId");
于 2012-05-18T04:08:55.160 に答える
2

私がこれを行うことを好む方法は、多くの場合、次のようになります。

enum StringPropertyType {
   USERID, FIRSTNAME, LASTNAME
}

interface StringAttributes {
    String get(StringPropertyType s);
    void put(StringPropertyType s, String value);
}

class MapBasedStringAttributes implements StringAttributes {
    Map<StringPropertyType, String> map = new HashMap<~>();
    String get(StringPropertyType s) { return map.get(s); }
    void put(StringPropertyType s, String value) { map.put(s,value); }
}

これにより、コンパイル時の安全性、リファクタリングなどが可能になります。

stringPropertyType.name()を使用して、列挙値の文字列表現を取得し、

Map<String,String> 

代わりは..

于 2012-05-18T04:11:01.410 に答える