
소프트웨어를 계층으로 분리하여 구성하는 기술
계층형 구조를 만드는데 도움이 되고, 적절한 구체화 수준으로 문제를 해결할 수 있다.
중요한 세부 구현은 보여주지 않고, 인터페이스를 먼저 제공한다. 인터페이스를 활용하면 더 높은 차원으로 생각할 수 이싿.
시스템이 커질 수록 중요한 인터페이스는 작고 강력한 동작으로 구성 되어야 한다.
잘 구성된 계층을 통해 소프트웨어를 더 빠르고 고품질로 재공하는데 도움을 주어야하며, 구성된 계층은 작업할 때 편리함을 주어야한다.
함수 줌 레벨을 활용하면 함수 하나가 가지고 있는 화살표를 비교할 수 있고, 이 길이를 비교해서 함수의 추상화 수준을 확인할 수 있다.
// 참조관계 정리하기
// before
function isInCart(cart, name) {
for ( var i = 0; i < cart.length; i++) {
if (cart[i].name === name)
return true;
}
return false;
}
function indexOfItem(cart, name){
for ( var i = 0; i < cart.length; i++) {
if (cart[i].name === name)
return true;
}
return null;
}
// after
function isInCart(cart, name) {
return indexOfItem(cart, name) !== null;
}
function indexOfItem(cart, name){
for ( var i = 0; i < cart.length; i++) {
if (cart[i].name === name)
return true;
}
return null;
}
// 함수, 반복문, 배열 인덱스 참조 관계 정리하기
// before
function setPriceByName(cart, name, price) {
var cartCopy = cart.slice();
for(var i = 0; i < cart.length; i++) {
if(cartCopy[i].name === name)
cartCopy[i] = setPrice(cartCopy[i], price);
}
return cartCopy;
}
function indexOfItem(cart, name) {
for(var i = 0; i < cart.length; i++) {
if (cart[i].name === name)
return i;
}
return null;
}
// after
function setPriceByName(cart, name, price) {
var cartCopy = cart.slice();
const productIndex = indexOfItem(cart, name);
if ( productIndex !== null)
cartCopy[productIndex] = setPrice(cartCopy[productIndex], price);
return cartCopy;
}
function indexOfItem(cart, name) {
for(var i = 0; i < cart.length; i++) {
if (cart[i].name === name)
return i;
}
return null;
}
// setPriceByName 리팩토링하기
// before
function setPriceByName(cart, name, price) {
var cartCopy = cart.slice();
var idx = indexOfItem(cart, name);
if (idx !== null)
cartCopy[idx] = setPrice(cartCopy[idx], price);
return cartCopy;
}
function arraySet(array, idx, value) {
var copy = array.slice();
copy[idx] = value;
return copy;
}
// after
function setPriceByName(cart, name, price) {
var idx = indexOfItem(cart, name);
if (idx !== null)
return arraySet(cart, idx, setPrice(cart[idx], price));
return cart;
}
function arraySet(array, idx, value) {
var copy = array.slice();
copy[idx] = value;
return copy;
}
직접 구현 패턴은