# 클린 코드 - 코드 indent 줄이기(Guard Clausing, Polymorphism)

if-else 조건문을 많이 사용하게 되면 코드 라인이 길어지고 indent가 많아져 가독성이 떨어지는 문제가 발생합니다. 이때 Guard Clausing과 Polymorhism(다형성)을 사용하면 코드를 클린하게 짤 수 있습니다.

# Guard clause

일반적으로 if-else문이 중첩(nestsed)될수록 코드는 복잡해지고 보기 지저분해집니다.

#BAD
if :
	...
	if :
		...
		if :
			...
			while :
			...
...

nested 코드를 줄이고 가독성을 높이기 위해선, 코드 상단에 Fail이 되는 로직을 위로 넣어두는 것이 좋습니다.

  • as-is

    def say_hi_to_spring_user(developer):
        if developer.is_front_end:
            raise Exception("프론트 엔지니어입니다")
        elif developer.is_back_end:
            if not developer.use_java:
                raise Exception("자바를 사용하지 않습니다")
            else:
                if developer.use_spring:
                    print("안녕하세요!")
                else:
                    raise Exception("자바의 다른 프레임워크를 사용합니다")
        else:    
            raise Exception("who are you?")
    
  • to-be

    #Fail이 되는 부분을 상위로 올리면 코드를 더 쉽게 읽을 수 있습니다.
    def say_hi_to_spring_user(developer):
        if not developer.is_backend:
            raise Exception("백엔드 엔지니어가 아닙니다")
        
        if not developer.use_java:
            raise Exception("자바를 사용하지 않습니다")
    
        if not developer.use_spring:
            raise Exception("스프링을 사용하지 않습니다")
        
        print("안녕하세요!")
    

# Polymorphism(다형성)

객체 지향의 꽃이라고 불리는 다형성을 활용하여 if-condition을 줄일 수 있습니다.

  • as-is

    class Developer:
        def coding(self):
            print("코딩을 합니다")
    
    class Designer:
        def design(self):
            print("디자인을 합니다")
    
    class Analyst:
        def analyze(self):
            print("분석을 합니다")
    
    class Company:
        def __init__(self, employees):
            self.employees = employees
    
        def make_work(self):
            for employee in self.employees:
                if type(employee) == Developer:
                    employee.coding()
                elif type(employee) == Designer:
                    employee.design()
                elif type(employee) == Analyst:
                    employee.analyze()
    
  • to-be

    # Employee로 추상화해둡니다.
    class Employee(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def work(self):
            ...
    
    class Developer(Employee):
        def work(self):
            print("코딩을 합니다")
    
    class Designer(Employee):
        def work(self):
            print("디자인을 합니다")
    
    class Analyst(Employee):
        def work(self):
            print("분석을 합니다")
    
    class Company:
        def __init__(self, employees: List[Employee]):
            self.employees = employees
    
        # if문을 사용하지 않고 다형성을 통해서 이를 해결합니다.
        def make_work(self):
            for employee in self.employees:
                employee.work()
    
Last Updated: 2/20/2022, 1:51:31 PM

CC-BY-NC-ND-4.0 Licensed | Copyright © 2021-present Grab