В книге C ++ автор говорит, что нам больше не нужна функция с длинным списком параметров, потому что большинство параметров могут быть преобразованы в переменные состояния в классе. С другой стороны, книга по функциональному программированию говорит, что переменные состояния являются злыми, потому что они вызывают побочные эффекты, которые вызывают склонность к ошибкам и затрудняют распараллеливание кода. Я растерялся. Должен ли код избегать максимально возможного использования переменных состояния, перемещая его переменную состояния в список параметров функции?
10
Ответы:
Зависит, если вы программируете в
procedural
илиfunctional
парадигме. Изменчивое состояние требуется для первого и наносит урон для последующего. Это яблоки и апельсины. Они оба правы на своих бейливиках!Вы можете применять одиночное присваивание и другие функциональные методы к императивным процедурным языкам, неизменяемое состояние делает параллельное программирование более детерминированным, но сделать каждый объект неизменным в языке, таком как Java или C ++, практически невозможно, потому что их модели памяти не поддерживают эту парадигму.
источник
Если я правильно понимаю ваш вопрос, вы спрашиваете, какие условия определяют использование параметра или переменной класса / member / field / etc? Я предполагаю, что вы имеете в виду метод, а не функцию. Если речь идет конкретно о C ++, я предлагаю перенести ваш вопрос в переполнение стека.
Длинный список параметров может быть признаком того, что вам может понадобиться реорганизовать ваш метод в набор более детальных. Как правило, использование параметров сделает ваш код более свободным. Я не уверен, верно ли это для большинства современных ОО-языков, но создание объектов может быть дорогостоящим, особенно если в нем задействовано много переменных класса; Итак, если ваши переменные класса были объектами и на них часто ссылались в программе, то они могут быть оправданы как переменные класса.
Также:
источник
Нет, переменные состояния сами по себе не вызывают побочных эффектов.
Вызов метода установки (для структуры данных, видимой в другом месте) является побочным эффектом.
Вы можете иметь структуры данных, чтобы скрывать длинные списки параметров и избегать побочных эффектов, если вы создадите их соответствующим образом. Вот небольшой пример (на Java, не тестировался):
Конечно, конструктор ManyParams по-прежнему будет иметь длинный список параметров таким образом. Но это скрыто.
источник