![[인프런 워밍업 클럽] 스터디 3기_백엔드 클린 코드, 테스트 코드 1주차 발자국](https://cdn.inflearn.com/public/files/blogs/99166c1e-798d-4b5d-8d8e-542f33607c5d/R1280x0-2.png)
[인프런 워밍업 클럽] 스터디 3기_백엔드 클린 코드, 테스트 코드 1주차 발자국
공부내용
1. 우리가 클린코드를 추구하는 이유
가독성
이해가 잘 된다.
유지보수 하기가 수월하다.
우리의 시간과 자원이 절약된다.
2. 프로그램 이란?
프로그램 = 데이터 + 코드
3. 추상과 구체
중요한 정보는 가려내어 남기고, 덜 중요한 정보는 생략하여 버린다.
적절한 추상화 는 해당 도메인의 문맥 안에서, 정말 중요한 핵심 개념만 남겨서 표현하는 것
추상은 항상 구체적인 실재에서 시작해야 한다.
-Pablo Picasso
고수준 : 추상화 레벨이 높다 (자연어)
저수준 : 추상화 레벨이 낮다 (기계어)
4. 이름 짓기
: 가장 단순하면서도, 아주 중요한, 고도의 추상적 사고를 기반으로 한다.
표현하고자 하는 구체에서 정말 중요한 핵심 개념만을 추출하여 잘 드러내는 표현
우리 도메인의 문맥 안에서 이해되는 용어
작명 팁
단수와 복수를 구분하기
어미에 ‘-(e)s’ 를 붙여 어떤 데이터(변수, 클래스 등)가 단수인지, 복수인지 나타내는 것만으로도 읽는이에게 중요한 정보를 같이 전달할 수 있다.
이름 줄이지 않기ex) column → col, latitude → lat, longitude → lon
관용어처럼 많은 사람들이 자주 사용하는 줄임말 정도는 존재한다.
은어/방언 사용하지 않기
새로운 사람이 팀에 합류했을때, 용어를 단번에 이해할 수 있는가?
도메인 용어 사용하기
도메인 용어를 먼저 사전으로 정의하는 과정이 필요할 수 도 있다.
좋은 코드를 보고 습득하기ex) pool, candidate(당선, 후보), threshold(문지방, 한계점, 임계값)등
비슷한 상황에서 자주 사용하는 단어, 개념 습득하기
5. 메서드와 추상화
잘 쓰여진 코드라면, 한 메서드의 주제는 반드시 하나다. (0개도 2개도 아닌, 무조건 1개)
→ 여러개라고 느껴진다면 추상화가 제대로 되지않은것이니 분리해야한다.
6. 메서드 선언부
메서드 구성요소 : 반환타입 메서드명 (파라미터) {}
메서드 선언부 : 반환타입 메서드명 (파라미터) {}
메서드 구현부 : 반환타입 메서드명 (파라미터) {}
반환타입
메서드 시그니처에 납득이 가는, 적절한 타입의 반환값 돌려주기
→ 반환 타입이 boolean인데, 이게 이 메서드에서 무엇을 의미하는거지?
void 대신 충분히 반환할 만한 값이 있는지 고민해보기
→ 반환값이 있다면 테스트도 용이해진다.
메서드명
추상화된 구체를 유추할 수 있는, 적절한 의미가 담긴 이름
파라미터와 연결지어 더 풍부한 의미를 전달할 수도 있다.
파라미터
파라미터의 타입, 개수, 순서를 통해 의미를 전달
파라미터는 외부 세계와 소통하는 창
💡
메서드 생성 기능 (블럭 잡고 + ⌥ + ⌘ + M)
💡
inline 기능 (⌥ + ⌘ + N)
목적
불필요한 변수를 줄이고 싶을 때
메서드가 너무 작아서 굳이 따로 뺄 필요가 없을 때
리팩토링할 때 코드 단순화
방법
변수를 선언한 곳에 값 자체를 직접 넣음
메서드 호출을 해당 메서드의 코드로 직접 치환함
상수를 선언한 곳에 값을 직접 대입함 </aside>
inline 예제
before
int a = 10;
int b = a * 2;
System.out.println(b);
after
int b = 10 * 2;
**System.out.println(b);
=> 변수 a를 없애고, 직접 값(10)을 대입함**
7. 추상화 레벨
하나의 세계 안에서는 추상화 레벨이 동등해야 한다.
8. 매직넘버, 매직스트링 (옵션 + 커맨드 + C)
의미를 갖고 있으나, 상수로 추출되지 않은 숫자, 문자열 등
상수 추출로 이름을 짓고 의미를 부여함으로써 가독성, 유지보수성이 향상됨
추출 이후 클래스 하단에 모아짐
섹션3. 논리, 사고의 흐름
1. 뇌 메모리 적게 쓰기
<aside> 💡
“범주화”
정리 시스템에서 중요한 과제를 최소의 인지적 노력으로 최대의 정보를 제공하는 것이다.
-정리하는 뇌, 대니얼 J.레비틴-
</aside>
<aside> 💡
“집중력”
뇌는 한 번에 한 가지 일 밖에 하지 못한다. 멀티태스킹? 그건 저글링일 뿐.
-도둑맞은 집중력, 요한 하리-
</aside>
인지적 경제성
최소한의 인지로 최대의 효율을 내보자
뇌 메모리 적게 쓰기
다른 사람들이 우리가 작성한 코드를 읽을 때 뇌 메모리를 효과적으로 쓸 수 있도록 가독성을 높이는 것이 핵심이다.
2. Early return
메서드로 추출 (리턴하기위해)
if문을 쪼개서 elseif와 else의 사용을 지양
3. 사고의 depth 줄이기
중첩 분기문, 중첩 반복문
메서드 추출로 중첩 분기문, 반복문을 줄여서 사고를 쪼개서 해볼 수 있음
무조건 1 depth로 만들라는게 아님, 추상화를 통해 사고과정의 depth를 줄이는 것이 중요
사용할 변수는 가깝게 선언하기
4. 공백 라인을 대하는 자세
공백 라인도 의미를 가진다.
5. 부정어를 대하는 자세
부정어구를 쓰지않아도 되는 상황인지 체크
부정의 의미를 담은 다른 단어가 존재하는지 고민
부정연산자 보다는 isNotA와 같이 표현하는것이 가독성이 좋음
6. 해피 케이스와 예외 처리
해피케이스는 우리가 의도한대로 진행되는 상황을 말함
해피케이스의 예외 처리
예외가 발생할 가능성 낮추기
어떤 값의 검증이 필요한 부분은 주로 외부 세계와의 접점
의도한 예외와 예상치 못한 예외를 구분하기
Null을 대하는 자세
항상 NullPointException을 방지하는 방향으로 경각심 가지기
메서드 설계 시 return null을 자제
Optional에 관하여
Optional은 꼭 필요한 상황에서 반환타입에 사용한다.
Optional을 파라미터로 받지 않도록 한다.
Optional을 반환받았다면 최대한 빠르게 해소한다.
섹션 4. 객체 지향 패러다임
1. 단일 책임 원칙 (SRP, Single Responsibility Principle)
클래스는 하나의 역할만 담당해야 한다.
2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)
코드는 확장할 수 있어야 하고, 기존 코드 수정 없이 기능을 추가할 수 있어야 한다.
3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)
자식 클래스는 부모 클래스의 기능을 대체할 수 있어야 한다.
4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)
필요한 기능만 포함한 작은 인터페이스를 여러 개로 나누어야 한다.
5. 의존 역전 원칙 (DIP, Dependency Inversion Principle)
구현이 아닌 추상화에 의존해야 한다.
1주차 회고
그 유명한 클린코드를 개발 공부 시작할때 경험해보고 싶어서 신청함
Java 중급 문법 공부하고 있는 나에게도 '이렇게 생각할 수 있구나' 신선한 충격이었음
강의를 하나하나 들을때마다 묘하게 빠져들음
코드를 따라칠때는 메서드 추출이나 인라인처리 등의 단축키를 많이 사용하게 됨
매직넘버, 매직스트링이라는 개념을 알게됨
추상의 개념을 이해했다가 못했다가 계속 반복하면서 아직 자리잡지 못하고있음
근데 또 강의를 보면 오 .. 신기하다 하면서 보고 있음
=> 결론 : 어려우면서 재밌다 클린코드
댓글을 작성해보세요.