본문 바로가기

전공/그 외

[스터디 2일차]함수형 프로그래밍/ 좋은 코드란 / MVC 패턴이란

1. 함수형 프로그래밍                                                                            

1) 명령형 프로그래밍 (Imperative Programming)

설명 : 프로그래밍의 상태 & 상태를 변경하는 구문의 관점에서 설명하는 방식

특징 : 알고리즘을 명시하고, 목표는 명시하지 않음

예시 : 절차지향 프로그래밍(C,C++), 객체지향 프로그래밍(C++,Java)

 

2) 선언형 프로그래밍 (Declarative Programming)

설명 : 방법론 보다는 무엇을 해야하는지를 설명하는 방식

특징 : 알고리즘을 명시하지 않고, 목표만 명시 // 이론적 배경을 람다 계산식에 둠

예시 : 함수형 프로그래밍( Lisp, ML ), 반응형 프로그래밍

// 명령형
function add (arr) {
  let result = 0
  for (let i = 0; i < arr.length; i++){
    result += arr[i]
  }
  return result
}

// 선언형
function add (arr) {
  return arr.reduce((prev, current) => prev + current, 0)
}

 

3) 함수형 프로그래밍의 특징

- 불변성 : 데이터는 변경 불가능 (이러한 자료구조를 지원하는 언어:Java,Scala)

- 1급 객체(First Object)로서의 함수 : 1급 객체는 다음의 조건을 만족하는 객체

  * 변수나 데이터 구조 안에 담을 수 있다.

  * 파라미터로 전달할 수 있다.

  * 변환값으로 사용할 수 있다.

- 고차함수 : 람다 계산법에서 만들어진 용어로, 다음의 조건을 만족하는 함수

   * 함수에 함수를 파라미터로 전달

   * 함수의 변환값으로 함수를 사용 가능

- 순수 함수 : 순사 함수에는 숨겨진 input이나 output이 없는 함수

- 합성 함수 : 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하여 생성한 함수

 

4) 함수형 프로그래밍 예시

- map() 함수

 

5) 면접 대비 

Q1) 함수형 프로그래밍의 특징은 무엇인가?

-  변경 불가능한 객체라는 것입니다. 

두 번째는 1급 객체로서의 함수를 사용한다는 것입니다. 다른 말로, 함수를 파라미터로 전달하거나 함수의 반환 값으로 받아서 사용할 수 있습니다

 

Q2) 함수형 프로그래밍의 장점은 무엇인가?

-  side-effect에 의존한 객체지향 프로그래밍에 비해 유지 보수가 용이하고 코드를 이해하기 쉽다는 것이 장점입니다.

 

2. 좋은 코드란 무엇인가?                                                     

1) '좋은 코드의 조건'으로 들 수 있는 예시

  • 누구나 쉽게 따라가며 읽을 수 있을 것
  • 언제든 원하는 기능을 다시 찾아갈 수 있을 것
  • 5년 뒤에 내가 다시 보더라도 금세 이해할 수 있을 것
  • 새로운 기능을 추가하더라도 크게 구조변경이 없을 것

2) 코드의 가독성1 : 표현적 가독성

- 언어마다 정해진 네이밍이나 디자인 방식을 가질 것

- 함수는 단일 책임의 원칙(하나의 함수는 한 가지 책임을 갖는다.)를 기킬 것

- 클린 코드에선 20줄 미만의 함수를 권장

- 주석은 정말 필요한 부분에만 최소한으로 사용할 것 

 

3)  기능적 가독성

- 함수의 내려가기 규칙 : n단계의 추상 함수는 n-1단계의 추상적 함수로 구성된다.

- 의미있는 이름 가지기 

- 함수의 이름은 내려갈수록 구체적으로 짓기 

func Parse(filepath string) (Config, error) {
  switch fileExtension(filepath) {
    case "json":
    	return parseJSON(filepath)
    case "yaml":
    	return parseYAML(filepath)
    case "toml":
    	return parseTOML(filepath)
    default:
    	return Config{}, ErrUnknownFileExtension
  }
}

- 변수의 이름은 내려갈수록 추상적으로 짓기

 

3. MVC 패턴이란 무엇인가?                                                     

1) 탄생 배경

- 코드 내에서 서로의 역할을 분리하여 각자의 역할에 집중할 수 있게 개발한다면 유지 보수성, 애플리케이션의 확장성, 유연성 등의 장점을 살릴 수 있겠다고 판단하여 생겨난 것이 바로 MVC 패턴

 

2) 정의

- Model-View-Controller 의 약자로, 개발 과정에서 3가지 형태로 역할을 나누어 개발하는 방법론

 

3) MVC 패턴: Model

- 정의

  * 애플리케이션의 정보 및 데이터를 관리하는 역할 (DB, 변수, 상수)

  * '무엇'을 해야할지를 정하는 것 = Model을 설계하는 것

 

- 특징

  * 뷰나 컨트롤러에 대해서 어떤 정보도 알지 못함

  * 변경이 일어나면 변경 통지에 대한 처리 방법을 구현해야 함

 

4) MVC패턴 : View

- 정의 : 사용자 인터페이스 요소를 나타내는 것 (input 텍스트, 체크박스)

- 특징 

  *  모델이 가지고 있는 정보를 따로 저장해서는 안됨

  * 모델이나 컨트롤러에 대해서 어떤 정보도 알지 못함

 

5) MVC 패턴 : Controller

- 정의 : 데이터와 사용자 인터페이스 요소들을 연결하는 Bridge 역할

- 특징

  * 모델이나 뷰에 대해서 알고 있어야 함

  * 모델이나 뷰의 변경을 모니터링 해야 함( 모델이나 뷰의 변경 통지를 받으면 이를 해석해서 각각의 구성 요소에게 통지를 해야 함)

 

6) 장점과 한계

- 장점 

각 구성 요소를 분리함으로써 팀원이 각자 맡은 부분의 개발에만 따로 집중할 수 있게 만들어 개발의 효율성과 유저 보수성 및 확장성을 보장

 

- 한계 

Controller 하나에 많은 Model과 View가 복잡하게 연결되는 상황이 발생할 수 있음

MVC가 너무 복잡하고 비대해지면 새 기능을 추가할 때마다 코드분석 및 수정이 어려워짐