추상화 벽abstraction barrier은 세부 구현을 감춘 함수로 이루어진 계층이다. 추상화 벽에 있는 함수를 사용할 때는 구현을 전혀 몰라도 함수를 쓸 수 있다.
배열을 일일히 찾는 것은 비효율적이므로 자바스크립트 객체를 이용해 해시맵처럼 사용하도록 장바구니 데이터를 바꾸려 한다.
function remove_item_by_name(cart, name) {
var idx = indexOfItem(cart, name);
if(idx !== null)
return splice(cart, idx, 1);
return cart;
}
function indexOfItem(cart, name) {
for(var i = 0; i < cart.length; i++) { // <-- 비효율적
if(cart[i].name === name)
return i;
}
return null;
}
추상화 벽에 있는 모든 함수들을 고쳐야 한다.
function add_item(cart, item) {
return add_element_last(cart, item);
}
function calc_total(cart) {
var total = 0;
for(var i = 0; i < cart.length; i++) {
var item = cart[i];
total += item.price;
}
return total;
}
function setPriceByName(cart, name, price) {
var cartCopy = cart.slice();
for(var i = 0; i < cartCopy.length; i++) {
if (cartCopy[i].name === name)
cartCopy[i] = setPrice(cartCopy[i], price);
}
return cartCopy;
}
function remove_item_by_name(cart, name) {
var idx = indexOfItem(cart, name)
if (idx !== null)
return removeItems(cart, idx, 1);
return cart;
}
function indexOfItem(cart, name) {
for(var i = 0; i < cart.length; i++) {
if(cart[i].name === name)
return i;
}
return null;
}
function isInCart(cart, name) {
return indexOfItem(cart, name) !== null;
}
function add_item(cart, item) {
return objectSet(cart, item.name, item);
}
function calc_total(cart) {
var total = 0;
var names = Object.keys(cart);
for(var i = 0; i < names.length; i++) {
var item = cart[names[i]];
total += item.price;
}
return total;
}
function setPriceByName(cart, name, price) {
if (isInCart(cart, name)) {
var item = cart[name];
var copy = setPrice(item, price);
return objectSet(cart, name, copy);
} else {
var item = make_item(name, price);
return objectSet(cart, name, item)
}
}
function remove_item_by_name(cart, name) {
return objectDelete(cart, name);
}
function isInCart(cart, name) {
return cart.hasOwnProperty(name);
}