Длинный список параметров и длинный список переменных состояния

10

В книге C ++ автор говорит, что нам больше не нужна функция с длинным списком параметров, потому что большинство параметров могут быть преобразованы в переменные состояния в классе. С другой стороны, книга по функциональному программированию говорит, что переменные состояния являются злыми, потому что они вызывают побочные эффекты, которые вызывают склонность к ошибкам и затрудняют распараллеливание кода. Я растерялся. Должен ли код избегать максимально возможного использования переменных состояния, перемещая его переменную состояния в список параметров функции?

TomCaps
источник
Была ли оригинальная книга, комментирующая С ++, функциональным языком?
Мартин Йорк,

Ответы:

7

Зависит, если вы программируете в proceduralили functionalпарадигме. Изменчивое состояние требуется для первого и наносит урон для последующего. Это яблоки и апельсины. Они оба правы на своих бейливиках!

Вы можете применять одиночное присваивание и другие функциональные методы к императивным процедурным языкам, неизменяемое состояние делает параллельное программирование более детерминированным, но сделать каждый объект неизменным в языке, таком как Java или C ++, практически невозможно, потому что их модели памяти не поддерживают эту парадигму.


источник
:Спасибо! В книге «97 вещей, которые должен знать каждый программист», говорится, что мы должны применять принципы функционального программирования, такие как избегать побочных эффектов. Разве мы не можем применять принципы функционального программирования в контексте императивного кода?
TomCaps
Государство не требуется для процедурного программирования. Это распространено, но не обязательно. То, что это распространено, связано больше с привычками, чем с чем-либо еще. Хотя я признаю, что, безусловно, существуют ситуации, когда хранение переменной (состояния) проще, чем альтернативы (например, асинхронная обработка).
Марьян Венема
@Marjan все, что имеет неизменяемые переменные, является состоянием
@Jarrod: Теперь ты меня запутал. Читая ваш ответ еще раз, я вижу, что пропустил "Mutable" в "Требуется изменяемое состояние". Но ваш комментарий, кажется, говорит, что наличие неизменяемых переменных является состоянием. Не понимаю. Может быть потому, что я не привык разбрасываться и думать о изменчивом и неизменном в этих терминах. Любые ссылки для меня, чтобы прочитать?
Марьян Венема
@MarjanVenema: Да, наличие неизменяемых переменных - это состояние. Разница в состоянии обработки между процедурным и функциональным программированием не та, что proc.prog. имеет состояние, а функционал - нет, скорее, разница в том, что процесс. прог. имеет изменяемое состояние, в то время как состояние всегда неизменно в (чистом) функциональном программировании. См., Например, en.wikipedia.org/wiki/Purely_functional , где объясняется, что чисто функциональные языки избегают обновлений.
Слёске
1

Если я правильно понимаю ваш вопрос, вы спрашиваете, какие условия определяют использование параметра или переменной класса / member / field / etc? Я предполагаю, что вы имеете в виду метод, а не функцию. Если речь идет конкретно о C ++, я предлагаю перенести ваш вопрос в переполнение стека.

Длинный список параметров может быть признаком того, что вам может понадобиться реорганизовать ваш метод в набор более детальных. Как правило, использование параметров сделает ваш код более свободным. Я не уверен, верно ли это для большинства современных ОО-языков, но создание объектов может быть дорогостоящим, особенно если в нем задействовано много переменных класса; Итак, если ваши переменные класса были объектами и на них часто ссылались в программе, то они могут быть оправданы как переменные класса.

Также:

  • Могут ли другие методы использовать переменные класса? Если да, то рассмотрите возможность использования переменных класса.
  • Ваш метод публичен? Если публично, используйте параметры.
  • Может ли ваш список параметров соответствующим образом быть представлен в виде хэша / карты / массива / коллекции / списка / и т. Д.? Если это так, рассмотрите вариант.
  • Ваш метод статичен? Если да, используйте параметры.
Трэвис Дж
источник
0

Нет, переменные состояния сами по себе не вызывают побочных эффектов.

Вызов метода установки (для структуры данных, видимой в другом месте) является побочным эффектом.

Вы можете иметь структуры данных, чтобы скрывать длинные списки параметров и избегать побочных эффектов, если вы создадите их соответствующим образом. Вот небольшой пример (на Java, не тестировался):

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

Конечно, конструктор ManyParams по-прежнему будет иметь длинный список параметров таким образом. Но это скрыто.

Инго
источник