Untitled

패턴 2: 추상화 벽

추상화 벽으로 구현을 감춥니다

추상화 벽abstraction barrier은 세부 구현을 감춘 함수로 이루어진 계층이다. 추상화 벽에 있는 함수를 사용할 때는 구현을 전혀 몰라도 함수를 쓸 수 있다.

Untitled

세부적인 것을 감추는 것은 대칭적입니다

장바구니 데이터 구조 바꾸기

배열을 일일히 찾는 것은 비효율적이므로 자바스크립트 객체를 이용해 해시맵처럼 사용하도록 장바구니 데이터를 바꾸려 한다.

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;
}

연습문제

Untitled

추상화 벽에 있는 모든 함수들을 고쳐야 한다.

Untitled

장바구니 객체로 만들기

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);
}