Побочный эффект - что это?
Может ли кто-нибудь сказать мне значение "побочный эффект" в следующей строке?
Если вы вызываете EL-функцию, которая ничего не возвращает, вы вызываете ее только для побочных эффектов.
5 ответов
Побочным эффектом является все, что делает метод, кроме вычисления и возврата значения. Любое изменение значений полей экземпляра или класса является побочным эффектом, как, например, рисование чего-либо на экране, запись в файл или сетевое соединение.
Строго говоря, "функция" определяется как не имеющая побочных эффектов - именно поэтому Java использует слово "метод". Реальная функция без возвращаемого значения была бы бессмысленной.
Очевидно, что метод, который не имеет возвращаемого значения, должен иметь некоторый побочный эффект, который оправдывает его существование. Методы set являются примером - побочным эффектом является изменение внутреннего состояния объекта.
Это означает, что вы не вызываете "истинную" функцию в математическом смысле. Такая функция всегда возвращает значение, которое полностью определяется ее входными параметрами. Нет "состояния" для изменения, и больше ничего не может произойти. Вот почему функциональное программирование интересно с точки зрения распараллеливания; это упрощает доказательство того, что, например, два вызова функций независимы и могут выполняться параллельно.
См. Статью в Википедии о чистых функциях для более подробной информации.
Побочный эффект - это когда вызов метода изменяет состояние класса. Так
public class SideEffectClass{
private int state = 0;
public doSomething(int arg0){
state += arg0;
}
}
Здесь doSomething(int arg0) имеет побочный эффект изменения переменной состояния.
Когда вы думаете о программе, вы можете думать о ней как о командах + состояние + ввод. Таким образом, если домен программы - это диапазон всех возможных состояний ввода *, и у программы есть побочные эффекты, вы можете видеть, что домен возможных результатов для приложения может стремительно расти по мере увеличения количества побочных эффектов. Это делает возможные состояния программы большими, что приводит к сложному тестированию. Функциональная парадигма программирования предназначена для устранения побочных эффектов. Делая функции первоклассными гражданами и делая все объявления неизменяемыми, функциональное программирование предотвращает побочные эффекты, что делает функциональное программирование сияющим при параллельной обработке, поскольку проблемы синхронизации уменьшаются.
Когда вы используете лекарство, это побочные эффекты, которые обычно являются нежелательными побочными эффектами. Основная цель его использования - получить "востребованный" эффект. Здесь, когда мы смотрим на угол функций, обычно, когда вы их вызываете, вы получаете вычисленное значение и используете его. Есть и другие функции, которые также меняют некоторые значения при вычислении "требуемого" значения, поэтому здесь "изменение некоторых значений" является побочным эффектом. В описании вашего предложения, если функция ничего не возвращает, она используется только для своих побочных эффектов, поэтому здесь побочные эффекты "меняют некоторые значения".
Давайте немного поработаем с приведенным выше кодом, чтобы сделать его более понятным в сравнении.
public class SideEffectClass{
private int state = 0;
public doSomething(...){//Does not matter
state ++;
}
}