Нет сомнений в том, что входящие и исходящие параметры приводят к запутанному коду, поскольку они могут увеличить неожиданные / непредсказуемые побочные эффекты.
Итак, многие хорошие программисты говорят:
Избегайте входных-выходных параметров для изменения параметров изменяемого метода. Предпочитаю оставить параметры без изменений.
Для программиста-перфекциониста, который ожидает, что его код будет наиболее чистым и понятным, должно ли это «правило» применяться во всех случаях?
Например, предположим, что базовый метод добавления элементов в простой список существует двумя способами:
Первый способ (с параметром входа-выхода):
private void addElementsToExistingList(List<String> myList){
myList.add("Foo");
myList.add("Bar");
}
и вызывающий абонент:
List<String> myList = new ArrayList<String>();
//.......Several Instructions (or not) .....
addElementsToExistingList(myList);
Второй путь без параметра out:
private List<String> addElementsToExistingList(List<String> originalList){
List<String> filledList = new ArrayList<String>(originalList); //add existing elements
filledList.add("Foo");
filledList.add("Bar");
return filledList;
}
и вызывающий абонент:
List<String> myList = new ArrayList<String>();
//.......Several Instructions (or not) .....
myList.addAll(addElementsToExistingList(myList));
Плюсы второго пути:
Параметр не изменяется => нет риска непредвиденных побочных эффектов для новой программы чтения кода.
Минусы второго способа:
Очень многословный и очень менее читаемый ...
Конечно, вы сказали бы мне, что для такого простого кода первый способ действительно более удобен.
Но, если мы не учитываем сложность какой-либо концепции / кода, я считаю второй способ более логичным и очевидным для любых читателей (новичков или нет).
Тем не менее, он нарушает принцип CQS, который рассматривает методы «команды» с пустым возвратом с потенциальными (но разрешенными, поскольку это условно) побочными эффектами и методы «запроса», имеющие тип возврата и без побочных эффектов.
Итак, что должен принять мотивирующий программист? Смешение двух в соответствии с кодом дела? Или придерживайтесь «закона», ожидая всегда избегать параметров входа-выхода ...
(Конечно, метод для добавления Элемента назван для объяснения примера, и в реальном коде это будет неправильным выбором).