https://github.com/hmmhmmhm/capsulable
π A module that helps developers easily encapsulate classes in nodejs.
https://github.com/hmmhmmhm/capsulable
encapsulation encapsule javascript nodejs object-oriented-javascript oop package private-variables
Last synced: about 1 month ago
JSON representation
π A module that helps developers easily encapsulate classes in nodejs.
- Host: GitHub
- URL: https://github.com/hmmhmmhm/capsulable
- Owner: hmmhmmhm
- License: mit
- Created: 2018-12-17T16:57:43.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2018-12-21T18:03:24.000Z (over 7 years ago)
- Last Synced: 2025-06-02T00:34:09.307Z (about 1 year ago)
- Topics: encapsulation, encapsule, javascript, nodejs, object-oriented-javascript, oop, package, private-variables
- Language: JavaScript
- Homepage:
- Size: 31.3 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README-KR.md
- License: LICENSE
Awesome Lists containing this project
README
## Capsulable
[](https://travis-ci.org/hmmhmmhm/capsulable)
```
μμ μλ°μ€ν¬λ¦½νΈ ν΄λμ€ μΊ‘μν ꡬν λͺ¨λ
```

μΊ‘μλ¬λΈ λͺ¨λμ μλ°μ€ν¬λ¦½νΈ ν΄λμ€μμ μ½κ² μ κ·Όμ νμ κ°λ
μ μ¬μ©ν μ μκ² λμ΅λλ€. ν΄λ‘μ κ°λ
μ ν΅ν΄ μΊ‘μν λ° μλν κ°λ
μ ꡬνν©λλ€.
## μ€μΉλ°©λ²
```
npm i capsulable --save
```
--------------------------------------
## μ μ΄ λͺ¨λμ΄ νμνκ°μ?
μλ°μ€ν¬λ¦½νΈμ κΈ°λ³Έ λ³μκ°λ
μλ _ μ __μΌλ‘ νννλ prvate λ° protected λ³μ κ°λ
μ΄ μ‘΄μ¬νμ§λ§, ν ν΄λμ€μμ ν΄λΉ λ³μλ₯Ό μ½λ κ²μ λ§μ§λ λͺ»ν©λλ€. λν protected κ°λ
μ κ²½μ° μμ μ΄ν μ κ·Όμ νμ κ°λ
μ΄ μμ§κΉμ§ λͺ¨νΈν©λλ€. λ΄λΆ λ³μμ μλμ±μ΄ νμν ν΄λμ€μλ ν΄λμ€ λ³μμ λ³΄λ€ λͺ
νν μ κ·Όμ νμ κ°λ
μ΄ νμν©λλ€.
## κ·Έλ₯ Closure λ Symbol μΌλ‘ λ§€λ² λ§λ€λ©΄ λμ§ μλμ?
λ¬Όλ‘ κ·Έλ κ² ν΄λ μκ΄μ μμ΅λλ€. νμ§λ§ ν΄λμ€ μΈμ€ν΄μ€ λ§λ€ κ°κΈ° λ€λ₯Έ Private λ³μ 곡κ°μ λ§λ€κ³ μΆκ±°λ(`μΈλΆμμ μ κ·Όν μ μλ`), μμ μ΄νμλ κ°κΈ° μΈμ€ν΄μ€λ§λ€ λ€λ₯Έ Protected λ³μ 곡κ°μ λ§λ€κ³ μΆκ±°λ, νΉμ ν¨ν€μ§ μ¬μ΄μμλ§ μ κ·Όκ°λ₯ν Protected Static λ³μ곡κ°μ λ§€λ² μ§μ λ§λ λ€λ©΄ λ€μ νμ΄ λΉ μ§λ μμ
μΌ μ μμ΅λλ€. Capsulable μ μμ ν μλμ±κ³Ό νμ₯μ±, κ·Έλ¦¬κ³ μμ ν΄λμ€ λ° ν¨ν€μ§ κ°μ Protected λ° Protected Static λ³μ κ°λ
μ μ 곡ν©λλ€.
--------------------------------------
## μΊ‘μν λ ν΄λμ€ μ μλ°©λ²
Capsulable μ `class` μ `constructor` ν¨μλ₯Ό ν΅ν΄μ λ°μ΄ν° νλλ₯Ό 곡μ ν©λλ€. (μ΄λ μ¦ Capsulable μ΄ μ΅μ’
μ μΌλ‘ νμ μμ ν΄λμ€λ‘ κ΅¬μ± λ¨μ μλ―Έν©λλ€.) μΊ‘μν νκΈΈ μνλ ν΄λμ€λ μ¬μ μ Capsulable μ ν΅ν΄μ constructor μμ λ°μ΄ν° νλλ₯Ό μμ λ°μμΌν©λλ€. μμ μ λ¬Έλ²μ ES5λ‘ νκΈ°λλ, Babelμ ν΅ν ES6 λ¬Έλ²μΌλ‘ ꡬνν΄λ λ©λλ€.
### ν΄λμ€ μ μ μμ
```js
// 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
```
### ν΄λμ€ μΊ‘μν μμ
```js
// index.js
const Capsulable = require('./capsulable')
const A = require('./A')
// Capsulableμ ν΄λμ€ μνμ λ£μΌλ©΄
// μΊ‘μν λ ν΄λμ€κ° λ°νλ©λλ€.
const SharedA = Capsulable(A)
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedA = new SharedA()
```
--------------------------------------
## Field λ³μ μ κ·Όλ²
```js
Field(this).private
Field(this).protected
Field(this).protectedStatic
```
Capsulable λͺ¨λμ κ° ν΄λμ€λ§λ€ λ°μ΄ν° νλλΌλ κ²μ μμ±νλλ°, μ΄ λ°μ΄ν° νλμλ `private`, `protected`, `protectedStatic` λ³μνν(`getter`)λ‘ μ 곡λ©λλ€. λ°μ΄ν° νλλ ν΄λμ€μ μΈμ€ν΄μ€λ§λ€ μμ±λλ―λ‘ λ°μ΄ν° νλ μ κ·Όμμλ μΈμ€ν΄μ€κ° νλμ μΈμλ‘ μ£Όμ΄μ ΈμΌ ν©λλ€.
### Private νλ μ¬μ©λ²
```js
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() // => Boolean
```
Private νλλ κ° μΈμ€ν΄μ€λ§λ€ 격리λ 곡κ°μ κ°μ§λ©° ν μΈμ€ν΄μ€κ° μ κ·Όν μ μλλ‘ μ°¨λ¨λ©λλ€. κ°λ°μκ° κ°μ ν΄λμ€ λ΄μμ `Field(this)` λ₯Ό λ€λ₯Έ μΈμ€ν΄μ€μκ² λ
ΈμΆμν¬ μ μλ μ½λλ₯Ό μμ±νμ§λ§ μλλ€λ©΄ λ³μμ μλμ±μ μ μ§λ κ²μ
λλ€.
### Protected νλ μ¬μ©λ²
```js
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) // => Boolean
```
Protected νλλ κ° μΈμ€ν΄μ€λ§λ€ 격리λ 곡κ°μ κ°μ§λ©°, μ κ·Όνκ³ μ νλ className μ ν¨μ μ¬μ©μ 맨 μ²μ μΈμλ‘ μ 곡ν΄μΌν©λλ€. Protected νλλ ν΄λμ€ μμμ΄ λ°μνμλ λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€ μ¬μ΄μλ§(λν κ°μ ν¨ν€μ§) 곡μ λμ΄μΌ νλ λ°μ΄ν° μ΄μ©μ μ ν©ν©λλ€.
### Protected Static νλ μ¬μ©λ²
```js
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) // => Boolean
```
Protected Static νλλ κ° μΈμ€ν΄μ€μ 곡μ λ 곡κ°μ κ°μ§λ©°, μ κ·Όνκ³ μ νλ classNameμ ν¨μ μ¬μ©μ 맨 μ²μ μΈμλ‘ μ 곡ν΄μΌν©λλ€. Protected Static νλλ λΆλͺ¨ν΄λμ€μ μμν΄λμ€κ° κ°μ λ°μ΄ν°λ₯Ό μ΄μ©νλ©΄μ λμμ λͺ¨λ ν΄λμ€ μΈμ€ν΄μ€λ€μ΄ κ°μ λ°μ΄ν°λ₯Ό 곡μ ν΄μΌ νλ λ°μ΄ν° μ΄μ©μ μ ν©ν©λλ€.
--------------------------------------
## μΊ‘μν λ νμ ν΄λμ€ μ μλ°©λ²
νμ ν΄λμ€λ₯Ό μμ±νμ λ λΆλͺ¨ν΄λμ€μ μμν΄λμ€κ° `Protected` μ `ProtectedStatic` ννμ λ°μ΄ν° νλλ₯Ό 곡μ νκ² νλ €λ©΄ μλμ κ°μ λ°©λ²μ ν΅ν΄ ꡬνν μ μμ΅λλ€. (μμμ μ§νν΄λ `Private` λ°μ΄ν° νλλ 곡μ λμ§ μμ΅λλ€.)
### νμν΄λμ€ μ μ
```js
// 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
```
### νμν΄λμ€ μΊ‘μν
```js
// index.js
const Capsulable = require('./capsulable')
const B = require('./B')
// Capsulableμ ν΄λμ€ μνμ λ£μΌλ©΄
// μΊ‘μν λ ν΄λμ€κ° λ°νλ©λλ€.
const SharedB = Capsulable(B)
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedB = new SharedB()
```
--------------------------------------
## μ΄λ―Έ μΊ‘μν λ ν΄λμ€μ νμλ°©λ²
μ΄λ―Έ μ ν΄λμ€λ₯Ό Capsulable λ‘ μΊ‘μν μν¨ μ΄νμ λ€μνλ² λ€λ₯Έ ν΄λμ€μμ ν΄λΉ ν΄λμ€λ₯Ό νμλ°κ³ μΆμ κ²½μ°, μλμ κ°μ λ°©λ²μ ν΅ν΄ μ΄λ₯Ό ꡬνν μ μμ΅λλ€.
```js
// 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` λ°μ΄ν° νλκ° μλμΌλ‘ 곡μ λ©λλ€.
#### μ£Όμ: νλμ ν¨ν€μ§μ λ±λ‘λλ μ¬λ¬ ν΄λμ€ μνλ€μ μλ‘ μ΄λ¦μ΄ κ²ΉμΉ μ μμ΅λλ€.
```js
// 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()
```
### ν¨ν€μ§ μμ± μ΄ν ν΄λμ€ λ‘λ
```js
// 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()
```
### ν¨ν€μ§ μμ± μ΄ν ν΄λμ€ μΈλ‘λ
```js
packages._load(D)
let packD = new packages.D()
// packages._unload ν¨μλ₯Ό ν΅ν΄μ
// ν¨ν€μ§μ ν¬ν¨λμ΄ μλ ν΄λμ€ μνμ
// ν΄λΉ ν¨ν€μ§μμ μμ μν¬ μ μμ΅λλ€.
packages._unload(D)
// μ΄λ―Έ ν¨ν€μ§μ μΆκ°λ ν΄λμ€ μνμΌλ‘
// ν΄λμ€ μΈμ€ν΄μ€κ° ꡬμ±λ κ²½μ°
// ν΄λΉ μΈμ€ν΄μ€μλ μν₯μ΄ μμ΅λλ€.
```
--------------------------------------
## Final Class ꡬν
ν΄λμ€ μνμ μΊ‘μν μ΄ν νμ ν΄λμ€λ₯Ό λ μ΄μ λ§λ€κΈΈ μμΉ μλ κ²½μ° Capsulable ν¨μ μ¬μ©μ 2λ²μ§Έ μΈμλ‘ final λͺ¨λλ₯Ό μ μ©μν΄μΌλ‘μ¨ νμ ν΄λμ€μ λ°μ΄ν° νλλ₯Ό 곡μ νμ§ μλλ‘ ν μ μμ΅λλ€. (ν΄λμ€μ νμμ μμ ν λ§μ§λ λͺ»νλ, λ°μ΄ν° νλκ° κ³΅μ λλ κ²μ λ§μ μλ μμ΅λλ€.)
```js
// index.js
const Capsulable = require('./capsulable')
const A = require('./A')
// 2λ²μ§Έ μΈμλ‘ finalμ μ μΌλ©΄
// νμν΄λμ€μ λ°μ΄ν° νλλ₯Ό 곡μ νμ§ μμ΅λλ€.
const SharedA = Capsulable(A, 'final')
// μΊ‘μν λ ν΄λμ€λ₯Ό ν΅ν΄μ
// μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
let sharedA = new SharedA()
```
--------------------------------------
## μμ
λͺ©λ‘
- [x] Private λ³μ ꡬν
- [x] Protected λ³μ ꡬν
- [x] Protected Static λ³μ ꡬν
- [x] κ° λ³μμ λ¨κ³λ³ μ΄κΈ°ν κ³Όμ ꡬν
- [x] ν΅ν© λ°μ΄ν° νλ ꡬν
- [x] μμκΈ°λ°μ μ μΆμλ λ°μ΄ν° νλ 곡μ ꡬν
- [x] ν¨ν€μ§κ° Protected λ°μ΄ν° 곡μ ꡬν
- [x] Helper λ₯Ό ν΅ν Private λ³μ μΈμλ¨μΆ ꡬν
- [x] μΊ‘μν μ΄ν μμ ν΄λμ€ μΆκ° λ° μ¬ μΊ‘μν ꡬν
- [x] ν
μ€νΈ μ λ ꡬν
- [x] assert κ°λ³λͺ¨λν νμ¬ μ’
μμ± μμ λ°°μ ꡬν
- [x] final ν΄λμ€ κ΅¬ν
- [ ] final λ³μ ꡬν
- [ ] μΊ‘μν λ ν΄λμ€μ constructor κ°λ³λ³μ μΈμ ꡬν
- [ ] μΊ‘μν λ ν΄λμ€μ constructor κ°λ³λ³μμ νμν΄λμ€ κ³΅μ ꡬν
--------------------------------------
## LICENSE
MIT