책 [읽기좋은 코드가 좋은 코드다] 요약 및 서평입니다.
출처: https://www.theodysseyonline.com/10-lessons-winnie-the-pooh-can-teach-you-at-any-age
안녕하세요, 휴먼스케이프에 얼마 전 합류하게 된 신입 개발자 Tasha입니다.
예전부터 코드 가독성이 중요하다는 이야기를 듣고, 변수나 함수명을 지을 때 신중히 고민해보고 Eslint를 사용하는 등 나름대로 신경써왔다고 생각했는데 얼마 전 책 [읽기좋은 코드가 좋은 코드다]라는 책을 보고 더 넓고 세세한 범위의 코드 컨벤션에 대해 알아볼 수 있었습니다.
실제로 스스로의 코드에 적용시켜보면서 개선할 부분도 많이 느꼈고 이전보다 더 가독성부분이 개선되는 등의 도움을 받았습니다. 개인적으로 기억에 남았던 책 내용을 책에 있는 글 요약 + 예제코드와 함께 소개하겠습니다.
읽기좋은 코드가 좋은 코드다 — 더스틴 보즈웰, 트레버 파우커 지음 (출처: http://www.yes24.com/Product/Goods/6692314)
목적
이 책은 독자들의 코드를 더 좋은 코드로 만드는 데 도움을 주는 것이라고 합니다. 여기서 말하는 더 좋은 코드란 ‘이해하기 쉬운' 코드로, 다른 사람이 이해하는 데 들이는 시간을 최소화시키는 코드를 말합니다. 코드를 훑어보는 데 시간이 적게 들수록, 사람들은 코드를 더 쉽게 사용할 수 있습니다.
1. 좋은 이름, 좋은 설명 달기
매우 구체적인 단어를 선택하여 무의미한 단어를 피하라
데이터나 페이지를 가지고 올때 getData(), getPage() 등 ‘가지고 온다'의 의미를 담는 ‘get’을 이용하는 경우가 있습니다. 그러나 이는 로컬 캐시, 데이터베이스, 인터넷 중 어디에서 가지고 오는지 불명확한 경우가 있습니다. 이 경우에는 fetchData(), downloadPage() 등으로 좀 더 의미있는 표현으로 바꿔주면 좀 더 명확해집니다.
추상적인 이름보다 구체적인 이름을 선호하라
지금 소개해 드릴 것은 구글 코드베이스의 예제인데, 구글은 사악한 생성자가 만들어지는 것을 막는 매크로를 만들었고, 그 이름은 DISALLOW_EVIL_CONSTRUCTORS였습니다. 그러나 이 이름은 매크로가 금지하는 대상이 무엇인지 드러나지 않았고, opertor=()를 금지하는데 이는 사실 생성자가 아닐 뿐더러 ‘EVIL’이라는 단어가 논란의 여지가 있는 등의 문제가 있었습니다. 따라서 DISALLOW_COPY_AND_ASSIGN 으로 이름이 바뀌었습니다.
추가적인 정보(단위 및 추가 속성)를 이름에 추가하라
코드를 이해하거나 사용할 때 변수의 의미를 제대로 이해하지 않아 버그가 발생하는 경우가 있으므로, 이를 방지하기 위해 그 의미를 이름에 담는것이 좋습니다.
예) 단위를 포함하는 값들 delay => delay_secs size => size_mb limit => max_kbps angle => degrees_cw
예) 암호화 되어야할 패스워드 password => plaintext_password
예) 인코딩된 데이터 data => data_urlenc
코드를 짜면서 얻은 통찰이나, 코드의 결함, 개선아이디어는 주석으로
주석 역시 코드 가독성에 좋은 역할을 할 수 있는데 이 책에서는 어떤 내용을 주석으로 달면 좋을지 설명합니다. 나쁜 함수명을 주석으로 대체하거나, 설명을 위한 설명 등 무가치한 설명은 주석에 담지 말고, 아래와 같은 예를 주석으로 달 것을 권장합니다.
예 // 놀랍게도, 이 데이터에서 이진트리는 해시테이블보다 40% 정도 빠르다.
=> 이와 같은 코드를 짜면서 얻은 통찰에 대한 주석은 코드를 읽는사람이 코드를 최적화하느라 시간을 허비하지 않게 하도록 도와줄 수 있습니다.
예 // TODO: JPEG말고 다른 이미지 포맷도 처리할 수 있어야한다.
=> 코드의 내용을 훗날 수정해야한다는 생각이 들면, 이와같이 코드를 읽는 사람에게 코드의 질이나 상태, 추후 개선방법 등을 제시해주는 것이 좋습니다.
2. 루프와 논리를 단순화하기
코드 가독성 > 줄 수 최소화
짧고 이해가 쉬운 if-else문일 경우에는 삼항연산자를 이용하면 적은 코드로 더 잘 읽히게 만들 수 있습니다. 그러나 복잡한 표현인 경우에는 오히려 읽는 것을 더디게 할 수 있습니다. 그러므로 간결하고 줄 수를 최소화하게만 만드는 것 보다는 가독성에 도움이 되는 일인지 한번 더 생각하는 것이 좋습니다.
루프 내부에 있는 중첩 제거하기
코드의 중첩이 심할수록 이해가 어려우므로 최대한 중첩을 피하는 것이 좋습니다. 따라서 함수 문일 경우에는 중간에 return을 사용하여, 반복문일 경우에는 continue를 사용하여 중첩을 막는 것이 좋습니다.
논리를 명확하게 설명하기
위와 같이 if문 중첩의 경우 continue를 이용하는 방법 말고, 논리를 명확히 함으로써 중첩을 제거할 수 있는 방법이 있습니다. 다른 중첩에 된 예제를 먼저 살펴보겠습니다.
이 경우 논리를 말로 간단하게 정리해보는 것 부터 시작할 수 있습니다. 논리를 정리해보면, 사용자 허가가 되는 경우는 다음과 같습니다.
관리자일 경우
만약 문서가 있으면 현재문서를 소유하고 있는 경우
이렇게 정리한 논리에 따라서 구현하게 되면, 중첩이 풀어짐으로써 언제 허가가 되고 안되는지 더 명확하게 볼 수 있습니다. 위의 방법은 실제 코드에 쓰이지 않는 부분이 늘어난다는 점에서 호불호가 있을 수 있지만, 방법론에서 위와 같이 논리를 스스로 말로 풀어보는 연습은 좋다고 판단이 됩니다.
3. 코드를 함수 수준에서 재작성하기
상관없는 하위문제 추출하기
먼저 예제를 살펴봅시다.
이와 같이 코드의 상위 수준 목적은 주어진 점과 가장 가까운 장소를 찾는 것입니다. 그러나 루프 내부를 보면 대부분 주요 목적과 직접 상관없는 하위문제를 다룹니다.
따라서 ‘가까운 장소를 찾는 것’과 관련 없는 거리를 구하는 하위문제를 별도로 함수로 추출하였습니다. 이렇게 되면 원래의 코드는 다음과 같이 변하게 됩니다.
이렇게 관련없는 하위코드를 추출함으로써 얻을 수 있는 이점은 다음과 같습니다.
상위 수준의 목적에 집중이 가능하여, 코드 가독성이 높아진다.
분리한 하위문제의 독립적인 테스트도 용이하다.
하위 문제에 새로운 기능 추가가 용이하다.
재사용 가능
이렇게 가독성을 위해 함수를 분리함으로써 더불어 테스트, 재사용성, 코드 리팩토링에도 도움이 될 수 있습니다.
지금까지 책 ‘읽기좋은 코드가 좋은 코드다’에서 개인적으로 인상깊었던 코딩컨벤션을 8개정도로 추려서 소개를 해 보았습니다. 이 책을 개인적으로 독서모임에서 같이 토론하면서 다루었는데, 몇가지 방법론에 대해서는 반대 의견도 있었고 회사에서 하는 코드 컨벤션과 다르다는 이야기도 있었습니다. 이 책이 전적으로 옳은 것은 아니지만 그래도 시간이 될 때 코딩컨벤션에 대해서 알아보고 더 가독성 높은 코드에 대해 고민해보는 것은 개인적으로 의미있다고 판단이 됩니다.
책 전체에는 훨씬 더 많은 가이드와 예제들이 있고, 코딩컨벤션을 다룬 다양한 책도 많으니 궁금하신 분들은 살펴보시기를 추천드립니다. 감사합니다 :)
[출처]
책 : 읽기좋은 코드가 좋은 코드다(한빛미디어)- 더스틴 보즈웰, 트레버 파우커
“ The Art of Readable Code by Dustin Boswell and Trevor Foucher. Copyright 2012 Dustin Boswell and Trevor Foucher, 978–0–596–80229–5”
Get to know us better! Join our official channels below.
Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io