자바스크립트에서 if나 for와 같이 "문장"을 사용하는 방법은 두가지
여러 줄을 중괄호로 감싸는 방법과 중괄호를 사용하지 않는 방법
// 나쁜 예. 문법 상 문제는 없지만 권장하지 않음. if (condition) doSomething(); // 나쁜 예, 문법 상 문제는 없지만 권장하지 않음. if (condition) doSomething(); // 좋은 예 if (condition) { doSomething(); } // 나쁜 예, 문법 상 문제는 없지만 권장하지 않음. if (condition) { doSomething(); } |
복합문은 반드시 중괄호를 사용.
한줄에 입력하지 말고 여러 중에 걸쳐 입력. 중괄호가 없으면 오해의 소지 발생.
if (condition) doSomething(); doSomethingElse(); 이 코드는 작성자의 의도를 알기 어렵다. 이렇게 작성할 일은 없겠지만, if문 안에 처리를 하려 하였으나 중괄호를 넣지 않은 것인지 doSomething()만 실행할 목적이였는지 분간하기 어렵다. |
다음 모든 복합문에서는 중괄호를 반드시 사용한다.
if for while do... while try... catch.... finally |
3.1 중괄호 넣기
- 중괄호 위치는 주로 두 가지 스타일로 많이 사용.
- 첫 번째 스타일은 자바에서 사용하는 스타일
- 자바 프로그래밍 언어 코드 컨벤션, 크락포드 코드 컨벤션, jQuery 코어 스타일 가이드, SproutCore 스타일 가이드, 구글 자바스크립트 스타일 가이드, Dojo 스타일 가이드에서도 해당 스타일 권장.
if (condition) { doSomethind(); } else { doSomethingElse(); } |
- 두 번째 스타일은 복합문이 시작하는 다음 줄에 중괄호를 입력하는 방식
- 해당 스타일은 비주얼 스튜디오에서 이 방식을 강제화하고 있어 C#에서 주로 사용.
- 자바스크립트에서는 권장하지 않으며, 구글 자바스크립트 스타일 가이드는 세미콜론 자동 입력(ASI) 에러가 발생할 수 있다는 이유로 사용을 금지하고 있음.
if (condition) { doSomethind(); } else { doSomethingElse(); } |
3.2. 복합문에서의 공백
- 복합문을 시작할 때 공백을 입력하는 방식은 선호에 따라 결정할 문제.
- 일반적으로 세 가지 스타일로 복합문에 공백을 입력.
- 문장 이름, 괄호, 중괄호 사이에 아무 공백 없음. - Dojo 스타일 가이드에서 해당 스타일 권장. if(condition){ doSomething(); } - 괄호를 열기 전과 닫은 후에 공백 하나씩 입력, - 크락포드 코드 컨벤션, 구글 자바스크립트 스타일 가이드에서 해당 스타일 권장 if (condition) { doSomething(); } - 시작하는 괄호와 닫는 괄호 앞 뒤에 공백 입력. - jQuery 코어 스타일 가이드에서 해당 스타일 권장. if ( condition ) { doSomething(); } |
3.3 switch 문
- 초기 switch문은 C에서 시작되어 자바에 영향을 미치고 자바스크립트에 적용되는 과정을 거쳐 포맷이 너무 다양하고 다루기 까다롭다.
- 문법은 비슷하지만, 자바스크립트의 switch문은 다른 언어와 동작이 다름.
- 자바스크립트의 switch문은 어떤 타입이든 사용가능, 어떠한 표현식도 case문제 들어갈 수 있음. (다른 언어에서는 기본 데이터 타입과 상수만 사용가능)
3.3.1 들여쓰기
- 아래와 같은 자바 스타일의 switch문을 대부분 사용.
switch (condition) { case "first": // code break; case "second": // code break; case "third": // code break; default: // code } |
해당 포맷의 특징은 다음과 같다.
- 각 case 문은 switch문을 기준으로 한 단계 들여쓰기. - 두 번째 case 문 부터 case 문 이전과 이후에 빈 줄을 삽입. |
대부분의 에디터가 이 포맷의 switch문을 자동완성으로 지원.
- 코딩 스타일에 대한 관점이 서로 다르므로 어떤 switch문을 사용하느냐는 모두 선호에 따라 결정할 문제.
3.3.2 다음 case 문까지 실행하는 switch문
- 또 다른 논쟁거리는 "다음 case문 까지 실행하는 switch문(fall-through)를 허용할 것인가".
- case 문에서 실수로 break문을 빠뜨려 버그가 발생하는 일은 흔히 발생.
- 더글라스 크락포드는 이런 실수를 방지하고자 모든 case 문제 예외 없이 break, return, throw문으로 마쳐야한다고 주장.
- 다음 case 문까지 실행하는 swith문도 다음 예제 처럼 명확하게 사용한다면 좋은 방법.
switch (condition) { // 어떤 로직도 수행하지 않고 다음 case 문으로 넘어간다. case "first": case "second": // code break; case "third": // code
/*falls through*/ default: // code } |
- 작성자가 주석을 통해 의도적으로 사용했음을 명확하게 한다면 허용해도 된다고 판단.
3.3.3 default 절
- 논쟁이 될만한 또 다른 요소는 "switch문제 default 절을 꼭 넣어야 하는가?"
- default 절에 딱히 수행해야 할 로직이 없을 경우 // no default 주석을 통해 작성자의 의도를 명확하게 표현하면 문제 없다고 판단.
- 추가로 필요없는 문법을 사용하지 않아 용량 절약.
3.4 with문
- with문은 실행할 로직의 문맥을 변경
- with문은 객체 식별자를 명시하지 않아도 특정 객체의 프로퍼티와 메서드를 마치 변수인 것처럼 사용하게 해줌.
- with문의 목적은 객체 내 프로퍼티나 메서드에 접근 할 때, 개발자가 입력해야할 문자를 줄이는데 있다.
var book = { title: "Maintainable JavaScript", author: "Nicholas C. Zakas" }; var message = "The book is "; with(book) { message += title; message += " by " + author; } |
- 위 코드에서 with문은 중괄호 안에서 book 변수의 프로퍼티를 마치 변수인 것처럼 사용.
- 이때 title과 author의 주인이 어떤 객체인지 알기 어렵다는 문제.
- 또 어떤 변수가 book의 프로퍼티인지, message는 지역 변수인지도 불명확.
- 다른 개발자가 이해하기 어려울 수도 있다.
- with문은 문법 에러가 발생할 확률이 높다 strict 모드에서는 사용할 수 없는데 이는 ECMAScript 위원회도 with문을 더는 사용하지 말아야 하는 구문이라 생각한다는 걸 의미.
- 크락포드 코드 컨벤션, 구글 자바스크립트 스타일 가이드는 with문 사용을 금지.
3.5 for 반복문
- for 반목문에는 2가지 타입 존재.
- 전통적인 for 반복문과 객체의 프로퍼티를 순환하는 for...in 반복문이 존재.
- 전통적인 반복문 제어하는 데는 return이나 throw문을 사용을 제외한 2가지 방법 존재.
- 첫 번째는 break문 사용. break문을 사용하면 배열 끝에 도달하기 전에 반복문 종료
- 두 번째는 continue 문 사용. continue는 반복문 내 로직 수행을 즉시 종료하지만, 다음 요소로 넘어가 순환을 계속 진행.
- 크락포드의 코드 컨벤션에서는 continue 사용을 금지하고 있음.
- 크락포드는 continue 보다 조건문을 사용하는 편이 낫다고 말한다.
- 이유는 더 이해하기 쉽고 실수를 줄일 수 있기 떄문.
3.6 for...in 반복문
- 객체의 프로퍼티를 순환할 떄 사용.
- 조건문을 따로 정의하지 않고 프로퍼티를 순환하며 프로퍼티명을 반환.
var prop; for (prop in object) { console.log("Property name is " + prop); console.log("Property value is " + object[prop]); } |
- for...in 반복문의 문제점은 객체가 소유한 인스턴스의 프로퍼티만 반환하는 것이 아니고 상속 받은 프로토타입의 프로퍼티도 반환한다는 점.
- 이러한 이유로 for...in 반복문 사용시 hasOwnProperty() 메서드를 사용해 현재 인스턴스의 프로퍼티만 걸러서 사용하는 방법이 좋다.
var prop; for (prop in object) { if (object.hasOwnProperty(prop)) { console.log("Property name is " + prop); console.log("Property value is " + object[prop]); } } |
- 크락포드 코드 컨벤셔에서는 for...in반복문에는 hasOwnProperty() 메서드를 반드시 사용하도록 명시.
'JavaScript > Maintainable JavaScript' 카테고리의 다른 글
Chapter4. 변수, 함수, 연산자 (0) | 2016.09.23 |
---|---|
Chapter2. Javascript 주석 (0) | 2016.09.06 |
Chapter1. JavaScript 기본 포맷 (0) | 2016.09.03 |
Part1. 스타일 가이드 라인 (0) | 2016.09.03 |
Maintainable JavaScript 시작. (0) | 2016.09.03 |