2016-02-24 3 views
1

Я придумал этот случай, когда я попытался реорганизовать сервер, который ответил на запросы, исходя из того, существуют ли какие-то литералы или нет внутри запроса. Следующий код в значительной степени подводит итог.Как заверить, что значения в файле свойств относятся к набору ключей другого файла свойств?

if (request.contains("AAA")) { 
    send(SUCCESS_RESPONSE); 
} else if (request.contains("BBB")) { 
    send(FAILURE_RESPONSE); 
} ... 

Итак, я создал responses.properties файл, который содержал возможные ответы и ключ для идентификации каждого из них:

SUCCESS_RESPONSE=<here there is a big successful response> 
FAILURE_RESPONSE=<here there is a smaller failure response> 
... 

и файл requests.properties, который содержал буквальный к искать в запросе и ответе, что сервер будет посылать, если ключ встречается:

AAA=SUCCESS_RESPONSE 
BBB=FAILURE_RESPONSE 
... 

и моей стороне сервера код был переработан на это:

ResourceBundle responses = ResourceBundle.getBundle("responses"); 
ResourceBundle requests = ResourceBundle.getBundle("requests); 
... 
for (String requestKey : requests.keySet()) { 
    if (clientRequest.contains(requestKey)) { 
     send(responses.getString(requests.getString(requestKey))); 
     break; 
    } 
} 

, который определенно более изящный, чем первоначальный.

Но меня беспокоит то, что теперь вы должны быть уверены, что файл request.properties содержит значения только из набора файлов response.properties.

Я написал метод, который проверяет это:

private static boolean resourceBundlesAreWellStructured() { 
    Set<String> responseKeys = responses.keySet(); 
    for (String requestKey : requests.keySet()) { 
     String requestValue = requests.getString(requestKey); 
     if (!responseKeys.contains(requestValue)) { 
      return false; 
     } 
    } 
    return true; 
} 

, но я чувствую, что я нарушаю СУХОЙ принцип таким образом. Итак, мои вопросы:

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

ответ

0

У вас неплохой метод, за исключением одной линии ненужных назначений. Вы могли бы написать так:

private static boolean resourceBundlesAreWellStructured() { 
    for (String requestKey : requests.keySet()) { 
     String requestValue = requests.getString(requestKey); 
     if (!responses.containsKey(requestValue)) { 
      return false; 
     } 
    } 
    return true; 
} 

Если вы используете Java 8, вы можете написать то же самое с stream():

private static boolean resourceBundlesAreWellStructured() { 
    return requests.keySet().stream().noneMatch(
     key->!responses.containsKey(requests.getString(key)) 
    ); 
} 
+0

Спасибо Кен! Да, у Java 8 есть отличные возможности, но мне пришлось придерживаться Java 7 для этого проекта ... –

+0

@Alex, тогда ваш метод неплохой, используйте его, без сомнения –

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

  • Нет связанных вопросов^_^