2012-05-18 3 views
1

Я пишу программу с кучей классов, которые будут сериализованы для сохранения в базе данных и для отправки по сети.Карта против класса Свойства советы

Чтобы упростить доступ к свойствам класса с помощью интерфейса командной строки, я рассматриваю возможность хранения свойств в классе Map вместо того, чтобы предоставлять каждому свойству собственную переменную.

В принципе, вместо того, чтобы использовать что-то вроде этого:

String id = account.getUserId(); 

Я хотел бы сделать это

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

Является ли это целесообразным способ сделать это?

+1

я предлагаю делать, как указано выше, но использовать перечисление, а не строк –

ответ

2

Да, это довольно разумная модель. Его иногда называют «prototype object model» и очень похожи на то, как вы будете работать в JavaScript, где каждый объект фактически является Картой. Это, в свою очередь, привело к очень популярному формату сериализации JSON.

Хорошие характеристики:

  • Вам не придется беспокоиться о грязных наследования heirarchies - вы можете просто изменить свойства по желанию.
  • Вы можете создать новый объект, просто скопировав его с другого объекта (прототип)
  • Код для управления данными может быть выполнен единообразным образом, без явного указания всех переменных.
  • Это более «динамический» по сравнению с определением статического класса - это легко расширить и изменить ваши объекты

Потенциальные риски/отрицательные стороны:

  • Вы должны отслеживать ваши имена свойств, если вы используете Strings - компилятор не сделает это за вас! Эта проблема может быть устранена с помощью Enums в качестве ключей, но тогда вы теряете некоторую гибкость ...
  • Вы не получаете преимущества проверки статического типа, поэтому вы можете обнаружить, что вам нужно написать больше тестов JUnit для обеспечения вещи работают правильно
  • Существует немного снижается производительность (хотя, вероятно, не достаточно, чтобы беспокоиться о том, что карта поиски очень быстро)

Я на самом деле написал целую игру в 90-е годы, используя вариант О.Г. эта объектная модель (Tyrant), и она работала очень хорошо.

Вместо того, чтобы иметь объект карты, однако, вы можете рассмотреть возможность инкапсуляции этой функции, чтобы вы могли использовать метод доступа к самому объекту, например.

String id = account.getProperty("userId"); 
+0

Спасибо! Мне лучше двигаться дальше. –

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.имя(), чтобы получить строковое представление значения перечисления и использования

Map<String,String> 

вместо ..

+0

Спасибо большое! Я могу дать только один ответ на зеленый чек, но вы тоже получите его, если я смогу сделать больше. –

+0

не беспокоится, я не в этом за очки .... если у вас есть еще вопросы, я буду рад разработать – ianpojman

Смежные вопросы