발자국 1주차 [인프런 워밍업 클럽 2기 백엔드(클린코드/테스트)]
1주차 강의
섹션2-추상
✅
추상은 컴퓨터과학을 발전시킨 핵심적인 개념이다 내가 알아야 하는 것과 몰라도 되는 것을 구분하자
추상과 구체를 구분하자. 구체에서 의미 있는 특징을 뽑아 추상화하자
의미를 드러낼 수 있는 변수명, 메서드명을 사용하자
메서드마다 추상화 수준을 동일하게 유지하도록 노력하자
매직 넘버, 매직 스트링(상수) 를 사용해보자
섹션3-논리, 사고의 흐름
✅
사고의 깊이를 줄이고, 처리해야 할 정보를 줄이자 코드를 작성할 때에도 똑같다
Early return 을 통해 조건문에서 기억해야 할 정보량을 줄이자
반복문 등에서 indent 를 줄여보자
공백도 의미가 있다
이중 부정을 바꿀 수 있는 지 고민하자
사용자의 데이터는 불신하고 예외 처리를 하자
섹션4-객체 지향 패러다임
✅
책임과 관심사가 명확하게 구분된 객체들이 서로 소통하는 프로그램을 만들자
관심사를 분할하여 응집도를 높이고 높은 추상화 수준을 사용할 수 있다
객체를 존중하자
객체 지향 SOLID 5원칙 : SRP, OCP, LSP, ISP, DIP
Single Responsibility Principle(SRP) : 하나의 클래스는 하나의 책임을 가져야 한다
Open-Closed Principle(OCP) : 확장에는 열려 있고 변경에는 닫혀 있어야 한다
Liskov Substitution Principle(LSP) : 하위 타입으로 대체해도 문제 없어야 한다
Interface Segregation Principle(ISP) : 최소한의 인터페이스에 의존하자
Dependency Inversion Principle(DIP) : 구체보다는 추상에 의존하도록 설계하자
섹션5-객체 지향 적용하기
Value Object 까지 수강함
회고
강사님께서 레거시 코드를 리펙터링하는 식으로 수업이 진행되었다
수업 코드가 있는 레포지토리를 fork 해서 진행하는 만큼 강의 진도를 커밋해서 구분해두면
나중에 복습하기 좋을 것 같아 강의별로 한 내용을 커밋 메시지로 요약하고 푸쉬해두었다
각 수업마다 무엇을 했는지 알아보기도 쉽고 잔디도 쌓여서 뿌듯하다
그런데 약간 계획표 진도에 못 미치는 부분이 있으니 더욱 시간을 투자하려고 한다
1주차 미션
Day2 미션
"추상과 구체" 강의를 듣고, 생각나는 추상과 구체의 예시가 있다면 한번 3~5문장 정도로 적어봅시다. 일상 생활, 자연 현상, 혹은 알고 있는 개발 지식 등 어느 것이든 상관 없습니다. 추상에서 구체로, 또는 구체에서 추상으로 방향은 상관 없으나, 어떤 것이 추상이고 어떤 것이 구체 레벨인지 잘 드러나게 작성해 보아요 :)
나의 답변 : 운영 체제의 주요 기능 중 하나는 컴퓨터의 CPU , 메모리 입출력장치등의 하드웨어 기능을 추상화하여 사용자가 편하게 사용할 수 있도록 하는 것이다 예를 들어 하드 디스크에 데이터를 읽고 쓰는 데 필요한 기계적인 지식을 알 필요 없이 파일 시스템이라는 체계적이고 직관적인 개념을 통해 읽고 쓰는 개념을 추상화하여 하드웨어의 종류에 관계 없이 동일한 작업을 수행할 수 있다
추상이라는 것이 자바에서 인터페이스에만 사용하는 줄 알았는데 컴퓨터과학 전반에서 매우 중요한 개념이라는 걸 배웠다
그래서 컴퓨터과학에서 대표적인 추상을 이용한 사례로 운영체제에 대한 내용이 있길레 작성해보았다
추상에 대해 깊이 생각해볼 수 있어서 좋았다
Day4 미션
1. 아래 코드와 설명을 보고, [섹션 3. 논리, 사고의 흐름]에서 이야기하는 내용을 중심으로 읽기 좋은 코드로 리팩토링해 봅시다.
public boolean validateOrder(Order order) {
if (order.getItems().size() == 0) {
log.info("주문 항목이 없습니다.");
return false;
} else {
if (order.getTotalPrice() > 0) {
if (!order.hasCustomerInfo()) {
log.info("사용자 정보가 없습니다.");
return false;
} else {
return true;
}
} else if (!(order.getTotalPrice() > 0)) {
log.info("올바르지 않은 총 가격입니다.");
return false;
}
}
return true;
}
나의 답변 :
// 리펙터링 해본 코드
public boolean validateOrder(Order order){
if(isEmpty(order){
log.info("주문 항목이 없습니다.");
return false;
}
if(isInvalidTotalPrice(order){
log.info("올바르지 않은 총 가격입니다.");
return false;
}
if(isInvalidUser(order)){
log.info("사용자 정보가 없습니다.");
}
return true;
}
private boolean isEmpty(Order order){
return order.getItems().size() ==0;
}
private boolean isInvalidTotalPrice(Order order){
return order.getTotalPrice() < 0;
}
private boolean isInvalidUser(Order order){
return !order.getCusterInfo();
}
강의해서 메서드의 관심사를 분리하고 early-return 을 사용해 가독성을 높이고 정보량을 줄이는 방법 그리고
부정어를 대체하는 방법을 배웠다
코드가 딱 그런 내용을 리펙터링하는 것이라 생각해서 그에 맞게 고쳐보았다
다른분들 코드와 비슷한 것 같다
SOLID에 대하여 자기만의 언어로 정리해 봅시다.
나의 답변:
SRP : 단일 책임의 원칙 한 클래스는 하나의 책임만 가져야 한다 변경 사유가 여러 책임이 되어선 안된다
OCP: 개방 폐쇄 원칙 확장에는 열러 있지만 변경에는 닫혀 있어야 한다 클라이언트 코드가 변경에 영향받으면 안된다
LSP : 리스코프 치환 원칙 객체는 하위 타입의 인스턴스로 바꿀 수 있어야 한다 구현 차원에서의 문제 - 인터페이스 규약과 다르게 구현하면 객체를 신뢰할 수 없음
ISP: 인터페이스 분리 원칙 범용 인터페이스보다는 여러 개가 낫다
DIP: 의존관계 역전 원칙 구체에 의존하지 말자 추상에 의존해라
객체지향 프로그래밍 5원칙에 대해 생각해보는 미션이 나왔는데 평소에 내가 이해하고 있는 대로 내용을 적었다
길게 작성하신 분들도 계셨는데 나의 언어로 표현하면 이정도가 끝이라 공부가 더 필요할 것 같다
댓글을 작성해보세요.