CS

클린코드와 리팩토링

김디니 2023. 1. 25. 10:25

클린코드와 리팩토링은 비슷한 의미를 가지고 있다.

이해하기 쉽도록 가독성이 높은 코드를 작성하고자 하는 행위들이다.

 

클린코드

가독성이 높은 코드

 

가독성이 높은 코드를 작성하기 위해서 지켜야할 규칙이 있다.

  • 네이밍
  • 오류 X
  • 중복 X
  • 의존성 최대한 없이
  • 클래스/메소드가 한가지 일만 처리해야 함

 

왜 클린하게 코드를 작성해야 할까?

  • 유지보수 향상
  • 빠른 개발
  • 품질 좋은 소프트웨어 보장
  • 기술부채 회피

*기술부채: 지저분한 방식으로 빠르게 개발할 시 추후 새롭게 기능을 개발할 때 더 많은 시간이 필요하다.

 

 

def AAA(a, b)
	...
    return a + b
def BBB(a, b)
	...
    return a - b

이 코드의 문제점은

 

1. 함수 네이밍

누가봐도 함수가 어떤 역할을 하는 함수인지 알 수 있어야 한다.

 

2. 함수와 함수 간격

여러 함수가 존재할 때 시작과 끝을 구분하기 위해 간격을 나눠 가독성을 높인다.

 

def sum(a, b)
	...
    return a + b
    
def sub(a, b)
	...
    return a - b

위 문제점을 반영하여 클린코드로 작성한다.

 

 

리팩토링

내부의 코드를 정리하면서 개선하는 것 (외부동작은 동일)
a.k.a 리모델링 작업

지저분한 코드로 인해 가독성이 떨어지는 코드를 개선하는 것이다.

 

지저분한 코드란?

  • 중복코드
  • 긴 메소드
  • 거대한 클래스
  • Switch문
  • 절차지향 코드

* 파이썬에는 Switch문이 존재하지 않는다.

* Switch문: 어떤 값을 가진 대상을 두고 조건값과 일치하는지를 확인하고 동작을 수행하는 방식

 

 

리팩토링은 성능을 최적화하는 것이 아니라,

코드를 신속하게 개발할 수 있도록 만들어주고, 코드 품질을 좋게 만들어 주는 것이다.

왜냐하면 코드가 이해하기 쉽고 수정하기 쉬우면 개발속도가 증가하기 때문이다.

 

 

언제 리팩토링이 필요할까?

새로운 기능을 추가할 때 사용한다.

 

 

리팩토링 과정

 

1. 테스트

def calculator(number1, number2, operator):
    if operator == '+':
        return number1 + number2
    elif operator == '-':
        return number1 - number2

assert calculator(3, 5, '+') == 8
assert calculator(10, 4, '-') == 6

해당 연산의 결과가 잘 나오면 그냥 넘어가고 아니면 오류를 일으켜 테스트를 하는 것이다.

여기서 기능을 추가하거나 코드를 수정할 때마다 assert를 돌려서 원래의 기능이 잘 수행되는지 보는 것이다.

 

 

가정 설정문 (assert)
assert는 뒤의 조건이 True가 아니면 AssertError를 발생한다.

왜 assert가 필요한 것일까?
성능을 높이기 위해 반드시 정수만을 입력받아 처리하도록 만들 수 있다.
이런 함수를 만들기 위해서는 반드시 함수에 정수만 들어오는지 확인할 필요가 있다

 

2. 함수 쪼개기

함수 쪼개기 원칙

  • 추상화 수준을 높여 같은 일을 하는 것을 추출한다.
  • 추출한 것들을 따로 함수로 만들어 함수를 최대한 작게 만든다.

 

3. 임시 변수 제거

임시 변수란 값이 한 번만 대입되고 변경되지 않는 변수이다.

 

def sum():
    previous = 10000
    current = previous
    ...

previous는 한 번만 사용되고 다시 사용되지 않는 임시 변수이다.

 

def sum():
	current = 10000
    ...

 

 

 

클린코드와 리팩토링의 차이

클린코드 

  • 가독성을 높이기 위한 작업에 비중이 높다
  • 설계부터 잘 이루어져 있는 것이 중요

 

리팩토링

  • 유지보수를 위한 코드 개선
  • 추후 요구사항 수정 및 추가 작업을 위해 개선해 나가는 것

 

'CS' 카테고리의 다른 글

정규화 Normalization  (0) 2023.02.02
13913. 숨바꼭질4 [BAEKJOON / Python]  (0) 2023.01.27
프로세스와 스레드 Process & Thread  (0) 2023.01.23
RDBMS와 NoSQL  (1) 2023.01.23
[네트워크] TCP/UDP 특징  (1) 2023.01.16