2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
-
Upload
iamprogrammerofficial -
Category
Software
-
view
884 -
download
7
Transcript of 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
![Page 1: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/1.jpg)
염재현코드 가독성
![Page 2: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/2.jpg)
가독성
![Page 3: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/3.jpg)
![Page 4: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/4.jpg)
가독성 ? 왜 ?
프로그램은 자주 읽힌다 . 쓰는 것보다 읽는 것이 더 빈번하다 .
남들이 이해하기 쉬워야 한다 .
나만 보기 위한 코드도 언젠가 사용될 수 있다 .
... 잔소리 잔소리 ...
예 ... 예 ... 예 ...
![Page 5: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/5.jpg)
거기에 제 생각은요 ...
![Page 6: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/6.jpg)
이유 하나 . 프로페셔널리즘가독성 떨어지는 코드는 ...아마추어 같다 ... 정말로 ...초보자의 코드를 보세요 . 쉬운 코드인가 ?초보 운전이 어떤지도 생각해 봅시다 .
![Page 7: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/7.jpg)
이유 둘 . 큰 기쁨아름다운 코드는 큰 기쁨을 줍니다 .내 코드가 이렇게 아름다울 리가 없어 !예쁘게 나오니까 재미도 있네 !
![Page 8: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/8.jpg)
이유 셋 . 성장과 기회의 필수 조건코드가 읽기 쉬워야 남들이 ___( 을 / 를 ) 써 줍니다 .코드가 읽기 쉬워야 ___( 이 / 가 ) 개선점을 찾을 수 있습니다 .코드가 읽기 쉬워야 배울 수 있습니다 .
![Page 9: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/9.jpg)
가독성이 뛰어난 코드를 작성하면 ...
프로처럼 보이게 한다 . 아니 , 그게 프로다 .큰 기쁨을 준다 .성장할 수 있게 해 준다 .
![Page 10: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/10.jpg)
가독성을 버리면 ...
아마추어를 벗어나지 못한다 .코딩이 재미가 없어진다 . 이직하고 싶어진다 .성장 없이 정체된다 .
![Page 11: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/11.jpg)
가독성이 대세다프로그래밍 기법 발전은 복잡도를 줄이기 위한 것으로 모아짐 .제어 구조 , 서브루틴 , 클래스 , 패키지 , 구조화 , 객체지향 , 함수형 , 추상화 , 가비지 컬렉션 , 디자인 패턴 ...가독성 향상 역시 복잡도 ( 뇌의 로드 ) 를 줄입니다 .
![Page 12: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/12.jpg)
평생을 수련해야 하는 가독성
그렇기 때문에 우리는 평생을 걸쳐 가독성을 향상시키기 위한 수련에 수련을 거듭해야 하는 것입니다 .
![Page 13: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/13.jpg)
옳거니 !
![Page 14: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/14.jpg)
가독성 수련 시작
![Page 15: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/15.jpg)
목표 :코드를 읽는 사람이 코드를 이해하는데 드는 시간과 노력을 최소화
![Page 16: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/16.jpg)
눈에 보이는 것소중한 것들은 눈에 보이지 않는 것들이야- 어린 왕자
눈에 보이는 것도 소중하단다 .
- 염산악
![Page 17: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/17.jpg)
레이아웃 : 기본 중에 기본좋은 구현 , 충분한 주석에도 레이아웃이 엉망이면 이해 불가실수를 막기 위한 규칙들자동화된 도구로 강제 가능
![Page 18: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/18.jpg)
야심찬 도전과제오른쪽의 코드를 우리 한 번 열심히 잘 이해하도록 해 봅시다 .
하기 싫습니다 .
하지 맙시다 .
google.j.b=(!!location.hash&&!!location.hash.match('[#&]((q|fp)=|tbs=rimg|tbs=simg|tbs=sbi)'))||(google.j.qbp==1);(function(){google.c={c:{a:true,d:false,i:false,m:true,n:false}};google.sn='webhp';(function(){function f(a,b,c){g.push({o:a,v:b,w:c});a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)}function e(a,b,c){a.addEventListener?a.removeEventListener(b,c,!1):a.attachEvent&&a.detachEvent("on"+b,c)}var g=[];google.timers={};google.startTick=function(a,b){var c=b?google.timers[b].t.start:google.time();google.timers[a]={t:{start:c},e:{},it:{},m:{}};(c=window.performance)&&c.now&&(google.timers[a].wsrt=Math.floor(c.now()))};google.tick=function(a,b,c){google.timers[a]||google.startTick(a);c=c||google.time();b instanceof Array||(b=[b]);for(var d=0;d<b.length;++d)google.timers[a].t[b[d]]=c};google.c.e=function(a,b,c){google.timers[a].e[b]=c};google.bit=function(a,b){google.timers[a]||google.startTick(a);var c=google.timers[a].it[b];c||(c=google.timers[a].it[b]=[]);var d=c.push({s:google.time()})-1;return function(){c[d]&&(c[d].e=google.time())}};google.c.b=function(a){var b=google.timers.load.m;b[a]&&google.ml(Error("a"),!1,{m:a});b[a]=!0};google.c.u=function(a){var b=google.timers.load.m;if(b[a]){b[a]=!1;for(a in b)if(b[a])return;google.csiReport()}else google.ml(Error("b"),!1,{m:a})};google.rll=function(a,b,c){var d=function(b){c(b);e(a,"load",d);e(a,"error",d)};f(a,"load",d);b&&f(a,"error",d)};google.ull=function(){for(var a;a=g.shift();)e(a.o,a.v,a.w)};google.iTick=function(a){var b=google.time();google.tick("load","iml",b);a=a.id||a.src||a.name;google.tick("iml",a,b);google.c.c.a&&google.tick("aft",a,b)};google.afte=!0;google.aft=function(a){google.c.c.a&&google.afte&&google.tick("aft",a.id||a.src||a.name)};google.startTick("load");google.c.b("pr");google.c.b("xe")})();})();try{google['pt']=window['chrome']&&window['chrome']['csi']&&Math.floor(window['chrome']['csi']()['pageT']);}catch(e){}
![Page 19: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/19.jpg)
실수 방지빠르게 코드를 읽어봅시다 .
다시 찬찬히 봅시다 .
에너지가 더 소모됩니다 .
사실 Submit 은 한 번만 수행됩니다 .
에너지를 아낍시다 .
for (i = 0; i < size; ++i)if (a[i] > b[i]) {
a[i] = b[i];last = i;
}Submit(a);
return size;
![Page 20: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/20.jpg)
자동화된 도구가능하면 자동화된 도구로 최대한 간단한 포매팅 문제를 해결합시다 .
for (i = 0; i < size; ++i) {if (a[i] > b[i]) {
a[i] = b[i];last = i;
}}Submit(a);return size;
![Page 21: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/21.jpg)
레이아웃 : 합의가 필요들여쓰기 규칙줄을 나누는 규칙 , 블럭을 나누는 규칙순서 : #include, 입출력 변수 등
![Page 22: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/22.jpg)
덤 : 읽기 쉬운 조건문if (size < MAX_SIZE) { ... }
if (MAX_SIZE > size) { ... }
if (0 <= index && index < size) { ... }
if (index >= 0 && index < size) { ... }
![Page 23: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/23.jpg)
코딩 컨벤션유명한 코딩 컨벤션들을 답습하기언어에서 권장하는 컨벤션 익히기주변의 코드들과 일관성 유지하기 ( 개성을 죽이는 교육 )
![Page 24: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/24.jpg)
문단 나누기관련 있는 것들끼리 뭉치자 . 줄을 맞추자 .
=> 루틴이 하는 일을 하나로 하자 .
=> 클래스에 연관있는 메소드들만 있게 하고 더 가까이 관련 있는 것들끼리 묶자 .
=> 파일 이름 잘 짓고 끼리끼리 묶자 .
![Page 25: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/25.jpg)
클래스 /파일 / 패키지 이름클래스 , 파일 , 패키지 이름이 그냥 Util, utils.cc, helper.cc 같은 것이고 수많은 루틴들이 들어가 있지는 않는가 ? What about foobar, then?
의미 있는 것들끼리 모으고 묶고 이름을 짓자 . 이름이 지어지지 않으면 분리하자 .
이 클래스가 무엇을 하는지 , 너무 많은 것을 하지는 않는지 살피자 .
![Page 26: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/26.jpg)
시대와 환경의 변화에 따른 권장 사항의 변화강제적인 헝가리안 표기법
타입 검사가 잘 되지 않고 IDE 지원이 열악하던 시절 좋은 표기법이었음 .
하나의 종료점수동으로 메모리 할당과 해제를 하던 시절에는 유용한 규칙이었음 .
GOTO exit;
스코프 등을 이용한 자원 획득 / 해제 (RAII), with 등으로 제약 , try-finally 로 해제 코드를 넣을 수 있고 , 가비지 컬렉션이 지원되는 경우가 많은 요즘 상황에서는 유용성이 떨어짐 .
![Page 27: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/27.jpg)
Self Documenting
말하지 않아도 알아요 . 그냥 바라보면- 모 마쉬멜로와 초콜릿 간식
적당히 눈치를 줘야 알아준다 .
- 염산악
![Page 28: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/28.jpg)
코드가 말한다아마추어의 코드에는 지나치게 주석이 많음 .
줄 단위의 주석 ... 주석을 상세히 쓰라니 배운대로 열심히 i 에 0 을 넣는다고 주석 씀 .
상세한 주석에도 불구하고 읽기는 매우 어려움 .
읽어도 의도를 알기 어려움 . (e.g. // Skip first row)
// Remove first 6 charactersquery = request[6:]
프로의 코드에는 주석이 적당함 .
문서화에 필요한 주석이 대부분 . 변수나 함수 이름이 스스로 설명함 .
주석이 거의 없지만 읽기는 매우 쉬움 .
코드로 알기 어려운 의도 등을 주석으로 밝힘 . (e.g. // Skip header row)
const string pathPrefix = "/api/?";query = request[len(pathPrefix):]
![Page 29: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/29.jpg)
함축과 압운 : 언어 영역을 배운 이유이름에 정보를 최대한 많이 넣어야 하지만 특히 긴 이름 사용이 반복되면 짜증난다 .
따라서 함축이 필요하다 !
압운은 두운 , 요운 , 각운으로 나뉜다 . 요 ~ 롸임 있는 코드 .
max, min, num, cnt, hex, unsafe, enc, has, is, ...
![Page 30: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/30.jpg)
함수 이름서브루틴은 호출하고 반환받을 수 있는 코드의 덩어리에 이름을 붙인 것 .
이 이름을 잘 붙이는 것으로 독자들이 그 코드가 무엇을 하는지 더 잘 알 수 있다 .
언어 영역 /외국어 영역에서 배운 포괄하는 제목 짓기를 생각하자 .
![Page 31: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/31.jpg)
함축프로그래머는 국어 실력도 좋아야 한다 .
GetResults(); // 결과들을 리턴한다 .
![Page 32: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/32.jpg)
함축프로그래머는 국어 실력도 좋아야 한다 . ( 아니 , 영어 ...?)
GetResults()? FetchResults()? ExtractResults()? GenerateResults()? ComputeResults()?
![Page 33: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/33.jpg)
함축아 , 파라미터가 있었다 ..
GetResults({"min_score": 2.5}); // score 가 2.5 점 이상인 결과들을 리턴한다 .
=> LoopOverResultsAndReturnOnlyThoseWithScoreHigherThan(2.5);
??? ??? 중산정왕의 N 대손이자 황숙이자 예주목이고 좌장군인 유비그래서 한마디로 그것이 무엇이옵니까 ?
![Page 34: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/34.jpg)
함축GetResults({"min_score": 2.5}); // score 가 2.5 점 이상인 결과들을 리턴한다 .
FilterResults({"min_score": 2.5}); // 2.5 점 이상의 결과만 필터한다 .
![Page 35: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/35.jpg)
함축GetResults({"min_score": 2.5}); // score 가 2.5 점 이상인 결과들을 리턴한다 .
FilterResults({"min_score": 2.5})? // 2.5 점인 이상은 버리나요 ? 이하를 버리나요 ?
![Page 36: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/36.jpg)
함축GetResults({"min_score": 2.5}); // score 가 2.5 점 이상인 결과들을 리턴한다 .
FilterResults({"min_score": 2.5}); // 2.5 점 이상의 결과만 버리나 ? 취하나 ?
SelectResults({"min_score": 2.5});
ExcludeResults({"min_score": 2.5});
![Page 37: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/37.jpg)
압운매개변수 이름을 잘 짓자 . @Nullable 같은 것이 지원되지 않으면 OrNull, NotNull을 변수 이름이나 함수 이름에 붙이면 더 읽기 쉬워지는지 살펴보자 .
문자열은 경우에 OrEmpty 같은 것이 붙으면 더 읽기 쉬워지는지 살펴보자 .
시간에 단위 _sec, _ms, _us, _ns 같은 것이 붙으면 더 읽기 쉬워지는지 보자 .
폰트 크기가 font_size 인 것보다 _pt, _px 가 붙으면 도움이 되는지 보자 .
font_size_px = PointToPixel(font_size_pt);
![Page 38: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/38.jpg)
변수 이름을 지어주세요// If needs recalculation
if (xxx && yyy && zzz) {
... code ...
}
bool needs_recalc = xxx && yyy && zzz;
if (needs_recalc) {
... code ...
}
![Page 39: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/39.jpg)
과정 설명여러 스텝으로 나눌 수 있는 함수이미 이 정도라도 나눠진 코드를 기반으로 작업할 수 있는 것을 감사하게 생각하자 .
// Step 1. Read input.... code ..
// Step 2. Generate results.... code ...... code ...
// Step 3. Update results.... code ...... code ...
// Step 4. Write output.... code ...
![Page 40: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/40.jpg)
함수 이름으로이름이 곧 어떤 순서로 무엇을 하는지 설명한다 .
ReadInput();GenerateResults();UpdateResults();WriteOutput();
![Page 41: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/41.jpg)
이미 좋지 않았나요 ?
=> 협업으로 변화되는 코드의 미래를 봅시다 .
왜 굳이 ?
![Page 42: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/42.jpg)
흐름의 단순화들어올 땐 마음대로지만 나갈 땐 아니란다 ~
- ???
마음대로 들어오시면 곤란합니다 . 그리고 볼 일 다 보셨으면 어서 나가주시죠 .
- 염산악
![Page 43: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/43.jpg)
일찍 리턴하기 패턴무엇을 리턴해야 할 지 아는 순간 바로 리턴해 버림 . (multiple exit, return early)
중요한 코드 부분의 양이 줄어들고 예외 상황이 줄어들어 흐름이 단순해 짐 .
기억해야 할 변수도 줄어들게 되어 뇌의 부담을 줄여줌 .
![Page 44: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/44.jpg)
루프에서 일찍 리턴하기흐름이 단순해지고 리턴 값이 분명해진다 .
![Page 45: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/45.jpg)
One Exit Result* result = nullptr;for (int i = 0; i < n; ++i) { Message msg = getMessage(); if (!msg.empty()) { ... actual code ... result = msg.AsResult(); break; }}return result;
![Page 46: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/46.jpg)
Return Earlyfor (int i = 0; i < n; ++i) { Message msg = getMessage(); if (!msg.empty()) { ... actual code ... return msg.AsResult(); }}return nullptr;
![Page 47: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/47.jpg)
루프와 함수 분리기억해야 할 변수도 줄어든다 .
루프가 무엇을 하는지가 분명해진다 . ( 함수 이름을 잘 지으면 ...)
![Page 48: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/48.jpg)
루프와 함수 분리루프와 상태 변수를 이용해야 하는 경우가 있다면 함수를 분리하면 더 읽기 쉬워지는지 살펴보자 .
이번에도 이미 이런 코드를 갖고 작업할 수 있음을 감사하게 생각하자 .
bool found = false;for (const auto& item : items) { if (...) { found = true; break; }}if (found) { ...}
![Page 49: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/49.jpg)
루프와 함수 분리return 을 이용하면 코드가 간단함 .
물론 functional 한 함수들을 이용하는 방법도 있겠음 .
bool ContainsItem(...) { for (const auto& item : items) { if (...) { return true; } } return false;}
if (ContainsItem(...)) { ...}
![Page 50: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/50.jpg)
GOTO와 break label 이 사용되는 경우여러 루프를 빠져나와야 하는 경우 break label 을 쓰거나 조건 변수를 써야 하는 경우함수를 분리하면 (혹은 클로저를 쓰면 ) 더 읽기 쉬워지는지 살펴보자 .
return 은 함수 안에 있는 모든 루프를 한 번에 빠져나오므로 ...
![Page 51: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/51.jpg)
루프와 함수 분리goto 를 쓰거나 break label 을 써야 한다 .
코드가 길어지면 흐름이 더욱 복잡해진다 .
bool found = false;for (const auto& item : items) { for (const auto& attr: item.attrs()) { if (...) { found = true; ... (1) code ... goto outer; // break outer; } }}outer:if (found) { ... (1) code ...}... (2) more code ...
![Page 52: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/52.jpg)
루프와 함수 분리return 을 이용하면 코드가 간단함 .
물론 functional 한 함수들을 이용하는 방법도 있음 .
bool ContainsItem(...) { for (const auto& item : items) { for (const auto& attr : item.attrs()) { if (...) { return true; } } } return false;}
if (ContainsItem(...)) { ... (1) code ...}... (2) more code ...
![Page 53: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/53.jpg)
예외 상황 쳐 내기예외 상황을 안고 코드를 읽을 때 심란해진다 .
일찍 쳐 내면 이후의 코드가 간단해지는 경우가 많다 .
![Page 54: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/54.jpg)
One Exit Result* result = nullptr;if (condition) { Message msg = getMessage(); if (!msg.empty()) { ... some code ... ... some code ... result = msg.AsResult(); }}return result;
![Page 55: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/55.jpg)
Return Early if (!condition) {return nullptr;
}Message msg = getMessage();if (msg.empty()) { return nullptr;}... some code ...... some code ...return msg.AsResult();
![Page 56: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/56.jpg)
Return Early이 부분이 초기 조건 검사 부분이 된다 .
if (!condition) {return nullptr;
}Message msg = getMessage();if (msg.empty()) { return nullptr;}... some code ...... some code ...return msg.AsResult();
![Page 57: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/57.jpg)
예외 조건 검사조건없이 묻지도 따지지도 않고 ...
- 보험 / 대부 업계
저기 저 그렇게 쉬운 사람 아니거든요 ?
- 염산악
![Page 58: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/58.jpg)
Design by Contract (DbC)
추상 자료형에 다음을 덧붙임preconditioninvariantpostcondition
![Page 59: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/59.jpg)
Design by Contract
Eiffel, D, Ada 등의 언어에서 지원함지원하지 않는 언어도 써드 파티로 지원하거나 assert 를 지원하는 경우가 많음
![Page 60: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/60.jpg)
Defensive Programming vs DbC
방어 운전에서 따온 것으로 , " 입력이 무엇이 들어올지 알 수 없으니 , 입력을 믿지 말고 조심해서 어떻게든 잘 가 봅시다 ." 와 같은 자세가능하면 죽지 않고 감 .
어떤 입력이 들어와야 하는지 상세히 명시하고 잘못된 입력이 들어오면 , "계약 위반이오 ! 그러지 않기로 했잖소 !" 하면서 죽어버리는 자세프로덕션 코드에서는 성능을 위하여 검사하지 않기 때문에 위반 시 정의되지 않은 행동을 하게 됨
![Page 61: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/61.jpg)
Precondition조건이 만족하지 않을 때 , 로그를 남기고 에러를 리턴하거나 , 죽어버리거나 할 수 있다 . 디버그 모드인지 릴리즈 모드인지에 따라 달라질 수 있다 .
if (!Precondition(src)) {// ...
}for (i = 0; i < size_; ++i) {
if (min_[i] > src[i]) {min_[i] = src[i];last = i;
}}return last;
![Page 62: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/62.jpg)
Postconditionif (!Precondition(src)) {
// ...}last = Private(src);if (!Postcondition(last)) {
// ...}return last;
![Page 63: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/63.jpg)
주석 백일장승고월하문이 좋을지 승퇴월하문이 좋을지 고민하는 중이었습니다 .
- 당나라 시인 가도
둘 중에 가능하면 오해 없는 쪽으로 해 주시고 이유를 써 주세요 . 아니면 TODO 로 달아주세요 .
- 염산악
![Page 64: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/64.jpg)
퇴고
주석을 열심히 퇴고 하면 교통사고 가해자라도 용서받을 수 있다 .
![Page 65: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/65.jpg)
시작이 반이다일단 먼저 써 놓고 본다 . // 헉 ! 여기 잘못하면 뻗음 .
침착하게 그게 무슨 뜻인지를 다시 고쳐쓴다 .
영어가 불편하면 일단 머리에 있는 걸 잊기 전에 한국어라도 쓰고 침착하게 고쳐 쓴다 .
![Page 66: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/66.jpg)
오해하지 말고 들어 ...
오해할만한 문장으로 쓰지 않는다 .
내 주석을 어떻게 오해할 수 있을지 삐딱하게 바라보자 .
다시 고쳐 써서 더 좋은 문장으로 만든다 .
![Page 67: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/67.jpg)
보고 드리겠습니다 !
![Page 68: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/68.jpg)
보고 드리겠습니다 !
코드를 하나 하나 설명하지 않는다 . 이런 걸로 영어 공부 하고 싶어도 참는다 .
![Page 69: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/69.jpg)
보고 드리겠습니다 !
코드를 하나 하나 설명하지 않는다 . 이런 걸로 영어 공부 하고 싶어도 참는다 .
필요 없는 주석은 지운다 . 영어로 써 놓은 주석이 아까워도 할 수 없다 .
![Page 70: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/70.jpg)
보고 드리겠습니다 !
코드를 하나 하나 설명하지 않는다 . 이런 걸로 영어 공부 하고 싶어도 참는다 .
필요 없는 주석은 지운다 . 영어로 써 놓은 주석이 아까워도 할 수 없다 .
슬라이드에 필요 없는 내용들도 좀 지우시지 ?
![Page 71: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/71.jpg)
상세한 것만이 능사가 아니다길게 쓰는 것보다 단어 하나의 파워가 더 강력할 수 있다 .
// 이 함수들은 따로 하는 일에 대한 구현이 들어 있는 것이 아니라 좀 더 쓰기 어려운 복잡한 함수를 호출하기 위한 준비 작업을 하고 , 매개 변수의 순서도 우리 프로젝트 표준에 맞게 바꾸어서 구현이 들어 있는 함수들을 호출해 준다 .
![Page 72: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/72.jpg)
상세한 것만이 능사가 아니다길게 쓰는 것보다 단어 하나의 파워가 더 강력할 수 있다 .
// 이 함수들은 따로 하는 일에 대한 구현이 들어 있는 것이 아니라 좀 더 쓰기 어려운 복잡한 함수를 호출하기 위한 준비 작업을 하고 , 매개 변수의 순서도 우리 프로젝트 표준에 맞게 바꾸어서 구현이 들어 있는 함수들을 호출해 준다 .
// 이 함수들은 래퍼들이다 .
![Page 73: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/73.jpg)
어떤 것을 쓸까요 ?
왜 이렇게 했는가 ?
TODO, FIXME, ...
버그 같아 보이지만 버그가 아님 , 핵 구현 , 속도 때문에 정확도를 조금 버림 , 이 방법보다 그 방법이 더 빠를 거라 생각하겠지만 이게 더 빨랐음 .
커맨드라인 사용 예제
![Page 74: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/74.jpg)
정리레이아웃 및 형식화는 자동화된 도구와 열정으로 . 그리고 일관성을 유지하자의미 있는 것들끼리 모아서 추상화하자변수 / 함수 이름만 잘 붙여도 가독성이 증가한다흐름을 단순화하자주석을 잘 쓰고 퇴고하자 .
![Page 75: 2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여](https://reader035.fdocuments.net/reader035/viewer/2022062316/58efb73f1a28ab257d8b45c7/html5/thumbnails/75.jpg)
Final point가독성을 좋게 하기 위한 노력을 계속 하자 .