[워밍업 클럽 스터디 2기 - 백엔드 클린 코드] 1주차 발자국
학습 내용
추상화
생략할 정보와 의미를 부여하고 드러낼 정보를 구분
잘 쓰여진 글이라면, 한 문단의 주제는 반드시 하나다.
잘 쓰여진 코드라면, 한 메소드의 주제는 반드시 하나다.
하나의 세계 안에서는, 추상화 레벨이 동등해야한다.
매직 넘버, 매직 스트링
의미를 가지고 있으나, 상수로 추출되지 않은 숫자, 문자열
상수 추출로 이름을 짓고 의미를 부여함으로 가독성과, 유지 보수성 상승
읽기 좋은 코드
코드를 읽을 때, 불필요한 정보를 기억하며 읽지 않아도 되는 코드
Early Return
조건이 되는 경우를 먼저 return 하여 이후 조건문을 더 간결하게 파악 가능
중첩문 줄이기
3중 for-loop보다 함수로 나누어 표현하는 것이 가독성이 좋아짐
무조건 메소드로 나누는 것이 가독성이 좋아지는 길은 아님
변수는 사용하는 위치에 가깝게
공백 라인을 사용하여 문맥을 나누어 주기
부정어(!)대신 메소드 자체가 부정어를 포함하여 작성
예외처리
의도한, 의도치 않은 예외를 구분
NullPointerException을 항상 방지
Optional
orElse와 orElseGet의 차이
orElse: 호출할 필요가 없는 경우에도 실행
orElseGet: null일 경우만 실행
객체 지향
캡슐화, 추상화,
상속,
다형성
관심사의 분리
높은 응집도, 낮은 결합도
객체의 책임
1객체는 1개의 관심사로 명확하게 정의가 되었는가
setter 사용 자제
getter는 필요한 경우에만
SOLID
SRP: 단일 책임 원칙 (Single responsibility principle)
한 클래스는 하나의 책임만 가져야 한다.
OCP: 개방-폐쇄 원칙 (Open/closed principle)
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
LSP: 리스코프 치환 원칙 (Liskov substitution principle)
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
ISP: 인터페이스 분리 원칙 (Interface segregation principle)
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
DIP: 의존관계 역전 원칙 (Dependency inversion principle)
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
개인적인 정리 (Day 4 Mission)
https://www.notion.so/hunyoon/Day-4-Mission-Readable-Code-114f5e6cf89780238071c834a0ce502a?pvs=4
상속과 조합
상속보다는 조합(인터패이스)를 사용하는 것이 유연한 대처가 가능
VO
기본 타입을 객체로 감싸 의미를 부여하여 추상화하는 기법
도메인의 어떤 개념을 추상화하여 표현한 값 객체
값으로 취급하기 위해, 불변셩, 동등성, 유효성 검증등을 보장해야 한다.
불변셩: final 필드, setter 금지
동등성: 서로 다른 인스턴스더라도, 내부의 값이 같으면 같은 객체로 취급 (equals(), hashCode() 재정의 필요) (≠ 동일성)
유효성 검증: 객체가 생성되는 시점에 값에 대한 유효성을 보장하기
VO vs Entity
Entity
식별자가 존재
식별자가 아닌 필드의 값이 달라도, 식별자가 같으면 같은 객체로 취급
VO
내부의 모든 값이 같아야 동등한 객체로 취급
개념적으로 모든 필드가 식별자 역할을 한다고 봐도 됨
회고
정말 오랜만에 스스로 앉아 일 이외의 코드를 만지는 시간이었다. 귀찮고 피곤하기만 해 멀리하기만 했던 공부지만 붙잡고 하다보니 흥미도 다시 생기고 더 잘 해내고 싶은 오기도 생기기도 했다. 연휴도 겹치고 회사 일도 있다보니 일정이 미뤄진게 많이 안타까웠다. 진도만 채우는 학습보다는 다시 곱씹어 보는 학습을 하고 싶어졌다.
미션을 진행하며 그동안 정말 애매했던 추상화를 다른 방식으로 풀어보게 되었는데 매번 일상에 적용되는 일을 적용시키니 더 의미가 와닿는 느낌이었다. 두번째 미션은 직접 코드를 리팩토링 해보는 것이 었는데 학습한 내용중 가장 먼저 떠오르는 작업부터 적용시킨 후, 내가 정리해둔 문서를 보며 더 진행하니 학습한 내용이 더 내것이 되는 느낌이었다. SOLID에 대해 "내 언어"로 표현하는 부분은 여러번의 말보다 한번의 예시가 나중의 나를 위해서라도 좋다고 생각하여 각 항목의 예시를 하나씩 작성하였고 주위 지인에게도 전달하였는데 호평을 받았다.ㅎ
이 글을 작성하면서도 아직 진도가 끝나지 않아 계속 듣고 있는데 매일 시간을 내서 공부를 하시는 분들 진짜 대단하신거같다
댓글을 작성해보세요.