2012-05-22 1 views
3

Hi Stackoverflow community,Лучшая практика - HashMap вместо списка параметров, хорошая идея?

Я работаю над некоторым кодом, где список факультативных критериев критерия представлен моему дао. Подпись метода содержит список +/- 10 параметров, которые мне действительно не нравятся и вы хотите переформатировать. Кроме того, я хотел бы избежать необходимости реорганизовать все сигнатуры методов из разных слоев только потому, что я могу добавить/удалить критерии

List searchParams(String name, Long countryCode, ...){ 
... 
} 

станет

List searchParams(HashMap<String,Object> map) { 
    BeanUtils.populate(this,map); 
    ... 
} 

Я немного обеспокоен тем, что это случится, потому что вроде плохой практики, потому что я отказываюсь от контроля над тем, что передается на карте, чтобы дать мне такую ​​гибкость? Итак, мой вопрос в том, правильно ли я нахожусь на правильном пути?

ответ

8

Когда я сталкиваюсь с подобными ситуациями, я стараюсь создать класс Params и передать , что вокруг. Преимущества заключаются в следующем:

  • В отличие от использования Map, вы можете иметь значащие геттеры/настройки, правильную проверку и т. Д .;
  • это безопасный тип и самоописывающий (что означает, что легко узнать доступные параметры и их типы).
  • вы можете добавлять новые параметры без необходимости реорганизации промежуточных уровней.
+0

+1 для четкого списка преимуществ – n00begon

2

Вы можете определить новый класс для хранения/обработки вашего набора параметров, поэтому вы получите немного больше контроля, чем даст вам HashMap. Раздражает писать или, по крайней мере, утомительно, но кажется лучшим балансом между гибкостью & контроля.

2

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

public Person { 
    private String name; 
    private String countryCode; 
} 

Тогда вы просто проездом этот объект вниз и может использовать методы получения, чтобы получить данные из которых должны быть легче читать и поддерживать, чем нужно знать все клавиши для HashMap на нескольких уровнях.

1

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

Для примера, где проходит карту уместно, обратите внимание на методе DriverManager.getConnection: этот метод должен передать параметры конструкторам реализации конкретного драйвера в Connection создаваемых, так оборачивает карту в Properties, и позволяет пользователь передает его конкретному соединению с драйвером. Обратите внимание: DriverManager не имеет другого решения, которое было бы надежным в будущем.

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