μμ μλ°μ€ν¬λ¦½νΈ ν΄λμ€ μΊ‘μν ꡬν λͺ¨λ
μΊ‘μλ¬λΈ λͺ¨λμ μλ°μ€ν¬λ¦½νΈ ν΄λμ€μμ μ½κ² μ κ·Όμ νμ κ°λ μ μ¬μ©ν μ μκ² λμ΅λλ€. ν΄λ‘μ κ°λ μ ν΅ν΄ μΊ‘μν λ° μλν κ°λ μ ꡬνν©λλ€.
npm i capsulable --save
μλ°μ€ν¬λ¦½νΈμ κΈ°λ³Έ λ³μκ°λ μλ _ μ __μΌλ‘ νννλ prvate λ° protected λ³μ κ°λ μ΄ μ‘΄μ¬νμ§λ§, ν ν΄λμ€μμ ν΄λΉ λ³μλ₯Ό μ½λ κ²μ λ§μ§λ λͺ»ν©λλ€. λν protected κ°λ μ κ²½μ° μμ μ΄ν μ κ·Όμ νμ κ°λ μ΄ μμ§κΉμ§ λͺ¨νΈν©λλ€. λ΄λΆ λ³μμ μλμ±μ΄ νμν ν΄λμ€μλ ν΄λμ€ λ³μμ λ³΄λ€ λͺ νν μ κ·Όμ νμ κ°λ μ΄ νμν©λλ€.
λ¬Όλ‘ κ·Έλ κ² ν΄λ μκ΄μ μμ΅λλ€. νμ§λ§ ν΄λμ€ μΈμ€ν΄μ€ λ§λ€ κ°κΈ° λ€λ₯Έ Private λ³μ 곡κ°μ λ§λ€κ³ μΆκ±°λ(μΈλΆμμ μ κ·Όν μ μλ), μμ μ΄νμλ κ°κΈ° μΈμ€ν΄μ€λ§λ€ λ€λ₯Έ Protected λ³μ 곡κ°μ λ§λ€κ³ μΆκ±°λ, νΉμ ν¨ν€μ§ μ¬μ΄μμλ§ μ κ·Όκ°λ₯ν Protected Static λ³μ곡κ°μ λ§€λ² μ§μ λ§λ λ€λ©΄ λ€μ νμ΄ λΉ μ§λ μμ
μΌ μ μμ΅λλ€. Capsulable μ μμ ν μλμ±κ³Ό νμ₯μ±, κ·Έλ¦¬κ³ μμ ν΄λμ€ λ° ν¨ν€μ§ κ°μ Protected λ° Protected Static λ³μ κ°λ
μ μ 곡ν©λλ€.
Capsulable μ class μ constructor ν¨μλ₯Ό ν΅ν΄μ λ°μ΄ν° νλλ₯Ό 곡μ ν©λλ€. (μ΄λ μ¦ Capsulable μ΄ μ΅μ’
μ μΌλ‘ νμ μμ ν΄λμ€λ‘ κ΅¬μ± λ¨μ μλ―Έν©λλ€.) μΊ‘μν νκΈΈ μνλ ν΄λμ€λ μ¬μ μ Capsulable μ ν΅ν΄μ constructor μμ λ°μ΄ν° νλλ₯Ό μμ λ°μμΌν©λλ€. μμ μ λ¬Έλ²μ ES5λ‘ νκΈ°λλ, Babelμ ν΅ν ES6 λ¬Έλ²μΌλ‘ ꡬνν΄λ λ©λλ€.
// A.js
const Capsulable = require('capsulable')
const Field = Capsulable()
class A {
constructor(_field){
// λ°μ΄ν° νλλ₯Ό ꡬμ±ν©λλ€.
Field(this, _field)
// μλμ κ°μ μ½λλ₯Ό ν΅ν΄μ
// ν΄λμ€ λ΄ ν¨μ μμ± μ
// λ°μ΄ν° νλμ μ κ·Ό κ°λ₯ν©λλ€.
Field(this).private
Field(this).protected
Field(this).protectedStatic
}
}
module.exports = A// index.js
const Capsulable = require('./capsulable')
const A = require('./A')
// Capsulableμ ν΄λμ€ μνμ λ£μΌλ©΄
// μΊ‘μν λ ν΄λμ€κ° λ°νλ©λλ€.
const SharedA = Capsulable(A)
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedA = new SharedA()Field(this).private
Field(this).protected
Field(this).protectedStaticCapsulable λͺ¨λμ κ° ν΄λμ€λ§λ€ λ°μ΄ν° νλλΌλ κ²μ μμ±νλλ°, μ΄ λ°μ΄ν° νλμλ private, protected, protectedStatic λ³μνν(getter)λ‘ μ 곡λ©λλ€. λ°μ΄ν° νλλ ν΄λμ€μ μΈμ€ν΄μ€λ§λ€ μμ±λλ―λ‘ λ°μ΄ν° νλ μ κ·Όμμλ μΈμ€ν΄μ€κ° νλμ μΈμλ‘ μ£Όμ΄μ ΈμΌ ν©λλ€.
Field(this).private.set(key, value) // => Boolean
Field(this).private.exist(key) // => Boolean
Field(this).private.get(key) // => Object
Field(this).private.getAll() // => Object
Field(this).private.remove(key) // => Boolean
Field(this).private.removeAll() // => BooleanPrivate νλλ κ° μΈμ€ν΄μ€λ§λ€ 격리λ 곡κ°μ κ°μ§λ©° ν μΈμ€ν΄μ€κ° μ κ·Όν μ μλλ‘ μ°¨λ¨λ©λλ€. κ°λ°μκ° κ°μ ν΄λμ€ λ΄μμ Field(this) λ₯Ό λ€λ₯Έ μΈμ€ν΄μ€μκ² λ
ΈμΆμν¬ μ μλ μ½λλ₯Ό μμ±νμ§λ§ μλλ€λ©΄ λ³μμ μλμ±μ μ μ§λ κ²μ
λλ€.
Field(this).protected.set(className, key, value) // => Boolean
Field(this).protected.exist(className, key) // => Boolean
Field(this).protected.get(className, key) // => Object
Field(this).protected.getAll(className) // => Object
Field(this).protected.remove(className, key) // => Boolean
Field(this).protected.removeAll(className) // => BooleanProtected νλλ κ° μΈμ€ν΄μ€λ§λ€ 격리λ 곡κ°μ κ°μ§λ©°, μ κ·Όνκ³ μ νλ className μ ν¨μ μ¬μ©μ 맨 μ²μ μΈμλ‘ μ 곡ν΄μΌν©λλ€. Protected νλλ ν΄λμ€ μμμ΄ λ°μνμλ λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€ μ¬μ΄μλ§(λν κ°μ ν¨ν€μ§) 곡μ λμ΄μΌ νλ λ°μ΄ν° μ΄μ©μ μ ν©ν©λλ€.
Field(this).protectedStatic.set(className, key, value) // => Boolean
Field(this).protectedStatic.exist(className, key) // => Boolean
Field(this).protectedStatic.get(className, key) // => Object
Field(this).protectedStatic.getAll(className) // => Object
Field(this).protectedStatic.remove(className, key) // => Boolean
Field(this).protectedStatic.removeAll(className) // => BooleanProtected Static νλλ κ° μΈμ€ν΄μ€μ 곡μ λ 곡κ°μ κ°μ§λ©°, μ κ·Όνκ³ μ νλ classNameμ ν¨μ μ¬μ©μ 맨 μ²μ μΈμλ‘ μ 곡ν΄μΌν©λλ€. Protected Static νλλ λΆλͺ¨ν΄λμ€μ μμν΄λμ€κ° κ°μ λ°μ΄ν°λ₯Ό μ΄μ©νλ©΄μ λμμ λͺ¨λ ν΄λμ€ μΈμ€ν΄μ€λ€μ΄ κ°μ λ°μ΄ν°λ₯Ό 곡μ ν΄μΌ νλ λ°μ΄ν° μ΄μ©μ μ ν©ν©λλ€.
νμ ν΄λμ€λ₯Ό μμ±νμ λ λΆλͺ¨ν΄λμ€μ μμν΄λμ€κ° Protected μ ProtectedStatic ννμ λ°μ΄ν° νλλ₯Ό 곡μ νκ² νλ €λ©΄ μλμ κ°μ λ°©λ²μ ν΅ν΄ ꡬνν μ μμ΅λλ€. (μμμ μ§νν΄λ Private λ°μ΄ν° νλλ 곡μ λμ§ μμ΅λλ€.)
// B.js
const Capsulable = require('capsulable')
const A = require('./A')
const Field = Capsulable()
class B extends A {
constructor(_field){
// νμ ν΄λμ€λ constructor λ₯Ό ν΅ν΄μ
// λ°μ νλ κ°μ²΄λ₯Ό super ν€μλλ₯Ό ν΅ν΄μ
// λ°λμ λΆλͺ¨ ν΄λμ€λ‘ λ겨μΌν©λλ€.
super(_field)
// λ°μ΄ν° νλλ₯Ό ꡬμ±ν©λλ€.
Field(this, _field)
}
}
module.exports = B// index.js
const Capsulable = require('./capsulable')
const B = require('./B')
// Capsulableμ ν΄λ
9695
μ€ μνμ λ£μΌλ©΄
// μΊ‘μν λ ν΄λμ€κ° λ°νλ©λλ€.
const SharedB = Capsulable(B)
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedB = new SharedB()μ΄λ―Έ μ ν΄λμ€λ₯Ό Capsulable λ‘ μΊ‘μν μν¨ μ΄νμ λ€μνλ² λ€λ₯Έ ν΄λμ€μμ ν΄λΉ ν΄λμ€λ₯Ό νμλ°κ³ μΆμ κ²½μ°, μλμ κ°μ λ°©λ²μ ν΅ν΄ μ΄λ₯Ό ꡬνν μ μμ΅λλ€.
// C.js
const Capsulable = require('./capsulable')
const B = require('./B')
const SharedB = Capsulable(B)
const Field = Capsulable()
class C extends SharedB{
constructor(inherit){
// λΆλͺ¨ ν΄λμ€μΈ Capsulable μμ
// λ°μ΄ν° νλλ₯Ό μμΌλ‘ λ°μμ΅λλ€.
let hook = {}
super(hook)
// λ°μ΄ν° νλλ₯Ό ꡬμ±ν©λλ€.
Field(this, hook.field)
// μ΄ν λ€μνλ² νμμ΄ κ°λ₯νλλ‘,
// νμλμ μ κ°μ²΄λ₯Ό 볡μ¬ν΄μ€λλ€.
if(inherit) Capsulable(hook, inherit)
}
}
module.exports = C
// index.js
const Capsulable = require('./capsulable')
const C = require('./C')
// Capsulableμ ν΄λμ€ μνμ λ£μΌλ©΄
// μΊ‘μν λ ν΄λμ€κ° λ°νλ©λλ€.
const SharedC = Capsulable(C)
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedC = new SharedC()Capsulable μλ Java μ Package κ°λ
μ΄ λ―Έμ½νκ² κ΅¬νλμ΄ μμ΅λλ€. μλμ²λΌ μ¬λ¬ ν΄λμ€λ₯Ό νλ²μ μΊ‘μν ν κ²½μ°, ν΄λΉ ν΄λμ€λ€μ μΈμ€ν΄μ€λ€μ Protected λ°μ΄ν° νλμ Protected Static λ°μ΄ν° νλκ° μλμΌλ‘ 곡μ λ©λλ€.
μ£Όμ: νλμ ν¨ν€μ§μ λ±λ‘λλ μ¬λ¬ ν΄λμ€ μνλ€μ μλ‘ μ΄λ¦μ΄ κ²ΉμΉ μ μμ΅λλ€.
// index.js
const A = require('./A')
const B = require('./B')
const C = require('./C')
// Capsulable μ μΈμλ‘
// λ°°μ΄μ ν΄λμ€ μνλ€μ λ΄μ μ λ¬νλ©΄
// μ΄λ₯Ό νλμ ν¨ν€μ§λ‘ ꡬμ±ν©λλ€.
let packages = Capsulable([A, B, C])
// μλμ κ°μ΄ packages.* λ₯Ό ν΅ν΄
// μΊ‘μν λ ν΄λμ€ μνμ μ κ·Όν μ μμ΅λλ€.
let packA = new packages.A()
let packB = new packages.B()
let packC = new packages.C()// index.js
const A = require('./A')
const B = require('./B')
const C = require('./C')
const D = require('./A')
// Capsulable μ μΈμλ‘
// λ°°μ΄μ ν΄λμ€ μνλ€μ λ΄μ μ λ¬νλ©΄
// μ΄λ₯Ό νλμ ν¨ν€μ§λ‘ ꡬμ±ν©λλ€.
let packages = Capsulable([A, B, C])
// packages._load ν¨μλ₯Ό ν΅ν΄μ
// μνλ ν΄λμ€ μνμ ν¨ν€μ§ κ³΅κ° κ΅¬μ±
// μ΄νμλ ν΄λΉ ν¨ν€μ§μ μΆκ°μν¬ μ μμ΅λλ€.
packages._load(D)
// packages.* λ₯Ό ν΅ν΄μ
// μΆκ°λ ν΄λμ€ μνμ μ κ·Ό κ°λ₯ν©λλ€.
let packD = new packages.D()packages._load(D)
let packD = new packages.D()
// packages._unload ν¨μλ₯Ό ν΅ν΄μ
// ν¨ν€μ§μ ν¬ν¨λμ΄ μλ ν΄λμ€ μνμ
// ν΄λΉ ν¨ν€μ§μμ μμ μν¬ μ μμ΅λλ€.
packages._unload(D)
// μ΄λ―Έ ν¨ν€μ§μ μΆκ°λ ν΄λμ€ μνμΌλ‘
// ν΄λμ€ μΈμ€ν΄μ€κ° ꡬμ±λ κ²½μ°
// ν΄λΉ μΈμ€ν΄μ€μλ μν₯μ΄ μμ΅λλ€.ν΄λμ€ μνμ μΊ‘μν μ΄ν νμ ν΄λμ€λ₯Ό λ μ΄μ λ§λ€κΈΈ μμΉ μλ κ²½μ° Capsulable ν¨μ μ¬μ©μ 2λ²μ§Έ μΈμλ‘ final λͺ¨λλ₯Ό μ μ©μν΄μΌλ‘μ¨ νμ ν΄λμ€μ λ°μ΄ν° νλλ₯Ό 곡μ νμ§ μλλ‘ ν μ μμ΅λλ€. (ν΄λμ€μ νμμ μμ ν λ§μ§λ λͺ»νλ, λ°μ΄ν° νλκ° κ³΅μ λλ κ²μ λ§μ μλ μμ΅λλ€.)
// index.js
const Capsulable = require('./capsulable')
const A = require('./A')
// 2λ²μ§Έ μΈμλ‘ finalμ μ μΌλ©΄
// νμν΄λμ€μ λ°μ΄ν° νλλ₯Ό 곡μ νμ§ μμ΅λλ€.
const SharedA = Capsulable(A, 'final')
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedA = new SharedA()- Private λ³μ ꡬν
- Protected λ³μ ꡬν
- Protected Static λ³μ ꡬν
- κ° λ³μμ λ¨κ³λ³ μ΄κΈ°ν κ³Όμ ꡬν
- ν΅ν© λ°μ΄ν° νλ ꡬν
- μμκΈ°λ°μ μ μΆμλ λ°μ΄ν° νλ 곡μ ꡬν
- ν¨ν€μ§κ° Protected λ°μ΄ν° 곡μ ꡬν
- Helper λ₯Ό ν΅ν Private λ³μ μΈμλ¨μΆ ꡬν
- μΊ‘μν μ΄ν μμ ν΄λμ€ μΆκ° λ° μ¬ μΊ‘μν ꡬν
- ν μ€νΈ μ λ ꡬν
- assert κ°λ³λͺ¨λν νμ¬ μ’ μμ± μμ λ°°μ ꡬν
- final ν΄λμ€ κ΅¬ν
- final λ³μ ꡬν
- μΊ‘μν λ ν΄λμ€μ constructor κ°λ³λ³μ μΈμ ꡬν
- μΊ‘μν λ ν΄λμ€μ constructor κ°λ³λ³μμ νμν΄λμ€ κ³΅μ ꡬν
MIT