관리 메뉴

흰둥씨의 개발장

[함수형 코딩#8 ~ #9] 계층형 설계 본문

함수형 프로그래밍/쏙쏙 들어오는 함수형 코딩

[함수형 코딩#8 ~ #9] 계층형 설계

돈워리비해삐 2023. 7. 5. 02:29

계층형 설계 : 소프트웨어를 계층으로 구성하는 기술 => 추상화 

//계층형 설계                                          <계층 layer>

getsFreeShopping(); cartTax();                      //비즈니스 규칙 
                \    |
removeItem(); calcTotal(); addItem(); setPrice();   // 장바구니를 위한 동작들 
    |                      /            |
remove_items(); add_item();             |           //카피온 라이트
    |            /                      |
.slice();     --------------------------|           //언어를 지원하는 배열관련기능

 

계층형 설계감각을 키우기 위한 입력 단서 

함수본문 계층구조 함수시그니처
길이 화살표 길이 함수명 
복잡성 응집도 인자이름
구체화 단계 구체화 단계 인자값
함수 호출   리턴값
프로그래밍 언어의 기능 사용    

 

계층형 설계 감각을 키우기 위한 출력

조직화 구현 변경
새로운 함수를 어디에 둘지 구현 바꾸기 새 코드 작성할 곳 선택하기 
함수를 다른곳으로 이동 함수 추출하기 적절한 수준의 구체화 단계 결정하기
  데이터 구조 바꾸기   

 

계층형 설계 패턴

패턴 1 ) 직접 구현 
핵심은 추상화 레벨을 동일하게 설계해야 한다.

- 같은 계층에 있는 함수는 같은 목적을 가지도록 설계하자 

- 같은 계층에 있는 함수는 실질적인 기능이 동일하도록 설계하자

- 함수가 하는 일을 명확히 해서, 동작을 세분화 하자  
  (계층별로 함수를 정의할 때, 중복된 코드를 일반적인 함수로 빼서 재 사용하기)

- 호출하는 화살표가 같은 길이를 가지도록 설계하자
  (계층을 넘나들지 않도록, 같은 추상화 단계에서는 저수준의 로직은 고려x) 

- 줌레벨* 활용해서 계층형 설계의 문제점**을 찾기 
*줌레벨
 1. 전역 줌 레벨 (계층사이의 상호관계살펴보기) 
 2. 계층 줌 레벨 (특정 계층의 구현 살펴보기)
 3. 함수 줌 레벨 (특정 함수의 구현 살펴보기)

**계층형 설계의 문제점

1. 계층사이의 상호관계에서 발생
2. 특정 계층의 구현
3. 특정 함수의 구현 
패턴 2 ) 추상화 벽(abstraction barrier)
세부구현 내용까지 생각하지 않고도, 비즈니스 로직을 설계할 수 있도록! 

- 계층 사이 벽을 두고,
   벽 아래로는 동작에 대한 세부구현 함수를,
   벽위의 함수는 동작의 개념만을 가져가도록 설계

- 세부구현 로직을 신경쓰지 않고, 빠르게 설계 가능

- 쉽게 구현하기 위해, 가독성편하게, 다른 팀과 조율할 것을 줄이기 위해, 주어진 문제에 집중하기 위해 

- 코드 의존성 없앨 수 있음 (벽위에 있는 함수와 벽아래 있는 함수끼리)
 
패턴 3 ) 작은 인터페이스 (minimal interface)
새로운 코드(기능)를 추가할 때는 최대한 기존 함수를 활용할수 있는 방향으로 가자

- 위치를 잘 못 잡으면 불필요한 것들이 생길 수 있음

- 기존에 만들어둔 함수들을 잘 이용하는 것이 곧 작은 인터페이스를 실현하는 것

 
패턴 4 ) 편리한 계층(comfortable layer)
위 패턴 1~3까지는 모두 실용적이어야만 가치있다. 

- 언제나 패턴을 적용하는 것은 불가능함

- 비용과 효율사이에서 접점을 찾아보기(이미 편리한 코드를 고칠 필요는 없다)

- 코드가 지저분할 때는 패턴을 적용해보자 
 

 

기능적 요구사항 : 소프트웨어가 정확히 해야 하는 일  ex) 더하기 함수는 더하기를 잘해야 함 등등... 

비기능적 요구사항 : 기능적 요구사항 외의 요구사항 ex) 더하기함수 실행시 걸리는 시간, 보안, 등등...
ㄴ> 유지보수성 (maintainability) : 요구사항이 바뀌었을 때 쉽게 고칠 수 있는 코드는 어떤 코드인가? 
       => 최상위 모듈 , 최상위 함수는 호출되지 않아 고치기 쉬움 (즉, 바뀔 일이 많은 가장 높은 코드는 상위에 있을수록, 적을수록 좋음)
ㄴ> 테스트성 (testability) : 어떤 것을 테스트 하는 것이 가장 중요한가? 
       => 최하위 모듈, 최하위 함수를 테스트 하는 것이 좋음 (특히 상위와 많이 연결된 하위 함수를 많이 테스트하자)
ㄴ> 재사용성 (reusability) : 어떤 함수가 재사용하기 좋나? 
      => 낮은 수준 단계의 함수일수록 재사용성이 높다 (낮은 수준 단계로 함수를 빼낼 수록 재사용하기 좋아짐)