[인프런 워밍업 클럽 스터디 2기 - 백엔드 클린 코드] 1주차 발자국 회고
학습 내용
추상화
추상화 : 복잡한 정보들 속 중요한 정보만 추출하여 남기고, 나머지는 버림
좋은 추상화란? 1. 해당 도메인 영역 안에서, 2. 중요한 정보만을 표현했는가?
추상화를 잘 할 수록 읽기 좋은 코드가 만들어진다..
이름짓기
추상화의 대표적인 예시!
해당 변수나 메서드가 어떤 역할인지, 어떤 일을 하는지 단번에 알아챌 수 있어야 한다.
메서드에서의 추상화 : 한 메서드에서의 주제는 반드시 하나다.
잘못된 추상화는 한 메서드가 2가지 이상의 일을 하고 있을 것.
추상화 레벨 : 하나의 세계 안에서는, 추상화 레벨이 동등해야 한다.
// As-Is
// 너무 구체적인 내용을 if 안에 담지 않았는가?
public static void main(String[] args) {
showGameStartComments();
initializeGame();
showBoard();
...
if (gameStatus == 1) {
System.out.println("지뢰를 모두 찾았습니다. GAME CLEAR!");
break;
}
}
// To-Be
// 추상화 레벨을 비슷하게
public static void main(String[] args) {
showGameStartComments();
initializeGame();
showBoard();
...
if (doesUserWinTheGame()) {
System.out.println("지뢰를 모두 찾았습니다. GAME CLEAR!");
break;
}
}
인지적 경제성
최소한의 인지로 최대의 효율 얻기
Early return : 미리 return을 해버려 else의 사용을 최대한 줄이기
앞선 조건을 기억하지 않기 위함!
중첩 분기문, 중첩 반복문 : depth를 줄이기!
but, 무조건 1depth로 만드는 것이 아닌, 추상화를 통한 사고 과정의 depth를 줄이는 것이 중요!
사용할 변수는 가깝게 선언
공백라인도 의미를 가진다.
부정어구 사용 자제 : !isLeftDirection() 보다는 , isRightDirection() 으로
부정연산자는 가독성이 떨어진다.
예외처리 : 항상 NPE를 방지하는 방향으로 !! 예외가 발생할 가능성을 낮추기, Optional을 고려하기
객체 설계하기
새로운 객체 설계 시 1개의 관심사로 명확하게 책임이 정의되었는지 확인하기
getter / setter 사용 자제. update~ 같이 의도를 드러내는 네이밍 사용하기
SOLID 원칙
단일 책임 원칙 - 하나의 클래스는 하나의 변경 이유 (책임) 만을 가지도록
책임이라는 경계선이 사람마다 다르기 때문에, 책임을 볼 줄 아는 눈을 기르는 것이 중요하다
개방-폐쇄 원칙 - 확장에는 열려있고, 수정에는 닫혀있기.
시스템의 기능을 확장할 때, 최대한 기존 코드를 변경하지 않도록 설계하기
리스코프 치환 원칙 - 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 치환할 수 있어야 함
자식클래스가 부모클래스의 행동을 변경해서는 안된다.
인터페이스 분리 원칙 - 인터페이스를 잘게 쪼개서 자신이 사용하는 인터페이스에만 의존하도록
의존성 역전 원칙 - 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안됨
두 모듈 모두 추상화에 의존해야 함 -> 저수준 모듈의 변경이 고수준 모듈에게 영향을 끼치지 않도록
4L 회고
Liked
기능 구현에만 급급하던 지난 프로젝트와 달리, 클린코드란 개념에 대해 배울 수 있어서 좋았다.
특히, 인지적 경제성 파트에서의 Early return 과 부정어구 사용 파트에서 많은 깨달음을 얻었다.
내 코드를 돌아보며 이해가 안됐던 경험들을 개선시킬 수 있으리라 생각한다.
SOLID 같은 개념도 그동안 많이 들어와서 잘 알고 있다고 생각했던 개념들이었지만,
직접 코드를 수정해가면서 학습하니 기존 지식을 더 구체화할 수 있어서 정말 좋았다.
Lacked
Optional 을 그동안 너무 무의식적으로 사용했다.
그냥 NPE 예방에 효과적이라고 해서, 좋은게 좋은거지 라는 마인드로 사용했던 것 같다.
이번에도 예외처리 파트에서 Optional 에 대해 간략하게 배웠는데, 아직 제대로 사용하는 법을 모르겠다.
해당 내용에 대해 best practice 위주의 더욱 자세한 학습이 필요하다.
Learned
상단의 학습 내용
Longed for
학습 내용을 기록하고 해당 예시를 들 때, 단순 개념을 적는것보다는 코드로 보는게 더 수월할 듯 하다.
다음에는 회고록에 개념을 정리하면서, 관련 코드예시를 든다면 더 좋을 것 같다.
미션 회고
추상의 개념
코드 리팩토링
SOLID 개념
https://velog.io/@hong721816/%EC%9B%8C%EB%B0%8D%EC%97%85-%ED%81%B4%EB%9F%BD-2%EA%B8%B0-Day4-Mission
접근 방법은 해당 블로그에 정리해 두었다.
댓글을 작성해보세요.