Design Patterns
μ리λ₯Ό μλ©΄ λΉμ·ν λꡬλ₯Ό λ§λ€ μ μλ€. λꡬλ₯Ό μ¬μ©νλ μ¬λμ΄ λ κ²μΈκ° λꡬλ₯Ό μ΄ν΄νλ μ¬λμ΄ λ κ²μΈκ°.
What is a Pattern?
Proven - ν¨ν΄μ΄λΌλ κ²μ κ²μ¦μ΄ λλ€λ κ²μ΄λ€.
Reusable - μ¬μ¬μ©μ΄ κ°λ₯νλ€. out of the box solution - λ°μ€μμ κΊΌλ΄μ λ°λ‘ μ¬μ©νλ€.
Expressive - ννμ μ΄λ€. λͺ
μΉμ΄λ μ΄λ¦μ λ³΄κ³ μ μΆκ° κ°λ₯νλ€. κ³ν(λ°©ν₯μ±)μ΄μ§ μ루μ
μ μ£Όλκ²μ μλλ€.
Object Creation Pattern
κ°μ²΄λ₯Ό μμ±ν λ μμ£Ό μ°μ΄λ ν¨ν΄μ λ§νλ€
Modules - κ°μ²΄, ν©μ³μ Έμ λκ°λ₯Ό μ΄λ£¨λκ±Έ λ§νλ€. μμκ±°λ ν°κ±°λ μν©μ λ°λΌμ λ€λ₯΄λ€.
var module = {
someProp: 'hello',
someMethod: function () {
console.log(this.someProp);
}
};
μ μ νμ§ μλ μ¬ν
var bankAccount = {
balance: 900,
deposit: function (amount) {
this.balance += amount;
},
withdraw: function (amount) {
this.balance -= amount;
}
};
bankAccount.deposit(1000);
bankAccount.withdraw(1000);
bankAccount.balance = 0; // ?!
Privacy Concerns - μ½λλ₯Ό μ¨κΈ°λ건 μ΄λ ΅λ€. κ·Έλμ μ κ·ΌνκΈ° μ΄λ ΅κ² λ§λ€μ΄μΌ νλ€.
μ΄λ κ² μ¦μμ€νν¨μ IIFEλ₯Ό μ¬μ©νλκ²μ μ¬μ¬μ©μ΄ μ΄λ ΅λ€.
var bankAccount = (function (){
var balance = 900;
return {
deposit: function (amount) {
balance += amount;
},
withdraw: function (amount) {
balance -= amount;
}
};
})();
var human1BankAccount = bankAccount();
human1BankAccount.deposit();
κΌ μ¨μΌνλ€λ©΄ λ€μμ€νμ΄μ€ λλ§μ 곡κ°μ λ«μ΄λλλ€. window.VANILLA_CODING = {} ν΄μ 곡κ°μ λ§λ λ€.
function bankAccount (){
var balance = 900;
return {
deposit: function (amount) {
balance += amount;
},
withdraw: function (amount) {
balance -= amount;
}
};
}
var human1BankAccount = bankAccount();
human1BankAccount.deposit();
ν©ν 리ν¨μλ₯Ό μ κ·Όλͺ»νκ² νκΈ°
(function bankApp () {
function bankAccount (){
var balance = 900;
return {
deposit: function (amount) {
balance += amount;
},
withdraw: function (amount) {
balance -= amount;
}
};
}
var human1BankAccount = bankAccount();
human1BankAccount.deposit();
})();
SingleTons
κ°μ²΄κ° νλλ§ λ§λ€μ΄ μ§λλ‘ νλ€. μ νμ κ±Έμ΄μ€λ€.
var userModule = (function () {
var users = [];
var userId = 0;
return {
create: (username, password) => {
var user = { id: userId, username, password };
users.push(user);
userId++;
return user;
},
get: (username) => {
var targetUser;
users.forEach((user) => {
if (user.username === username) {
targetUser = user;
}
});
return targetUser;
}
}
})();
var HTTPModule = (function () {
var instance = null;
return {
create: function () {
if (!instance) {
instance = {
get: url => {
return $.get(url);
},
post: (url, data) => {
return $.post(url, data);
}
};
return instance;
} else {
return instance;
}
}
}
})();
function fight() {
console.log('μΌμμμμ!!!');
}
/* Factory Pattern */
function MyenuriFactory (name) {
const m = {};
m.name = name;
m.from = 'poor family';
m.cry = function () {
console.log('μ¬μ‘ν¨λ―Έλ€..');
};
m.fight = fight; //μΈμ°λ κΈ°λ₯μ΄ μλ€.
return m;
}
function SyemooniFactory (level) {
const s = {};
s.level = level;
s.speak = function () {
console.log('μ κ±° μΉμ...');
};
s.fight = fight; // μΈμ°λ κΈ°λ₯μ΄ μλ€.
return s;
}
const kim = SyemooniFactory(999);
const yum = MyenuriFactory('yum');
Mixin - 곡μ νλ€. μ½λλ₯Ό μ¬νμ©νλ ν¨ν΄μ΄λ€. νμ₯μ ν΄μ£ΌκΈ°λ νλ€.
λ³νμμ΄ νμ₯ν΄μ€λ€.
var yum = MyenuriFactory('yum');
function fighterDNAMixin (goodPerson) {
goodPerson.fight = function (opponent) { // μ μ μ°μλ€. κ°μ²΄κ° λ€μ΄μ€λꡬλ.'γ
'
console.log(opponent.name + '.. μ κ±° μΉμ..');
};
}
fighterDNAMixin(yum);
publish - subscribe (κ³ λ¦΄λΌ μ
무μ λ€μ΄ μλ€.)