Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 정리
- 모두를위한딥러닝
- 백준
- 딥러닝
- 네트워크
- React Native
- 데이터베이스
- 깃 터미널 연동
- 모두의네트워크
- 팀플회고
- 깃허브 로그인
- 깃 연동
- 백준 4358번
- HTTP
- 리액트 네이티브
- 리액트 네이티브 프로젝트 생성
- 문자열
- 깃허브 토큰 인증
- 모두를 위한 딥러닝
- 모두의 네트워크
- 머신러닝
- 백준 4358 자바
- 데베
- 자바
- 지네릭스
- 스터디
- 백준 4949번
- 리액트 네이티브 시작하기
- SQL
- 백준 5525번
Archives
- Today
- Total
솜이의 데브로그
1-3장 ) 깨끗한 코드, 의미 있는 이름, 함수 본문
http://www.yes24.com/Product/Goods/11681152
책을 들어가기에 앞서, 내가 인상깊게 읽었던 부분은 이부분이다.
프로그램을 짜다 보면, 코드를 쓰는 시간보다 코드를 읽는 시간이 훨씬 더 많다
실제로 코드를 짜는것보다는, 타인이 만든 코드를 읽고 리뷰하고 유지보수를 하는 시간이 더 긴 경우가 많다.
그러므로 '클린코드'가 무엇인지, 보다 좋은 코드가 무엇인지 고민해보아야한다.
1. 깨끗한 코드
- 코드는 요구사항을 상세하게 표현하는 수단
- 자신이 짠 쓰레기 코드를 나중에 손보겠다고 생각한 경험 -> '르블랑의 법칙' : 나중은 결코 오지 않는다는 것을 기억하자
- 나쁜 코드는 개발 속도를 크게 떨어뜨린다.
- 깨끗한 코드를 만드는 노력은 비용을 절감하는 방법일 뿐만 아니라 전문가로서 살아남는 길이다.
- 깨끗한 코드를 작성하기 위해서는 절제와 규율이 필요하다.
깨끗한 코드란?
- 비야네 스트롭스트룹
- 우아하고 효율적인 코드
- 속도가 빠르며 cpu 등의 자원을 낭비하지 않는 코드
- 철저한 오류처리를하여 세세한 사항까지 꼼꼼하게 처리하는 코드
- 한가지에 '집중'하는 코드
- 그래디 부치
- 단순하고 직접적이어서, 가독성이 좋은 코드
- 명쾌한 추상화
- 데이브 토마스
- 다른 사람이 고치기 쉬운 코드
- 단위 테스트 케이스와 인수 테스트 케이스가 존재
- 마이클 페더스
- 주의 깊게 짠 코드
- 세세한 사항까지 꼼꼼하게 신경쓴 코드
- 론 제프리스
- 모든 테스트를 통과한다
- 중복이 없다
- 시스템 내 모든 설계 아이디어를 표현한다
- 클래스, 메서드, 함수 등을 최대한 줄인다
- 한가지 기능만 수행하라
- 작게 추상화하라
- 워드 커닝햄
- 짐작했던 기능을 각 루틴이 그대로 수행한다
☞ 체크아웃할 때보다 좀 더 깨끗한 코드를 체크인하자.
2. 의미 있는 이름
좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
우리는 변수, 함수, 인수와 클래스, 패키지 등등 많은 것에 이름을 붙인다. 이러한 이름을 잘 짓는 규칙들을 살펴보자.
의도를 분명히 밝혀라
- 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.
그릇된 정보를 피하라
- 그릇된 단서는 코드 의미를 흐린다.
- ex ) 여러 계정을 그룹으로 묶을 때, 실제 list가 아니라면 accountList라 명명하지 않는다.
- 서로 흡사한 이름을 사용하지 않도록 주의한다.
- 유사한 개념은 유사한 표기법을 사용한다.
- 일관성이 떨어지는 표기법은 그릇된 정보다.
의미있게 구분하라
- 컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하면 문제가 발생한다.
- 이름이 달라야 한다면 의미도 달라져야한다.
- 불용어를 추가한 이름 역시 아무런 정보를 제공하지 못한다. ex) ProductInfo 또는 ProductData
발음하기 쉬운 이름을 사용하라
검색하기 쉬운 이름을 사용하라
- 문자하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다는 문제점이 있다.
- 간단한 메서드에서 로컬 변수만 한 문자를 사용한다.
- 이름 길이는 범위 크기에 비례해야 한다.
- 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.
- 상수를 사용하는 이유도 검색이 쉽게 하기 위해서이다. (ex : MAX_CLASSES_PER_STUDENT 를 사용하는 것이 숫자를 사용하는것보다 훨씬 검색이 쉽다)
인코딩을 피하라
- 유형이나 범위 정보까지 인코딩에 넣으면 그만큼 이름을 해독하기 어려워진다.
- 자바는 변수 이름에 타입을 인코딩할 필요가 없다.
자신의 기억력을 자랑하지 마라
- 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야한다면 그 변수 이름은 바람직하지 못하다.
- 문자 하나만 사용하는 변수 이름은 좋지 않다. (루프에서 반복 횟수를 세는 변수 i, j, k는 괜찮다. 루프에서 반복 횟수 변수는 전통적으로 한 글자를 사용함)
- 명료함이 최고다.
클래스 이름
- 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
메서드 이름
- 메서드 이름은 동사나 동사구가 적합하다.
- 접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.
기발한 이름은 피하라
- 의도를 분명하고 솔직하게 표현하라.
한 개념에 한 단어를 사용하라
- 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
- ex) 똑같은 메서드는 fetch, retrieve, get 들 중 하나로 지정하여 일관성 있게 사용한다.
말장난을 하지 마라
- 한 단어를 두가지 목적으로 사용하지 마라.
- 다른 개념에 같은 단어를 사용한다면 그것은 말장난에 불과하다.
해법 영역에서 가져온 이름을 사용하라
- 기술 개념에는 기술 이름이 가장 적합한 선택이다.
문제 영역에서 가져온 이름을 사용하라
- 적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.
- 해법 영역과 문제 영역을 구분할 줄 알아야한다.
의미 있는 맥락을 추가하라
- 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
- 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.
불필요한 맥락을 없애라
- 일반적으로 의미가 분명한 경우에 한해서, 짧은 이름이 긴 이름보다 좋다.
- 따라서 이름에 불필요한 맥락을 추가하지 않도록 주의한다.
3. 함수
어떤 프로그램이든 가장 기본적인 단위는 함수이다.
- 함수를 만드는 첫째 규칙은 '작게' 만드는 것이다.
- 블록과 들여쓰기
- if문 / else문 / while 문 등에 들어가는 블록은 한 줄이어야 한다.
- 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
- 한가지만 해라
- 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다.
- 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
- 함수 당 추상화 수준은 하나로
- 함수가 확실히 '한 가지' 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
- 코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다.
- Switch 문
- 다형성을 이용해 각 switch 문을 저차원 클래스에 숨기고 반복하지 않을 수 있다.
- 서술적인 이름을 사용하라
- 함수가 하는 일을 좀 더 잘 표현하도록 이름을 짓는것이 좋다.
- 함수 이름을 정할 때는 여러 단어가 쉽게 읽히는 명명법을 사용한다.
- 이름을 붙일 때는 일관성이 있어야 한다. 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.
- 함수 인수
- 함수에서 이상적인 인수 개수는 0개(무항)이다.
- 함수에서 인수 1개를 넘기는 이유는 보통 인수에 질문은 던지는 경우, 인수로 뭔가를 변환해 결과를 반환하는 경우이다.
이벤트 함수는 입력 인수만 있다. 이벤트 함수는 이벤트라는 사실이 코드에 명확히 드러나야 한다. - 함수로 bool값을 넘기는 플래그 인수는 사용하지 말자.
- 인수가 2-3개 필요하다면 일부를 독자적인 클래스 변수로 선언할 가능성을 짚어보자. ex) 좌표를 point라는 클래스로 지정
- 단항 함수는 함수와 인수가 동사/명사 쌍을 이뤄야한다.
- 부수 효과를 일으키지 마라
- “부수 효과” 는 함수 내의 실행으로 인해 함수 외부가 영향을 받는 것을 의미한다.
- 일반적으로 출력 인수는 피해야 한다. 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 변경하는 방식을 택한다.
- 명령과 조회를 분리하라
- 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다.
- 객체 상태를 변경하거나 객체 정보를 반환하는 것 중 하나.
- 오류 코드보다 예외를 사용하라
- 명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.
- 오류코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 한다는 문제에 부딪힌다.
- 오류 코드 대신 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다.
- Try / Catch 블록을 별도 함수로 뽑아내는 편이 좋다. (try 아래에는 함수만 작성)
- 오류 처리도 '한 가지' 작업에 속한다. 그러므로 오류를 처리하는 함수는 오류만 처리해야한다.
- 반복하지 마라
- 구조적 프로그래밍
- 함수는 return 문이 하나여야 한다.
- 함수를 작게 만든다면 return, break, continue를 여러 차레 사용해도 괜찮다.
'책을 읽자 > Clean Code' 카테고리의 다른 글
11-13장 ) 시스템, 창발성, 동시성 (0) | 2022.04.17 |
---|---|
7-10장 ) 오류 처리, 경계, 단위 테스트, 클래스 (0) | 2022.04.10 |
4-6장 ) 주석, 형식 맞추기, 객체와 자료 구조 (0) | 2022.04.03 |