728x90
반응형
무엇이 코드를 '더 좋게' 만드는가?
=> 가독성
=> 다른 사람이 나의 코드를 보고 이해하는 시간이 짧아야 한다!
표면적 수준에서의 개선
이름에 정보 담기
1. 이름에 정보를 담아내라
구체적인 단어를 선택하여 무의미한 단어를 피하자.
단어
|
대안
|
Send
|
Deliver, Dispatch, Announce, Distribute, Route
|
Find
|
Search, Extract, Lovate, Recover
|
Start
|
Launch, Create, Begin, Open
|
Make
|
Create, Set Up, Build, Generate, Compose, Add, New
|
2. 보편적인 이름 피하기
루프 반복자(i, j, k)를 명확한 의미를 드러내는 이름을 사용하면 도움이 된다.
-> panels_i, infos_j, datas_k -> 실수로 INDEX 오류 날 일이 적어진다.
꼭 필요한 경우가 아닐 경우에는 tmp와 같은 보편적인 이름 쓰지 않기!
3. 추가적인 정보를 이름에 제공하기
- 단위를 포함하는 값들
- 중요한 속성을 포함하는 값들
4. 좁은 범위에서의 짧은 이름
금방 사라지는 함수의 변수, 많은 정보를 담지 않는 변수는 짧은 이름도 괜찮다. 사용 범위가 넓으면 긴 이름을 사용할 것.
5. 이름에서의 불필요한 단어 제거하기
ConvertToString() => ToString()
DoServerLoop => LoopServer()
사라져도 의미가 명확하게 전달되는 단어는 제거할 것.
오해할 수 없는 이름들
경계값을 포함하는 한계값 | min, max |
경계를 포함하는 범위 | first, last |
경계를 포함하는/배제하는 범위 | begin, end |
불리언 변수 이름 붙이기
is, has, can, should와 같은 단어들과 결합하여 오해하지 않을 bool 변수 만들기
사람들의 일반적인 생각에 유의
Get(), Size()와 같은 함수가 가벼운 메소드라고 기대할지도 모른다. 이런 일반적인 생각에 유의해 작업하자.
코드의 미학
일관성과 간결성을 위해서 줄바꿈을 재정렬하기
데이터 자체를 더 간결한 테이블 구조에서 설명하거나 줄바꿈을 통해 코드가 더 간결하게 보일 수 있게 한다.
메소드를 활용해 불규칙성을 정리하라
같은 내용은 메소드를 활용해 묶고 중복된 코드를 없애라. 새로운 테스트 추가가 쉬워질뿐더러 보기 쉬워진다.
열을 맞춰라
CheckFullName("" , "James", "" , "HI");
CheckFullName("James" , "James", "Hello,World!", "HI");
하지만, 이 부분은 반드시 할 필요는 없다.
의미 있는 순서를, 일관성 있게 사용하라
무엇을 나열할 때도 의미를 붙여서 순서대로 하고 그 순서를 일관되게 사용하라.
가장 중요한 것에서 가장 경미한 것
알파벳 순서
변수를 선언한 순서
의미를 붙여 만든 순서
선언문을 블록으로 구성하라
논리적 영역에 따라서 변수, 함수를 선언하라
큰 섹션 > 작은 섹션으로 구성하면 더 자세한 내용을 살펴볼 수 있다.
주석에 담아야 하는 대상
주석의 목적: 코드를 읽는 사람이 코드를 작성한 사람만큼 코드를 잘 이해하게 돕는 데 있다.
설명하지 말아야 하는 것
=> 함수의 선언과 주석이 실질적으로 일치하는 주석은 필요 없는 주석.
=> 나쁜 이름에 주석을 달기보다는, 차라리 고쳐라.
생각을 기록하라
-
함수에 대한 자신의 생각을 기록하라.
-
코드에 있는 결함을 설명하라.
표시
|
보통의 의미
|
TODO
|
아직 하지 않은 일
|
FIXME
|
오작동을 일으킨다고 알려진 코드
|
HACK
|
아름답지 않은 해결책
|
XXX
|
위험! 여기 큰 문제가 있다!
|
-
상수는 반드시 설명해줄 것.
역지사지하라
-
나올 것 같은 질문을 예측하자.
-
사람들이 쉽게 빠질 것 같은 함정을 주석으로 경고하자.
-
크게 보아라. 큰 그림을 설명하고 각 조각이 어떻게 맞추어지는지 설명할 것.
명확하고 간결한 주석 달기
주석은 간결하게.
모호한 대명사는 피하라. (그것, 저것)
함수의 동작을 아주 명확하게, 컴퓨터의 언어로 설명하라.
입/출력 예를 사용하는 것도 좋다.
코드의 의도를 명시하라. 기능이 아닌 의도가 중요.
함축적인 단어를 사용하라.
루프와 논리를 단순화하기
읽기 쉽게 흐름 제어 만들기
조건문에서 인수의 순서
왼쪽 | 값이 더 유동적인 '질문을 받는' 표현 |
오른쪽 | 더 고정적인 값으로 비교 대상으로 사용되는 표현 |
ex)
if(length > 10) // O
if(value != panels.Count) // O
if(10 == value) // X
if(nums.size() == value) // X
if/else 블록의 순서
-
부정이 아닌 긍정을 다루어라. if(!isStart)가 아닌 if(isStart)
-
간단한 것을 먼저 처리 => 동시에 같은 화면에 if와 else 구문을 나타낼 수 있다.
-
더 흥미롭고, 확실한 것을 먼저 다루어라.
삼항 연산자
줄 수를 최소화하는 일보다 이해의 시간을 최소화하는 것이 더 중요하다.
삼항 연산은 매우 간단한 일일 때만 사용할 것.
/ 삼항 연산자, do/while, goto는 되도록 사용하지 않는 것이 최선 /
변수와 가독성
변수 제거하기
필요 없는 임시 변수를 제거하자.
=> 불필요한 : (복잡한 표현을 잘게 나누지 않는, 명확성에 도움이 되지 않는, 한번만 사용되어 중복 코드가 없는)
중간 결과 삭제하기
함수 중간에 빨리 반환할 수 있다면 빨리 반환 => 코드를 줄일 수 있다.
각 변수의 범위를 최대한 작게 줄여라
각 변수의 위치를 옮겨서 변수가 나타나는 줄의 수를 최소화하자.
값이 한 번만 할당되는 변수를 선호하라.
cosnt, readonly의 변수는 이해하기 쉽다.
코드 재작성하기
상관없는 하위문제 추출하기
1. 주어진 함수나 코드 블록을 보고, 스스로에게 질문하라
"상위 수준에서 본 이 코드의 목적은 무엇인가?"
2. 코드의 모든 줄에 질문을 던져라.
"이 코드는 직접적인 목적을 위해서 존재하는가? 직접적인 목적을 위한 하위 문제를 해결하는가?"
3. 만약 하위 문제를 해결하는 코드의 분량이 많다면 추출해서 별도의 함수로 만들자.
4. 일반적인 목적을 가진 코드를 만들어라.
폭넓고 기본적인 일을 수행하는 함수들은 여러 프로젝트에서 사용할 수 있다.
별도의 라이브러리로 만드는 것도 좋은 방법.
One By One
함수는 하나의 일만 하도록 한다.
수행하는 작업을 모두 나열하고, 함수나 클래스로 분리하라. 논리적 문단을 나누어서 함수로 분리하라.
수행하는 모든 작은 일들을 빠뜨리지 않고 정확하게 서술하는 것이 중요하다.
코드 분량 줄이기
코드베이스를 작게 유지하라.
코드베이스가 많아질수록 연결하는 복잡성이 빠르게 성장한다. 프로젝트가 성장하더라도 코드 베이스를 최대한 간결하게 유지할 것.
일반적 유틸리티를 많이 생성하여 중복된 코드를 제거할 것.
사용하지 않는 코드 혹은 필요 없는 기능을 제거할 것.
프로젝트가 서로 분철된 하위 프로젝트로 구성되게 할 것.
코드베이스의 무게를 항상 의식하여 가볍고 날렵하게 유지시킬 것.
라이브러리를 이용하라.
일반적인 라이브러리는 견고하게 작성된 코드. 매일 표준 라이브러리를 훑어보자.
728x90
반응형
'성장을 위한 글 > 독서록' 카테고리의 다른 글
[독서록] 라프코스터의 재미이론 (1) | 2023.01.14 |
---|