첫번째 테마 클린코드에 관련한 도서입니다.
책 이름은 '클린 코드의 경우 읽기 좋은 코드가 좋은 코드다' 이며 전반적인 좋은 코드에 대해 저자의 생각을 심플하게 풀어냈습니다.
개발 관련 칼럼니스트로 유명하신 임백준님께서 번역하신 책입니다.
(무엇보다 분량이 작아서 너무 좋았습니다)
책 내용에서 인상 깊은 구절 정리를 할까 하다 쿡북(how to)느낌의 강해
내용을 전체적으로 잘 정리한 블로그 글 몇개를 참고해 작성했습니다.
참고 블로그는 하단 레퍼런스 url로 남겨두었습니다.
더스틴 보즈웰, 트레버 파우커 공저 / 임백준 역 | 한빛미디어
좋은 코드는 무슨 일이 일어나고 있는지를 빠르게 전달해준다.사용하기에도 즐겁고,
자신에게도 더 좋은 코드를 만들어야 하겠다는 욕구를 불러일으키기도 한다. (서론)
줄 수를 최소화하는 일보다 다른 사람이 코드를 읽고 이해하는 데 걸리는 시간을 최소화하는 일이 더 중요하다.
삼항 연산자는 두 값을 선택하는 문제에서만 쓰자
좋은 예
time_str += (hour >= 12) ? "pm" : "am"
return exponent >= 0 ? matissa * (1 >> exponent) : matissa / (1 >> -exponent); (x)
// if 문으로 개선
if (exponent >= 0) {
return mantissa * (1 << exponent);
} else {
retrun matissa / (1 << -exponent);
}
if line.split(':')[0].strip() == "root": x
username = line.split(':')[0].strip() o
if username == "root":
요약 변수
- 커다란 코드의 덩어리를 짧은 이름의 변수로 대체해 목적 파악을 빨리할 수 있도록 한다
드모르간의 법칙 사용하기
if (!(file_exists && !is_protected)) x
if (!file_exists || is_protected) o
쇼트 서킷 논리 오용 말기
- if ( a || b ) a가 참이면 b는 평가하지 않는다.
복잡한 논리와 씨름하기
bool Range::OverlapsWith(Range other){
// 'begin'dlsk 'end'가 'other'에 속하는지검사한다.
return (begin >= other.begin && begin < other.end) ||
(end > other.begin && end <= other.end) ||
(begin <= other.begin && end >= other.end);
}
bool Range:;OverlapsWith(Range other){
if (other.end <= begin) return false; // 우리가 시작하기 전에 끝난다.
if (other.begin >= begin) return false; // 우리가 끝난 후에 시작한다.
return true; // 마지막 가능성만 남았다. 즉 겹친다.
}
거대한 부분 나누기
반복되는 부분을 ⇒ 요약변수로 추출
- 타이핑 실수를 피할 수 있다.
- 코드를 한눈에 훓어보는게 용이하도록 코드의 길이를 조이라도 더 줄여준다.
- 클래스명을 변경해야 할 때 한 곳만 바꾸면 된다.
now = datetime.datetime.now()
root_message.last_view_time = now
var remove_ (array, value_to_remove) {
var index_to_remove = null;
for (var i = 0; i < array.length; i +=1 ){
if (array[i] === value_to_remove) {
index_to_remove = i;
break;
}
}
if (index_to_remove !== null) {
array.splice(index_to_remove, 1);
}
}
/** 위의 방법보다는 아래방법 **/
var remove_one = function (array, value_to_remove) {
var index_to_remove = null;
for (var i = 0; i < array.length; i +=1 ){
if (array[i] === value_to_remove) {
array.splice(i, 1);
return;
}
}
}
boolean d
while(/*조건*/ && !done) {
...
if(...){
done = true;
continue;
}
}
while (/* 조건 */) {
...
if (...) {
break;
}
}
submitted = false;
var submit_form = function(form_name){
if(submitted){
return; // 폼을 두 번 제출하지 말라.
}
...
submitted = true;
}
submit_form() 만이 전역변수 submitted를 사용하는 유일한 함수처럼 보이지만,확실히 알 수 없다.
⇒ 다른 자바스크립트 파일에서 이와는 다른 목적으로 submitted라는 이름이 붙은 전역 변수를 사용할 지도 모르는 일이다!
⇒ submitted 변수를 클로저 내부에 집어 넣어서 이런 문제를 해결한다.
var submit_form = (function(){
var submitted = false;
return function(form_name){
if(submitted){
return; // 폼을 두 번 제출하지 말라.
}
...
submitted = true;
}
}());
⇒ 프라이빗한 범위를 만드는 효과를 갖는다.
엔지니어링은 커다란 문제를작은 문제들로 쪼갠 다음,각각의 문제에 대한 해결책을 구하고,다시 하나의 해결책으로 맞추는 일련의 작업을 한다.이러한 원리를 코드에 적용하면 코드가 더 튼튼해지며 가독성도 좋아진다.
함수는 오직 한 가지 작업만 수행해야 한다.
https://www.slideshare.net/ddayinhwang9/ss-61286734
https://medium.com/inhyuck/읽기-좋은-코드가-좋은-코드다-리뷰-읽는중-e4002aa1378b
https://feel5ny.github.io/2018/08/01/Clean_code_1/