Идеально для минимизации или локализации побочных эффектов максимально; чистые функции обычно предпочтительнее.
This question on P.SE спрашивает конкретно о функциональном программировании, но многие принципы FP обычно считаются хорошей практикой для дизайна OO.
Неизменимость обычно считается хорошей вещью в любой парадигме программирования; не только потому, что он помогает с безопасностью потоков, а потому, что побочные эффекты могут быть довольно непрозрачными при отладке.
Методы, которые изменяют свои аргументы, существенно изменяют «общее состояние». Хотя глобальная переменная не так сильна, как глобальная переменная, неодобрение заключается в том, что их состояние сложнее прогнозировать при прохождении через программу.
Неизменяемые функции поддерживаются . (Что относится к дизайну OO/интерфейса, а также к дизайну пользовательского интерфейса).
Изменение аргументов, переданных по ссылке, является одним видом побочного эффекта, так как это означает, что эти аргументы не являются неизменными.
Чтобы переписать эту функцию без побочных эффектов, рассмотреть вопрос структурирования результатов в качестве возвращаемого значения, которые указывают на успех/провал, а также содержащий данные результата:
private Map<String, Integer> populateResults (final ImmutableSet<String> inputSet) {
Map<String, Integer> resultMap = new Map<String, Integer>();
final BatchResult<String> result = this.serviceClient.call(inputSet);
Integer output;
for (final String input : inputSet) {
try {
output = result.getOutput(input);
} catch (Exception e) {
output = null;
}
resultMap.put(input, output);
}
}
В качестве альтернативы, вы можете создать отдельный класс для сохраните свой результат вместо Map<String, Integer>
; в любом случае, цель состоит в том, чтобы избежать совместного состояния, написав «чистый» метод, который не модифицирует какое-либо государство, принадлежащее чему-либо более широкому, чем его собственная локальная область.
Спасибо за ваш ответ Бен. Помещение нулевого значения в карту кажется отсрочкой проблемы. Цель метода заключалась в том, чтобы добиться успеха, а результаты отказа были разделены и готовы к следующему шагу. Но да, я вижу ценность в рефакторинге в новый класс. – mindreader