더스틴 보즈웰의 <읽기 좋은 코드가 좋은 코드다>라는 책을 읽고 인상 깊은 내용들을 위주로 정리해보고자 한다.
코드는 다른 사람이 그것을 이해하는 데 들이는 시간을 최소화하는 방식으로 작성되어야 함
이와 같은 것들은 바로 수정은 가능하지만, 코드 베이스에 큰 변화를 야기할 수 있다.
최근에 <Javascript로 작성된 legacy code를 Typescript로 개선>하는 작업을 진행한 적이 있는데, 해당 작업도 일종의 표면적 수준에서의 개선이라고 여길 수 있을 듯 하다.
하지만, 해당 작업을 하면서 느낀 점은... 간단한 작업들도 코드 베이스에 꽤나 큰 변화를 야기한다는 것이다.
예를 들면,
undefined
ornull
처리 되어있는 값들을 Type을 수정하며 불가피하게 수정해야하는 경우들이 존재한다. 이러한 경우들 모두, 기존 코드 베이스에 대한 완벽한 이해도 없이는 버그를 야기할 가능성들이 존재한다.그래서 표면적 수준에서의 개선을 할 때에도 스스로 조사를 하거나, 기존 코드에 대한 이해도가 있는 팀원들과의 소통을 통해서 완벽하게 코드에 대해서 이해를 한 후, 수정해야한다는 사실을 배웠다.
get
/ size
→ 정확히 의도한 정보를 전달하지 못함FetchPage
, DownloadPage
/ Height
, NumNodes
, MemoryBytes
tmp
temp
→ 임시 저장소 이외에 다른 의도가 없음을 전달 temp라는 이름은 대상이 짧게 존재 + 임시적 존재 자체가 중요한 용도일 경우에만 사용😈 :
Stirng tmp = user.name();
tmp += " " + user.phone_number();
tmp += " " + user.email()
template.set("user_info", tmp);
😇 :
if (right < left) {
tmp = right;
right = left;
left = temp;
}
루프 반복자
단순히 i, j, k를 사용하기보다
e.g.
😈 :
for (int i = 0; i < clubs.size(); i++){
for (int j = 0; j < clubs.size(); j++){
for (int k = 0; k < clubs.size(); k++){
if (clubs[i].members[k] == users[j]){
cout << .. << endl;
}
}
}
}
clubs[i].members[k] == users[j]
→ 버그는 코드를 따로 떼어놓고 보면 잘못된게 없어 보여서 찾기 힘들다
😇 :
clubs[ci].members[ui] == users[mi] // 처음 문자가 일치하지 않음
→ club_i
, members_i
, users_i
로 떼어놓고 생각하면 버그를 찾기 더 쉽다 !
보편적인 이름이 항상 나쁜 것은 아니지만, 이를 사용하려면 꼭 그렇게 해야하는 이유가 있어야함
SeverCanStart()
CanListenOnPort()
—- run locally
—- use_local_db
, --extra_loggin
변수 이름 == 작은 설명문
단위를 포함하기
e.g
hex_id
start_ms
다른 중요한 속성 포함하기
어떤 변수에 위험한 요소 혹은 나중에 놀랄만한 내용이 있다면 사용
e.g
패스워드가 ‘plaintext’에 담겨 있고, 추가적인 처릴 위해 반드시 암호화 되어야 함
😈 : password
😇 : plaintext_password
사용자에게 보여지는 설명문이 화면에 나타나기 전에 이스케이프 처리가 되어야 함
😈 : comment
😇 : unescaped_comment