프로그래밍 초식 : 나누기

Donghun Seol·2023년 4월 25일
0

프로그래밍 초식

목록 보기
2/13

레퍼런스

개발 초보가 중수가 되려면...?

구현 기술과 도구를 익혀야 함은 당연하고, 추가적인 역량이 필요함. 바로 나누기

초보가 작성한 코드의 특징

코드의 함수, 클래스, 메서드가 점점 커진다.
(내 이야기... 예전 프로젝트에서 어떤 클래스는 무려 600줄 짜리였다.)

큰 코드는 분석이 어렵다.(=== 수정 및 유지보수가 어렵다.)
변수의 의미가 중간에 바뀌기도 하며, DRY원칙을 위반하기 쉽다.

그래서 나누기가 필요함

의미 있는 단위로 코드를 나눌줄 알아야 중수가 될 수 있다.

전형적인 나누기 기법이 항상 들어왔던디자인 패턴이다.
예를 들어 MVC, DDD, 빌더, 어댑터, 컴포지트 등

나누기는 기능을 분해, 분리하는 것.

기능 분리 예시

구매취소 기능은 다음과 같이 분리 가능하다.

  1. DB에서 데이터 읽기
  2. 취소가능 여부 확인
  3. 주문데이터 변경
  4. DB에 쓰기
  5. 결과 통지하기

이렇게 분석한 하위 기능의 역할과 책임을 도출해서 클래스나 메서드로 적절히 분리한다.
적절히 분리되고 명명된 코드는 명령적이 아니라 선언적으로 읽을 수 있게 된다.

나누기의 기준?

정답은 없고 항상 고민해야할 문제
하지만 일반적으로 의미 있는 단위로 나누려고 시도해나가면 된다.
아래의 경우 전자를 기준으로 나누는게 적절함

  1. 취소사실 통지 vs PUSH 테이블에 INSERT
  2. 결제 승인 취소 vs PG사가 제공하는 API 실행

대칭성을 고려

하위기능을 분리할 때 주변 코드와 어색한 추상수준의 코드가 들어간다면 분리의 대상이 될 수 있다.

아래처럼 상호 추상수준이 다른 코드가 한 함수안에 나타난다면 분리하는 것이 바람직하다.

async createUser(name: string) {
    const user = this.userRepository.findOne({ where: { name } });
    if (user) return;
  
  	var sql = 'insert into user (name, age) values ("kim", 20)'; // Bad
	conn.query(sql,function(err,rows,fields){
    });
  
  	this.userRepository.save(new User(name, age)) // Good

    return;

나누기의 장점과 단점

나누기가 되어있지 않는 경우, 코드가 짧으면 순서대로 구현을 이해하기 쉬운 장점이 있다. 하지만 코드가 길어질수록 이해와 변경이 어려워진다.

나누기가 잘되면 상위수준에서 실행 흐름을 이해하기가 쉽고, 변경도 쉬워진다.
(다만, 너무 잘게 나뉜 코드는 도리어 이해와 변경을 어렵게 한다.)

적절히 변경하는게 중요하다.
(나의 경우엔 가능할때 까지 나누도록 노력할것)

연습하자

평소에 꾸준히 나누기 연습하자. 숙달되어야 실전에서 제대로 나눌 수 있다.
잘 나눌 수 있다는 것은 객체나 함수의 역할과 책임을 이해하고 분석할 수 있다는 뜻이다.

profile
I'm going from failure to failure without losing enthusiasm

1개의 댓글

comment-user-thumbnail
2023년 5월 13일

sample mocking comment for api test

답글 달기