Notice
Recent Posts
Recent Comments
Link
Today
Total
관리 메뉴

woodi

Clean Code - DRY 본문

Language

Clean Code - DRY

sungwoo jang 2022. 12. 5. 19:56

DRY(Don't Repeat Yourself) - 같은 일을 두 번 하지 말라

실용주의 프로그래머의 저자인 데이비드 토머스앤디 헌트가 부르는 원칙 중 가장 중요한 원칙이다.

켄트 벡은 Once, and only once 라고 부르기도 했다.

 

간단히 말해서 중복된 코드를 제거하라는 의미이다.

 

그렇다면 중복코드는 왜 좋지 않을까?

첫번째, 코드길이가 늘어난다.

두번째, 반복되는 내용에 대한 변경해야하는 코드가 많아진다.

 

중복코드를 제거하면 어떤점이 좋아질까?

첫번째, 가독성이 높아진다.

두번째, 중복코드를 제거하기위한 전략 중 하나인 추상화 수준을 높였을 때 구현이 빨라지고 오류가 적어진다.

 

그렇다면 어떻게 해결할 수 있을까?

대표적으로는 아래의 예시가 있다.

1. 같은 코드가 이곳 저곳 중복으로 사용되는 문제

2. 알고리즘이 유사하지만 코드가 서로 다른 중복

3. 데이터베이스의 스키마에서의 중복

 

또 다른 중복 제거 전략

AOP(Aspect Oriented Programming)

COP(Component Oriented Programming)

 

 

해결방법은 아래와 같다.

 

1. 같은 코드가 이곳 저곳 중복으로 사용되는 문제

    해결방안 - 추상화, 하위루틴이나 다른 클래스로 분리

2. 알고리즘이 유사하지만 코드가 서로 다른 중복

    해결방안 - Template method 패턴, Strategy 패턴

3. 데이터베이스의 스키마에서의 중복

    해결방안 - BCNF(Boyce-Codd Normal Form) 

 


 

그렇다면 예시를 통해서 좀 더 자세히 알아보자

 

 

아래는 이름을 출력하는 간단한 코드이다.

코드 예시 1)

아래는 이름을 출력하는 간단한 코드이다.

깨끗한 코드일까? 지저분한 코드일까?

func greetings(user:User){
   print("Hi $user.firstname $user.lastname ~");
}

func goodbye(user:User){
   print("See you next time $user.firstname $user.lastname ~"); 
}

만약 middlename을 추가하고자 한다면 어떠한 방법이 좋을까?

가장 간단한 방법으로는 아래와 같이 firstname과 lastname이 있는 모든곳에 middlename을 추가를 하는 방법이 있다.

사용하는코드가 적다면 크게 상관없겠지만 사용하는코드가 많아진다면 유지보수도 어렵고 번거로운 작업이 아닐수 없다.

func greetings(user:User){
   print("Hi $user.firstname $user.middlename $user.lastname ~");
}

func goodbye(user:User){
   print("See you next time $user.firstname $user.middlename $user.lastname ~"); 
}

greetings와 goodbye 함수 모두 middlename을 각각 변경해야하는 번거로움이 있다.

따라서 아래와 같은 방법으로 수정된다면 좀 더 깨끗한 코드가 될 수 있다.

해결방법

func greetings(user:User){
  print("Hi $user.fullName() ~");
}

func goodbye(user:User){
  print("See you next time $user.fullName() ~"); 
}
class User {
  func fullName():String{
    return "$user.firstname $user.middlename $user.lastname"
  }
}

위의 코드를 통해 중복코드를 방지하여 재사용과 유지보수하기 좋은 코드로 변경되었다.

 

 

코드 예시 2)

그렇다면 다음 코드는 지저분한 코드일까?

func validate(person:Person){
	if(!person.name){
    	throw new Error('Validation failed. The attribute name is missing.')
    }
   	if(!person.phoneNumber){
    	throw new Error('Validation failed. The attribute phoneNumber is missing.')
    }
   	if(!person.gender){
    	throw new Error('Validation failed. The attribute gender is missing.')
    }
}

답은 '아니다 이다.

코드 예시1과 비슷하게 중복으로 사용된 "Vaildation failed"라는 문자열이 포함되었지만

함수내에서만 중복으로 사용되고 다른곳에서는 중복으로 사용되고 있지 않기 때문에 지저분한 코드라고 볼 수는 없다.

DRY란 비즈니스 로직의 관점에서 중복으로 사용되었을때와 같이 좀 더 광범위한 관점에서 바라보았을때의 중복을 뜻한다.

 

 

 

반응형

'Language' 카테고리의 다른 글

Kotlin - 문(statement)과 식(experssion)의 구분  (0) 2023.05.09
왜 코틀린 인가?  (0) 2022.12.05