seunghyun Note
클린코드 챌린지 DAY3 (2024.06.25) 본문
728x90
반응형

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
반응형
'스터디 > 클린코드 챌린지' 카테고리의 다른 글
클린코드 챌린지 DAY5 (2024.06.28) (0) | 2024.06.28 |
---|---|
클린코드 챌린지 DAY4 (2024.06.27) (0) | 2024.06.27 |
클린코드 챌린지 DAY2 (2024.06.23) (0) | 2024.06.23 |
클린코드 챌린지 DAY1 (2024.06.22) (0) | 2024.06.23 |
클린코드 챌린지 START (2024.06.21) (0) | 2024.06.21 |