Print Friendly and PDF

프로그래밍 책/읽기 좋은 코드가 좋은 코드다 13

[읽코좋코] 변수제거와 중간 결과 삭제

이전 시간과 다르게 변수제거와 중간 결과 삭제에 대해 작성해보려 합니다. 이전 시간엔 설명변수username = line.split(':')[0].strip()요약변수final boolean user_owns_document = (request.user.id == document.owner_id);형태로 설명 변수와 요약변수를 사용하는 것에 대해 배웠습니다. 이번 시간엔 가독성에 도움이 되지 않는 불필요한 임시변수 제거에 대해 알아볼 것입니다.예를 들어now = datetime.detetime.now()는 불필요한 임시변수 입니다. 왜냐하면 복잡한 표현을 잘게 나누지 않았고 명확성에 크게 도움이 되지 않습니다.무엇보다 한 번만 사용되어 중복된 코드를 압축하지 않기 때문입니다. 무조건 적으로 임시변수를 만..

[읽코좋코] 설명/요약 변수

설명변수란?- 커다란 표현을 쪼개서 작은 단위표현으로 '추가변수'를 만드는데, 이 '추가변수'는 하위표현의 의미를 설명하므로 '설명변수'가 된다. 가령 if(line,split(':')[0].strip() == "root": ...위와 같은 코드를 username = line,split(':')[0].strip();if username == "root": ...처럼 "username"이라는 이름의 '추가변수'로 만들어 split하고 strip한 변수가 어떤 변수인지 '설명'이 가능하도록 만드는 것이다.*이렇게 하면 저 큰표현이 어떤 것인지 읽는 사람 입장에선 쉽게 이해가 된다. 요약변수란?- 의미를 쉽게 파악할 수 있어도, 새로운 변수에 담아 큰 코드의 덩어리의 코드를 더 쉽게 관리하고 파악하는데 목적을..

[읽코좋코] 조건문

삼항 연산자는 간단한 조건문에만C언어에서는 "조건문 ? true : false"로 사용이 가능하며 이것을 이용해 가독성을 높일수도 있습니다.하지만 꼭 그렇지만은 않습니다. 예를들어 int one = 1;int two = 2;int big_size = one > two ? one : two;- 이러한 삼항 연산자는 쉽게 이해가 가능합니다. one이 더 크면 one을 반환 two가 더 크면 two를 반환 반대로return exponent >= 0 ? matissa * (1 - 점점 값이 추가되고 조건문이 길어지다 보면 복잡해지기 시작합니다.- 한줄로 간단히 표현할 수 있는 곳에 쓰는 것이 좋습니다. 함수 중간 반환하기책에 따르면 어떤 프로그래머들은 함수에서 반환 되는 곳은 여러 곳에 하면 안된다고 얘기를 하..

[읽코좋코] 루프와 논리 단순화

if(length >= 10)orif(10 - 첫번째 if문과 두번째 if문중 어떤게 더 읽기 쉽다고 느껴지는가? 개인적으론 첫번째이며 책에서도 첫번 째라고 한다. while(bytes_received bytes_received)- 이 경우엔 어떤 while문이 읽기 편하다고 느껴지는가? 역시 동일하게 첫번 째라고 느껴진다 왜 if문과 while문 두개다 첫번째 코드가 더 잘 읽혀지는가?- 바로 왼쪽 = 유동적인 '질문을 받는'표현, 오른쪽 = 고정값으로 '비교 대상' 으로 많이 사용하기 때문이라고 한다.- 영어의 문법에서도 "당신은 적어도 1년에 10만 불을 번다면" 이라고 얘기하는 것이 자연스럽지 "만약 18년이 당신의 나이보다 작거나 같다면"이라고 하는 건 너무나도 부자연스럽다고 할 수 있다.- ..

[읽코좋코] 의도 명시, 파라미터 주석

//리스트를 역순으로 반복한다.for(list::reverse_iterator it = prodjcts.rbegin(); it != products.rend();++it) DisplayPrice(it->price);- 앞 시간에 얘기했듯 주석은 읽는 사람을 생각하며 작성하는 것이다. 해당 주석은 새로운 정보 없이 코드 수행 그대로 적어 놓은거라 좋은 주석이라고 할 수 없다고 한다. //각 가격을 높은 값에서 낮은 값 순으로 나타낸다.for(list::reverse_iterator it = prodjcts.rbegin(); it != products.rend();++it) DisplayPrice(it->price);- 이 주석이 첫번째 주석보다 좋은 이유는 책에서 설명하길 해당 코드엔 보이지 않지만 사실 ..

[읽코좋코] 주석의 문장을 명확하게

# 이 URL을 전에 이미 방문했는지에 따라서 다른 우선순위를 부여한다.- 이정도 문장은 나쁘지 않다 하지만 좀 더 좋은 문장으로 바꿔본다면 # 전에 방문하지 않은 URL에 높은 우선순위를 부여하라- 문장이 더 간단하고 짧고, 직접적이고 "URL에 높은 우선순위가 부여된다"는 사실까지 설명하여 더 좋은 문장이 되었다. //이 파일에 담긴 줄 수를 반환한다int CountLines(string filename){...}- 위 주석엔 '줄'이 어떤 것인지 명확하지 않다.- '\n'로 구분하는지, 빈파일은 줄이 0개인지, 'hello'는 줄이 1인지 0인지 등 명확하게 알수가 없다. //파일안에 새 줄을 나타내는 바이트('\n')가 몇 개 있는지 센다int CountLines(string filename){...

[읽코좋코] 간결한 주석

C++ 타입 정의에 대한 주석 예.//int는 CategoryType이다.//내부 페어의 첫 번째 float는 'score'다.//두 번째 'weight'다.typedef hash_map(int, pair>ScoreMap;- 3줄로 되어 있는 주석을 줄여보겠습니다. //CategoryType -> (score,weight)typedef hash_map(int, pair>ScoreMap;- 이렇게 한줄로 정리 가능 //Insert the data into the cache, but check if it's too big first.//데이터를 캐시에 넣어라. 하지만 그것이 너무 큰지 먼저 확인하라.- 책에서는 주석을 작성할때 모호한 표현을 피하라고 했다.- it's가 무엇인지 주석만으론 데이터인지 캐시인지..

[읽코좋코] 주석

주석의 목적은?- 코드를 읽는 사람이 코드를 작성한 사람만큼 이해를 돕기 위함이다. // 클래스 Account를 위한 정의class Account{ pubilc: //생성자 Account(); //profit에 새로운 값을 설정 void SetProfit(double profit); //이 어카운트의 profit을 반환 double GetProfit();}- 위 코드의 주석은 모두 가치가 없는 주석이다 - 새로운 정보가 전혀 없고 아무런 도움을 주지 못하기 때문이다. // 주어진 이름과 깊이를 이용해서 서브트리[h1]에 있는 노드를 찾는다.Node* FindNodeInSubtree(Node* subtree, string name, int depth);- 이 ..

[읽코좋코] 코드를 '문단'으로 쪼개라

일반 텍스트가 여러 개의 문단으로 나뉜데는 이유가 있다고 한다{1. 비슷한 생각을 하나로 묶어, 성격이 다른 생각과 구분2. 문단은 '시각적 디딤돌' 역할을 수행하며, 문단이 없으면 하나의 페이지 안에 읽던 부분을 놓치기 쉬움3. 하나의 문단에서 다른 문단으로 전진을 촉진}위와 같은 이유로 코드를 여러 '문단'으로 분할할 필요가 있다고 한다. 예시# 사용자 친구들의 이메일 주소를 읽어 들여 시스템에 존재하는 사용자와 매치시킨다.# 그 다음 해당 사용자와 이미 친구인 사람들의 리스트를 나타낸다.def suggest_new_friends(user, email_password): friends = user.friends() friend_emails = set(f.email for f in frine..

[읽코좋코] 선언문을 블록으로 구성하라

우리 뇌는 자연스럽게 그룹과 계층구조에 따라 동작하므로, 코드 또한 이러한 방식으로 구성하면 읽기 좋다고 한다. class FontendServer{ pubilc: FrontedServer(); void ViewProfile(HttpRequest* request); void OpenDatabase(string location, string user); void SaveProfile(HttpRequest* request); string ExtractQueryParam(HttpRequest* request, string html); void ReplyOk(HttpReques..