코드의 실행결과로 인해서 값또는 상태가 변경되는것을 말한다. 의도와 다른 결과를 얻게 될수있기 때문에 예측 가능한 범위, 의도한 값을 도출할수 있도록 해야한다.
var a = 1
var b = 1
false && //뒤에 값과 상관없이 항상 false
true || // 뒤에 값과 상관없이 항상 true
func updateLeft() -> Bool {
a += 1
return true
}
func updateRight() -> Bool {
b += 1
return true
}
if updateLeft() || updateRight() {
//여기서 사이드 이펙트가 1번 발생
//updateRight()가 사이드 이펙트가 발생하지 않을수도 있다.
}
a // 2
b // 1
// 최소한의 평가만 진행하기 때문에 뒤에있는 updateRight를 연산하지 않는다.
var c = 1
var d = 1
func updateLeft2() -> Bool {
c += 1
return false
}
func updateRight2() -> Bool {
d += 1
return true
}
if updateLeft2() && updateRight2() {
//여기서 사이드 이펙트 1번 발생
}
c // 2
d // 1
//최소한의 평가만 진행하기 때문에 뒤에있는 updateRight를 연산하지 않는다.
let resultA = updateLeft()
let resultB = updateRight()
if resultA && resultB {
// 결과를 미리 도출해놓고 하게되면 호출 안되는 경우는 없기 떄문에 논리적 오류가 발생할 일이 거의없다.
그렇기때문에 side effect가 일어날만한 코드는 기피하는게 좋다.
}