Pure functions in JavaScript1 - Lee-hyuna/33-js-concepts-kr GitHub Wiki
"pure" ν¨μλ 무μμΈκ°?
μμ ν¨μλ κ·Έ λ²μλ₯Ό λ²μ΄λλ λ³μμ μνμ μμ‘΄νμ§ μκ³ μμ νμ§ μμ΅λλ€.
ꡬ체μ μΌλ‘ λ§νμλ©΄, μμ ν¨μλ λμΌν λ§€κ° λ³μκ° μ£Όμ΄μ§λ©΄ νμ λμΌν κ²°κ³Όλ₯Ό λ°ννλ€λ μλ―Έμ
λλ€.
μ€νμ μμ€ν
μ μνμ μμ‘΄νμ§ μμ΅λλ€.
μμ ν¨μλ ν¨μν νλ‘κ·Έλλ°μ κΈ°λ₯μ
λλ€.
μμ
var values = { a: 1 }
function impureFunction(items) {
var b = 1
items.a = items.a * b + 2
return items.a
}
var c = impureFunction(values)
// μ΄μ values.a λ 3μ΄κ³ , λΆμν ν¨μλ κ·Έκ²μ μμ ν©λλ€.
μ¬κΈ°μμλ μ£Όμ΄μ§ κ°μ²΄μ μμ±μ μμ ν©λλ€. κ·Έλ¬λ―λ‘ μ°λ¦¬λ ν¨μμ λ²μλ₯Ό λ²μ΄λλ κ°μ²΄λ₯Ό μμ ν©λλ€ : ν¨μλ λΆμν©λλ€.
var values = { a: 1 }
function pureFunction(a) {
var b = 1
a = a * b + 2
return a
}
var c = pureFunction(values.a)
// values.a λ μμ λμ§ μμμ΅λλ€. μ¬μ ν 1μ
λλ€.
μ΄μ μ°λ¦¬λ λ¨μν ν¨μμ λ²μμμλ λ§€κ° λ³μλ₯Ό μμ ν©λλ€. μ무κ²λ μΈλΆμμ μμ λμ§ μμ΅λλ€!
var values = { a: 1 }
var b = 1
function impureFunction(a) {
a = a * b + 2
return a
}
var c = impureFunction(values.a)
// μ€μ λ‘`c`μ κ°μ`b`μ κ°μ λ¬λ € μμ΅λλ€.
// λ ν° μ½λ λ² μ΄μ€μμλ κ²°κ³Όλ₯Ό μμ μ μΌλ‘ λ³νμν¬ μ μκΈ° λλ¬Έμ
// κ·Έ μ μ μμ΄ λ²λ¦΄ μλ μμ΅λλ€.
μ¬κΈ°μ, bλ ν¨μμ λ²μμ μνμ§ μλλ€. κ²°κ³Όλ μν©μ λ°λΌ λ¬λΌμ§λλ€: μμν λλΌμ!
var values = { a: 1 }
var b = 1
function pureFunction(a, c) {
a = a * c + 2
return a
}
var c = pureFunction(values.a, b)
// μ¬κΈ°μ cμ κ°μ bμ κ°μ μμ‘΄νλ€λ κ²μ λΆλͺ
ννμ΅λλ€
// λ± λ€μμ λΉμ΄ν λλΌμμ μμμ΅λλ€.
ꡬ체μ μΌλ‘ μ΄λ»κ² 보μ λκΉ?
μ΄ μ½λκ° μ‘΄μ¬νλ€κ³ μκ°νλ©΄ :
var getMinQuantity = function getMinQuantity(name) {
// μ£Όμ΄μ§ μ΄λ¦κ³Ό κ΄λ ¨νμ¬ μ«μλ₯Ό λ°ννλ μμν κΈκΌ΄.
}
λλ€ νλ‘μ νΈμ μ‘΄μ¬ν μμλ λ€μ μ½λ μμ λ₯Ό λ³΄κ² μ΅λλ€.
var popover = {
// A bunch of codeβ¦
addQuantityText: function(quantity) {
var quantityTextOptions = {
namespace: 'quantity',
initialChildIndex: 2,
quantity: quantity,
}
try {
this.formatQuantityText(quantityTextOptions)
} catch (err) {
console.log("Couldn't add quantity text!")
}
},
formatQuantityText: function(options) {
if (!this.$$boxContainer) {
throw new Error('$$boxContainer is not configured')
}
var namespace = options.namespace || 'quantity'
var quantity = options.quantity || 0
var initialChildIndex = options.initialChildIndex || 0
var $$quantity = new Canvas() // implementation details hidden
$$quantity.name = namespace
$$quantity.value = quantity
this.setQuantityTextColor($$quantity)
this.$$boxContainer.addChild($$quantity, initialChildIndex)
return $$quantity
},
setQuantityTextColor: function($$quantity) {
if (!$$quantity) return
var minQuantity = getMinQuantity($$quantity.name)
var quantity = $$quantity.value || minQuantity
var hasEnoughQuantity = quantity >= minQuantity
$$quantity.color = hasEnoughQuantity ? 'green' : 'red'
},
}
λͺ¨λ λΆμΆ©λΆ ν addQuantityText(), formatQuantityText() λ° setQuantityTextColor()κ° μμ΅λλ€.
μ°λ¦¬μ λ§₯λ½μμ addQuantityText()λ $$ boxContainerμ "μλ νμ"λ₯Ό μν λ μ€μ λ‘ μ¬μ©λλ λ©μλμ
λλ€.
μ΄κ²μ ꡬν μΈλΆ μ¬νμ λ€λ£¨λ μ§μ
μ μ
λλ€. $$ μλμ λ¬Έμ κ° μκΈΈ λ 보물 μ°ΎκΈ°μ μμμ΄ λ κ°λ₯μ±μ΄μλ μ΄ λ°©λ²μ μ΄ν΄ λ³΄κ² μ΅λλ€.
-νμ§λ§ μ¬λ―Έμλ κ²μ μλλλ€.
κ·Έκ²μ΄ μ°μ¬μ§λ λ°©μμ μ₯κΈ°μ μΌλ‘ μ€λ₯κ° λ μ μμ΅λλ€.
λ³΅μ‘ ν΄μ§λ©΄
μ΄ μμ μμλ ν¨μμ μ€ν μμκ° μ€μν©λλ€.
κ·Έλ₯ 2 μ€μ λ°κΎΈλ©΄ λͺ¨λ κ²μ λ§μΉ κ±°μΌ. κ·Έκ²μ λͺ λ°±νκ² λ€λ¦΄μ§ λͺ¨λ₯΄μ§λ§ λλ²κΉ νκΈ°κ° ν¨μ¬ λ μ΄λ ΅μ΅λλ€.
var popover = {
// A bunch of codeβ¦
addQuantityText: function(quantity) {
var quantityTextOptions = {
namespace: 'quantity',
initialChildIndex: 2,
quantity: quantity,
}
try {
this.formatQuantityText(quantityTextOptions)
} catch (err) {
console.log("Couldn't add quantity text!")
}
},
formatQuantityText: function(options) {
if (!this.$$boxContainer) {
throw new Error('$$boxContainer is not configured')
}
var namespace = options.namespace || 'quantity'
var quantity = options.quantity || 0
var initialChildIndex = options.initialChildIndex || 0
var $$quantity = new Canvas() // implementation details hidden
this.setQuantityTextColor($$quantity)
$$quantity.name = namespace
$$quantity.value = quantity
return $$quantity
},
setQuantityTextColor: function($$quantity) {
if (!$$quantity) return
var minQuantity = getMinQuantity($$quantity.name)
var quantity = $$quantity.value || minQuantity
var hasEnoughQuantity = quantity >= minQuantity
$$quantity.color = hasEnoughQuantity ? 'green' : 'red'
},
}
μ΄μ μ½λμ μ€λ₯κ° μμ΅λλ€. λ¬Έμ λ κ°μ§νκΈ° νλ μΌμ
λλ€!
μ¬κΈ°μμ setQuantityTextColor()λ $$ μλμ μμμ λ΄λΉν©λλ€.
λ°λΌμ κ°μ²΄λ₯Ό μμ νλ λ§μ§λ§ κ²μ μ‘μλ΄λ λ©μλλ₯Ό νμ ν λ€μ, μ 체 νλ‘μ°λ₯Ό λ€μ ꡬμ±νμ¬ μλͺ»λ μ μ μ΄ν΄ν΄μΌν©λλ€.
μ΄ μμ μμ formatQuantityText()λ₯Ό μμ λ©μλλ‘ λΆν΄νμ¬ κ΅¬ν μΈλΆ μ¬νμ λ¨μν ν κ²μ ννν μλ μμ΅λλ€.
μΌλ°μ μΌλ‘ λλ²κΉ
ν λ κ³ λ €ν΄μΌ ν λ§μ μ½λκ° μμ΅λλ€.
ν° λ©μλλ₯Ό μμ λ©μλλ‘ λΆν νλ κ²μ΄ λλ²κ·Έλ₯Ό μ΄λ ΅κ² λ§λ λ€λ©΄ μμν ν¨μμ κ°λ
μ΄ μ€μ ν΄μ§κ³ μλ€κ³ μκ°νλ©΄λ©λλ€.
μμν ν¨μλ‘ ν΄λ³΄μ.
μ½λλ₯Ό λ€μ μμ±νκΈ° μν΄ μ΅λμ μμ ν¨μλ₯Ό μ¬μ©ν©λλ€.
var popover = {
// μμ€ν
μνμ λͺ¨λ μμ μ¬νμ΄ μ¬κΈ°μ κ·Έλ£Ήνλ©λλ€.
// μ΄ μ μΌν λ°©λ²μ λλ²κ·Έλ₯Ό λ¨μννκ³ λΆμμ©μ μ΅μννλ μμ μ½μ
μ λ΄λΉν©λλ€.
addQuantityText: function(quantity) {
if (!this.$$boxContainer) {
throw new Error('$$boxContainer is not configured')
}
var quantityTextOptions = {
namespace: 'quantity',
quantity: quantity,
}
var $$quantity = this.formatQuantityText(quantityTextOptions)
this.$$boxContainer.addChild($$quantity, 2)
},
// μ΄ λ°©λ²μλ λΆμμ©μ΄ μμ΅λλ€.
// κ·Έλ₯ λ€λ₯Έ μμ ν¨μλ₯Ό νΈμΆν©λλ€. μνλλλ‘ μΊλ²μ€ κ°μ²΄λ₯Ό μμ±νκ³ λ°νν©λλ€.
formatQuantityText: function(options) {
var namespace = options.namespace || 'quantity'
var quantity = options.quantity || 0
var $$quantity = new Canvas() // implementation details hidden
$$quantity.name = namespace
$$quantity.value = quantity
$$quantity.color = this.getQuantityTextColor(quantity, namespace)
return $$quantity
},
// μ΄ λ°©λ²μλ λΆμμ©μ΄ μμ΅λλ€.
// μ£Όμ΄μ§ μλκ³Ό κ΄λ ¨νμ¬ μ νν μμμ λ°νν©λλ€.
getQuantityTextColor: function(quantity, namespace) {
var minQuantity = getMinQuantity(namespace)
var hasEnoughQuantity = quantity && quantity >= minQuantity
return hasEnoughQuantity ? 'green' : 'red'
},
}
μ΄ μλ‘μ΄ λ²μ μλ κ·Όλ³Έμ μΈ λ³νκ° μμ΅λλ€. κ·Έλ¬λ 무μν μμλ μ΄μ μ΄ μμ΅λλ€.
μ°λ¦¬κ° μ¬κΈ°μ ν μΌμ :
- setQuantityTextColor() λμ getQuantityTextColor()
- μ΄ λ©μλλ μ΄μ μ νλ κ²μ²λΌ κ°μ²΄λ₯Ό μ§μ μμ νλ λμ μ μ°λ¦¬κ° μ 곡 ν κ²κ³Ό κ΄λ ¨λ μμμ λ°νν©λλ€.
- λ©μλλ λ³μλ₯Ό ν΄λΉ λ²μ λ°μΌλ‘ κ°μ£Όνμ§ μμ΅λλ€.
- λ©μλλ μμν λ©μλλ§ νΈμΆν©λλ€.
- formatQuantityText()μμ $$ μλ κ°μ²΄μ μμ± / μμ μ λΆλ¦¬νμ΅λλ€.
- addQuantityText()μμ μμ€ν μνμ μμ μ 격리νμ΅λλ€.
κ·Έλ κ²ν¨μΌλ‘μ¨ λΆμμ©μ΄μλ λ©μλλ₯Ό μ κ±°νμ΅λλ€. μ½λ μ μ§ κ΄λ¦¬κ° κ°λ¨ν΄ μ‘μ΅λλ€.
$$ μλμΌλ‘ λ¬Έμ κ° λ°μνλ©΄ μ°Ύμ λ°©λ²μ νλλΏμ
λλ€.
μΈν°νμ΄μ€ κ°μν
μ°λ¦¬λ μ¬κΈ° κ³΅κ° λ°©λ²μ μ¬μ©νμ΅λλ€. λΉκ³΅κ°λ‘ λ§λ€λ©΄ μμ ν μ ν© ν κ²μ λλ€.
μ¬μ€, μ°λ¦¬μ μν μ μΈν°νμ΄μ€λ₯Ό λ¨μννλ κ²μ΄κΈ° λλ¬Έμ APIμ κ΄λ ¨μ΄ μμ΅λλ€.
Backbone.jsλ₯Ό μ¬μ©νμ¬ κ°μΈμ μΈ λ°©λ²μΌλ‘ λ΄ κ²μλ¬Όμ μ΄ν΄λ³΄μμμ€.
κ·Έλ€μ΄ μμν κ²μ²λΌ, νΉμ μν©μ μμ‘΄νμ§ μκΈ° λλ¬Έμ μΆμΆνκΈ°κ° μ½μ΅λλ€!
function getQuantityTextColor(quantity, namespace) {
var minQuantity = getMinQuantity(namespace)
var hasEnoughQuantity = quantity && quantity >= minQuantity
return hasEnoughQuantity ? 'green' : 'red'
}
function formatQuantityText(options) {
var namespace = options.namespace || 'quantity'
var quantity = options.quantity || 0
var $$quantity = new Canvas() // implementation details hidden
$$quantity.name = namespace
$$quantity.value = quantity
$$quantity.color = getQuantityTextColor(quantity, namespace)
return $$quantity
}
κ·Έλ¦¬κ³ λμ μ½λμμ λμ€μ :
var popover = {
// A bunch of codeβ¦
addQuantityText: function(quantity) {
if (!this.$$boxContainer) {
throw new Error('$$boxContainer is not configured')
}
var quantityTextOptions = {
namespace: 'quantity',
quantity: quantity,
}
var $$quantity = formatQuantityText(quantityTextOptions)
this.$$boxContainer.addChild($$quantity, 2)
},
// A bunch of codeβ¦
}
μμ ν¨μμ μ₯μ
μμ ν¨μμ κ°μ₯ ν° μ₯μ μ λΆμμ©μ΄ μλ€λ κ²μ
λλ€. ν΄λΉ λ²μλ₯Ό λ²μ΄λ μμ€ν
μνλ μμ νμ§ μμ΅λλ€.
κ·Έλ° λ€μ μ½λλ₯Ό λ¨μννκ³ λͺ
ννν©λλ€. μμν ν¨μλ₯Ό νΈμΆ ν λλ λ€λ₯Έ κ³³μμ μ무κ²λ λΆλ¬λ¨λ¦¬μ§ μμλ€λ κ²μ μκΈ° λλ¬Έμ
λ°ν κ°μ μ§μ€ν΄μΌν©λλ€.
μμ ν¨μλ κ°λ ₯ν©λλ€. κ·Έ μ€ν μμλ μμ€ν μ μλ¬΄λ° μν₯μμ£Όμ§ μμ΅λλ€. μμ ν¨μλ‘ μ°μ°μ λ³λ ¬ν ν μ μμ΅λλ€.
λν κ³ λ €ν΄μΌ ν λ¬Έλ§₯μ΄ μμΌλ―λ‘ μμ ν¨μλ₯Ό λ¨μ ν μ€νΈνλ κ²μ΄ λ§€μ° μ½μ΅λλ€. κ·Έλ₯ μ / μΆλ ₯μ μ§μ€νμμμ€.
λ§μ§λ§μΌλ‘, μμν ν¨μμ μ¬μ©μ μ΅λννλ©΄ μ½λκ°λ³΄λ€ κ°λ¨νκ³ μ μ° ν΄μ§λλ€.
λμμΈμ λ¬Έμ
μ€μ λ‘ κ°μ²΄ μ§ν₯ μ½λλ₯Ό μν ν λ ν¨μν νλ‘κ·Έλλ° κ°λ
μ΄ μ ν©νμ§ μλ€κ³ μκ°ν μ μμ΅λλ€.
OOPμ FPλ μ λμ μΌλ‘ νΈνλκΈ° λλ¬Έμ μ΄κ²μ μλͺ»λ κ²μ
λλ€!
μ€μ λ‘ μ¬κΈ°μ λμ¨ μμ΄λμ΄λ κ°λ¨ν©λλ€. μμ€ν μ μν₯μ λ―ΈμΉλ ν¨μμ μλ₯Ό μ ννμ¬ μ½λλ₯Ό λ¨μννμμμ€.
μ½λμμ μμν ν¨μμ μλ₯Ό μ΅λννκΈ° μν΄ λ λ² μκ°νλλ‘ κ°μνλ©΄ μ μ§ λ³΄μ / μλͺ / λλ²κ·Έλ₯Ό λ μ½κ² λ§λ€ μ μμ΅λλ€!
κΈμ, λΉμ μ κ·Έ μκ°μ κ°μ§κ³ μλ€. μ€μ λ‘λ λμμΈμ λ¬Έμ μ΄λ©°, μλ₯Ό λ€μ΄ getκ³Ό set μ¬μ΄μ μ νμ λλ€.