seunghyun Note

클린코드 챌린지 DAY3 (2024.06.25) 본문

스터디/클린코드 챌린지

클린코드 챌린지 DAY3 (2024.06.25)

승숭슝현 2024. 6. 25. 18:56

TIL (Today I Learned)

2024.06.23

✔️ range

3장. 함수

✔️ memory

  • 함수를 만드는 첫째 규칙은 '작게!'다. 함수를 만드는 둘째 규칙은 '더 작게!'다. -p42
  • 위에서 아래로 코드 읽기 : 내려가기 규칙 ... -p46
  • 길고 서술적인 이름이, 짧고 어려운 이름과 길고 서술적인 주석보다 좋다. -p53
  • 모든 시스템은 특정 응용 분야 시스템을 기술할 목적으로 프로그래머가 설계한 도메인 특화 언어로 만들어진다. -p62
  • 대가(master)프로그래머는 시스템을 (구현할) 프로그램이 아니라 (풀어갈) 이야기로 여긴다. 시스템에서 발생하는 모든 동작을 설명하는 함수 계층이 바로 그 언어에 속한다. 재귀라는 기교로 각 동작은 바로 그 도메인에 특화된 언어를 사용해 자신만의 이야기를 풀어간다. -p62

✔️ learn

swith 문

  • switch 문은 작게 만들기 어렵다. 또한 '한 가지' 작업만 하는 switch 문도 만들기 어렵다. 본질적으로 switch 문은 N가지를 처리한다.
  • switch 문을 저차원 클래스에 숨기고 절대로 반복하지 않는 방법 -> 다형성을 이용한다.
public Money calculatePay(Employee e)
        throws InvalidEmplᄋyeeType {
    switch (e.type) {
        case COMMISSIONED:
            return caleulateCommissionedPay(e);
        case HOURLY:
            return calculateHourlyPay(e);
        case SALARIED:
            return calculateSalariedPay(e);
        default:
            throw new InvalidEmployeeType(e.type);
    }
}

위 함수는 길고 한 가지 작업만 수행하고 있지 않다. 또한 SRP,OCP를 위반한다.

- 단일 책임 원칙 - SRP(Single Responsibility Principle) : 클래스를 변경하는 이유는 단 한 가지
- 개방 폐쇄 원칙 - OCP (Open Closed Principle) : 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계
 public abstract class Employee {
    public abstract boolean isPayday();
    public abstract Money calculatePay();
    public abstract void deliverPay(Money pay);
}

public interface EmployeeFactory {
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}

public class EmployeeFactorylmpl implements EmployeeFactory {
    public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
        switch (r.type) {
            case COMMISSIONED:
                return new CommissionedEmployee(r);
            case HOURLY:
                return new HourlyEmployee(r);
            case SALARIED:
                ret니rn new SalariedEmployee(r);
            default:
                throw new InvalidEmp 'LoyeeType! r.type);
        }
    }
}
  • 추상클래스 Employee 를 상속 받는 자식 클래스들은 각각 calculatePay, isPayday, deliverPay 메서드를 오버라이드
  • 직원 유형에 따라 객체를 만들어 반환하고 그 객체로 메서드를 실행

→ 메소드를 수정하지 않아도 되기 때문에 makeEmployee(EmployeeRecord r)를 똑같이 사용하면서 다양한 결과를 얻을 수 있음 (다형성)

 

명령과 조회를 분리

함수는 뭔가를 수행(명령)하거나 뭔가에 답(조회)하거나이다.

//나쁜 예
if (set("username", "myname"))
  ...

//좋은 예
if (attributeExists("username")) {
  setAttribute("username", "myname");
  ...
}

 

오류 코드보다 예외를 사용하라!

if (deletePage(page) == E_OK) {
    if (registry.deleteReference(page.name) == E_OK) {
        if (configKeys.deleteKey(page.name.makeKey()) == E_OK) {
            logger.log("page deleted");
        } else {
            logger.log("configKey not deleted");
        }
    } else {
        logger.log("deleteReference from registry failed"); 
    } 
} else {
    logger.log("delete failed"); return E_ERROR;
}

 

✔️ impression

 

이 챕터의 중요한 포인트는 시스템이라는 이야기를 풀어가는 데 있다.우리가 작성하는 함수가 분명하고 정확한 언어로 깔끔하게 같이 맞아 떨어져야 이야기를 풀어가기 쉬워진다는 사실.

728x90