cleancode
[JavaScript] Clean Code - 11. 주석(Comments)
1. 주석을 다는 것은 로직이 복잡하다는 증명이다. 좋은 코드는 코드 자체로 말한다. // BAD function hashIt(data) { // 이건 해쉬입니다. let hash = 0; // lengh는 data의 길이입니다. const length = data.length; // 데이터의 문자열 개수만큼 반복문을 실행합니다. for (let i = 0; i < length; i++) { // 문자열 코드를 얻습니다. const char = data.charCodeAt(i); // 해쉬를 만듭니다. hash = ((hash
[JavaScript] 클린 코드 - 10. 포맷팅(Formatting)
포맷팅에 관한 과도한 논쟁은 낭비라고 생각한다. 이미 좋은 포맷팅 도구가 많기 때문이다. 하지만 아래의 몇 가지 기본적인 지침은 따르는 것이 좋다. 1. 일관된 대소문자를 사용한다. // BAD const DAYS_IN_WEEK = 7; const daysInMonth = 30; const songs = ['Back In Black', 'Stairway to Heaven', 'Hey Jude']; const Artists = ['ACDC', 'Led Zeppelin', 'The Beatles']; function eraseDatabase() {} function restore_database() {} class animal {} class Alpaca {} // GOOD const DAYS_IN_WEEK..
[JavaScript] 클린 코드 - 9. 에러 처리
1. 단순히 에러를 확인만 하지 않는다. 에러를 확인했다면 그에 대한 계획이나 장치를 마련해야 한다. // BAD - 출력만 하면 에러 로그를 잃어버리기 쉽다. try { functionThatMightThrow(); } catch (error) { console.log(error); } // GOOD try { functionThatMightThrow(); } catch (error) { // 1. console.error는 console.log보다 조금 더 알아채기 쉽다. console.error(error); // 2. 유저에게 에러를 알린다. notifyUserOfError(error); // 3. 서비스 자체에 에러를 기록한다. reportErrorToService(error); // 4. 그 ..
[JavaScript] 클린 코드 - 8. 동시성 (Concurrency)
1. Callback 대신 Promise를 사용한다. Callback은 깔끔하지 않고 많은 괄호 중첩을 만든다. // BAD - 중괄호 중첩 require('request').get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin', (requestErr, response) => { if (requestErr) { console.error(requestErr); } else { require('fs').writeFile('article.html', response.body, (writeErr) => { if (writeErr) { console.error(writeErr); } else { console.log('File written'); } }); } });..
[JavaScript] 클린 코드 - 7. 테스팅
테스트 테스트는 배포하는 것보다 중요하다. 스스로 또는 팀 내에서 정한 Coverage 목표를 달성하는 것에 초점을 둔다. 테스트 주도 개발(Test Driven Development, TDD)은 훌륭한 개발 방법론이다. 테스트 컨셉 지엽적인 테스트보단 특정 케이스에 대한 테스트 특히 테스트 케이스는 많을수록 무조건 좋다! // BAD const assert = require('assert'); describe('MakeMomentJSGreatAgain', () => { it('handles date boundaries', () => { let date; date = new MakeMomentJSGreatAgain('1/1/2015'); date.addDays(30); assert.equal('1/31/..
[JavaScript] 클린 코드 - 6. SOLID
S.O.L.I.D 객체지향 5대 원칙의 약자를 딴 것이다. Single Responsibility Principle Open Close Principle Liskov Substitution Principle Interface Seggregation Principle Dependency Inversion Principle 1. 단일 책임 원칙 (Single Responsibility Principle, SRP) 하나의 객체는 하나의 책임을 가진다. 클래스를 수정할 때 수정할 이유가 2개 이상 있으면 안 된다. 이는 하나의 클래스가 많은 기능을 가진 거나 다름없기 때문이다. 이러면 수정할 때 다른 모듈들에 어떤 영향을 끼치는지 이해하기 어려워진다. // BAD - change, verify 2개의 기능 가짐..
[JavaScript] 클린 코드 - 5. 클래스
1. 함수보단 클래스를 사용한다. 함수로 상속을 구현하기는 어렵다. 상속이 필요하다면 클래스를 사용하는 것이 좋다. // BAD const Animal = function (age) { if (!(this instanceof Animal)) { throw new Error("Instantiate Animal with `new`"); } this.age = age; }; Animal.prototype.move = function () {}; const Mammal = function (age, furColor) { if (!(this instanceof Mammal)) { throw new Error("Instantiate Mammal with `new`"); } Animal.call(this, age);..
[JavaScript] 클린 코드 - 4. 객체와 자료구조
1. getter와 setter를 사용한다. JavaScript는 public, private 키워드나 인터페이스 문법이 존재하지 않는다. (TypeScript에선 모두 제공하고 있다. 굿굿) 그래서 중요한 내용을 내부 인터페이스로 따로 분리하여 관리하는 것이 어렵다. 대신 getter와 setter를 사용하는 것을 추천한다. 다음과 같은 장점을 가질 수 있다. 단순히 속성을 얻는 것 이상의 행동을 쉽게 구현할 수 있다. 만약 검증 로직이 필요하다면 간단하게 추가할 수 있다. 내부용 API를 캡슐화 시킬 수 있다. getting, setting 로그를 관리하거나 에러 처리를 쉽게 할 수 있다. 서버에서 객체 속성을 받아올 때 lazy load 할 수 있다. lazy load - 페이지를 읽는 시점에서 중..
[JavaScript] 클린 코드 - 3. 함수 (2)
1. 함수형 프로그래밍을 지향한다. (여기선 간단히만 다룸. 중요한 패러다임이니 따로 공부할 예정) 함수형 프로그래밍이란 함수를 기반으로 하는 프로그래밍이다. 이러한 함수형 프로그래밍에선 순수 함수를 사용해야 한다. 순수 함수 같은 입력이 주어지면 항상 같은 값을 반환해야 한다. 부작용(Side effect)이 없어야 한다. = 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 한다. ex 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 행위 프로그램에 변화를 주지 않고, 입력에 대한 결과를 예측할 수 있어서 테스트가 쉬워진다. 또한 함수형 프로그래밍은 데이터를 변경하지 않고 기존 데이터의 복사본을 다뤄야 한다. 복사본을 만들기 위한 JavaScript의 대표적인 순수 함수는 map, ..