mingg IT

[함수형 프로그래밍] 8장 계층형 설계 1 본문

FrontEnd

[함수형 프로그래밍] 8장 계층형 설계 1

mingg123 2023. 10. 21. 23:27

8장 계층형 설계 1

  • 좋은 설계를 위한 감각을 키울 수 있도록 도와주는 장이다. 
  • 목적에 따라 분리한 계층형 설계에 대해서 설명하고, 어떤 식으로 계층을 분리해야하는지 알려준다.
  • 정말 이러한 패턴으로 설계를 했을 때 좋은 설계가 맞는지 의문도 들었다. 괜히 여러 계층이 생기면서 오버엔지니어링이 되는건 아닌가? 싶었다.
  • 현업시 간혹 어떤 파일에  해당 함수를 넣을지 고민한적이 많았는데 동일한 계층에 넣으면 되겠다 싶었다. 

 

 

계층형 설계

 

  • 소프트웨어를 계층으로 구성하는 기술 
  • 비즈니스 규칙, 장바구니를 위한 동작들, 카피-온-라이트, 배열 관련 기능 목적에 따라 계층으로 나눔 

 

계층형 설계 패턴

 

  • 직접 구현
    • 계층형 설계 구조를 만드는데 도움이 됨.
    • 함수 시그니처가 나타내고 있는 문제를 함수 본문에서 적절한 구체화 수준에서 해결해야함 
    • 만약 너무 구체적이라면 코드에서 나는 냄새임
  • 추상화 벽
    • 호출 그래프에 어떤 계층은 중요한 세부 구현을 감추고 인터페이스를 제공함
    • 인터페이스를 사용하여 코드를 만들면 높은 차원으로 생각이 가능함 
    • 고수준의 추상화 단계만 생각하면 되기 때문에 두뇌 용량의 한계를 극복 가능 
  • 작은 인터페이스
    • 시스템이 커질수록 비즈니스 개념을 나타내는 중요한 인터페이스는 작고 강력한 동작으로 구성하는 것이 좋음
    • 다른 동작도 직간접적으로 최소한의 인터페이스를 유지하면서 정의해야함 
  • 편리한 계층 
    • 개발자의 요구를 만족시키면서 비즈니스 문제를 잘 풀수 있어야함 
    • 계층을 추가하면 작업할 때 편리해야함 

 

패턴1: 직접 구현

 

  • 함수가 더 구체적인 내용을 다루지 않도록 함수를 일반적인 함수로 빼내는 것 
function freeTieClip(cart) {
	var hasTie = false;
	var hasTieClip = false;
	for (var i = 0; i < cart.length; i++) {
		var item = cart[i];
		if (item.name === 'tie') hasTie = true;
		if (item.name === 'tie clip') hasTieClip = true;
	}

	if (hasTie && !hasTieClip) {
		var tieClip = make_item('tie clip', 0);
		return add_item(cart, tieClip);
	}
	return cart;
}

  • 너무 구체적이기 때문에 직접 구현 패턴을 따르지 않고 있음. 
  • 장바구니가 배열이라는 사실을 알 필요가 없음 
  • array index, for loop는 언어 기능이고, make_item, add_item은 함수를 호출하기 때문에 서로 다른 계층임

 

개선 결과

function freeTieClip(cart) {
    var hasTie = isInCart(cart, 'tie');
    var hasTieClip = isInCart(cart, 'tie clip');
    if (hasTie && !hasTieClip) {
		var tieClip = make_item('tie clip', 0);
		return add_item(cart, tieClip);
	}
	return cart;
}

function isInCart(cart, name) {
	for (var i = 0; i < cart.length; i++) {
		if (cart[i].name === name) return true;
	}
	return false;
}

  • isInCart 함수를 만들어 공통으로 사용함 
  • freeTieClip 함수는 장바구니가 배열인지 몰라도됨 => 함수가 모두 비슷한 계층에 있다는 것을 의미함
  • 함수가 모두 비슷한 계층에 있다면 직접 구현했다고 할 수 있음

 

 

remove_item_by_name() 추가

  • removeItems 를 계층에 추가함 
  • 하위 계층이 같은 계층을 가르키고 있다면 같은 계층이라고 판단 가능함 
  • 직접 구현 패턴을 이용하면 모든 화살표가 같은 길이를 가져야하는데, 보면 2단계를 가르키는 경우와 1단계를 가르키는 경우 다르다

 

직접 구현 패턴 리뷰

 

  • 직접 구현한 코드는 한 단계의 구체화 수준에 관한 문제만 해결함
  • 계층형 설계는 특정 구체화 단계에 집중할 수 있게 도와줌
    • 구체화 수준에 집중하다보면 설계 감각을 키울 수 있음
  • 호출 그래프는 구체화 단계에 대한 풍부한 단서를 보여줌 
    • 함수가 서로 어캐 연결되어있는지 보여줌
  • 함수를 추출하면 더 일반적인 함수로 만들 수 있음 
  • 일반적인 함수가 많을수록 재사용하기 좋음 
    • 함수로 빼내면 재사용할 수 있는 곳이 보임. 중복 코드 찾기를 위해 함수를 빼내는 것과 다름
    • 구현을 명확하게 하기 위해 일반적인 함수를 빼내는 것임 
    • 일반적인 함수는 구체적인 함수보다 더 많은 곳에서 쓸 수 있음 
  • 복잡성을 감추지 않음 
    • 명확하지 않은 코드를 감추기 위해 도우미 함수를 만든는 것은 계층형 설계가 아님
    • 계층형 설계에서 모든 계층은 바로 아래 계층에 의존해야함
    • 복잡한 코드를 같은 계층으로 옮기면 안됨. 더 낮은 구체화 수준을 가진 일반적인 함수를 만들어 소프트웨어에 직접 구현 패턴을 적용해야함.

 

요약

 

  • 계층형 설계는 코드를 추상화 계층으로 구성함. 다른 계층에 구체적인 내용을 몰라도됨
  • 문제 해결을 위한 함수를 구현할 때 어떤 구체화 단계로 쓸지 결정하는 것이 중요함
  • 함수가 어떤 계층에 속할지 알려주는 요소는 많이 있음. (함수의 이름, 본문, 호출 그래프 등)
  • 함수의 본문을 보고 함수가 어떤 계층에 속해야 하는지 알 수 있음 
  • 함수를 호출하는 화살표가 다양한 길이를 가지고 있다면 직접 구현되어 있지 않다는 신호임 

 

Comments