it 책 18

리팩토링의 원칙

리팩터링: 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 ㄱ법 명심 누군가 "리팩터링하다가 코드가 깨져서 며칠이나 고생했다"라고 하면 십중팔구 리팩터링한 것이 아니다. 리팩터링하는 이유 리팩터링하면 소프트웨어 설계가 좋아진다. 아키텍처를 충분히 이해하지 못한 채 단기 목표만을 위해 코드를 수정하다보면 기반이 무너지기 쉽다. 반면 규칙적인 리팩터링은 코드의 구조를 지탱해줄 것이다. 리팩터링하면 소프트웨어를 이해하기 쉬워진다. 몇 달이 지나 누군가가 내 코드를 수정할 수 있다. 다른 프로그래머(혹은 내가)가 내 코드를 제대로 이해했다면 한 시간에 끝낼 수정을 일주일이나 걸릴 수 있다. 리팩터링 하면 버그를 쉽게 찾을 수 있다. 코드를 이해하기 쉽다는 말은..

it 책/리팩터링 2022.06.16

클린 코드 - 코드 indent 줄이기(Guard Clausing, Polymorphism)

if-else 조건문을 많이 사용하게 되면 코드 라인이 길어지고 indent가 많아져 가독성이 떨어지는 문제가 발생합니다. 이때 Guard Clausing과 Polymorhism(다형성)을 사용하면 코드를 클린하게 짤 수 있습니다. Guard clause 일반적으로 if-else문이 중첩(nestsed)될수록 코드는 복잡해지고 보기 지저분해집니다. // BAD if(){ ... if(){ ... if(){ ... while(){ ... ... } } } } nested 코드를 줄이고 가독성을 높이기 위해선, 코드 상단에 Fail이 되는 로직을 위로 넣어두는 것이 좋습니다. as-is function sayHiToSpringUser(developer){ if (developer.isFrontEnd){ th..

it 책/클린코드 2022.05.23

에러 핸들링

오류 코드보다는 예외 사용하기 오류 코드를 사용하게 되면 상단에 오류인지 확인하는 불필요한 로직이 들어가게 됩니다. 오류의 범주에 들어가지 않은 상태를 나타내는 것이 아니라면, 예외(Exception)로 명시적으로 에러 처리를 표현해주는게 좋습니다. enum ErrorCodes{ VALUE_ERROR = "VALUE_ERROR" } function weCanRaiseError(){ return ErrorCodes.VALUE_ERROR } function useUglyFunction(){ result = weCanRaiseError() if(result === ErrorCodes.VALUE_ERROR){ } } function weCanRaiseError(name, message){ if(...){ thr..

it 책/클린코드 2022.05.23

클래스

단일 책임 원칙(SRP) 지키기 하나의 클래스는 하나의 책임만 가지도록 합니다. as-is #Store가 많은 역할을 혼자서 수행합니다. class Store{ // 유저랑 커미니케이션 하는 메서드 communicate_user(self){ ... } // 상품 재고 관리 manage_products(self){ ... } // 돈을 관리하는 메서드 manage_money(self){ ... } } to-be # 책임을 나눠서 Manger 클래스에게 책임을 전가합니다. class CounterManager{ communicate_user(){ console.log(1) } } class ProductManager{ manage_products(){ ... } } class Owner{ manage_mon..

it 책/클린코드 2022.05.22

함수

함수의 역할은 하나만 할 수 있도록 하자 (SRP) 함수의 역할이 많아진다면, 오류가 날 가능성이 커지고 가독성이 떨어집니다. 또한 함수에 대한 테스트를 진행하기가 어렵습니다. as-is function createUser(email, password){ // validation 로직 if (!(email.includes('@')) || password.length < 6){ throw new Error("유저 정보를 제대로 입력하세요") } user = {"email" : email, "password" : password} database = Database("mysql") database.add(user) email_client = EmailClient() email_client.setConfig(..

it 책/클린코드 2022.05.22

주석, 포맷팅

주석 대부분은 좋은 Naming으로 충분히 해결이 가능합니다. 법적인 정보를 담을 때 // Copyright (C) 2021 ... 의돌를 명확하게 설명할 때 # throughput을 늘리기 위해 스레드를 10개까지 늘린다. for(let idx = 0; i < 10; i++){ thread = threading.Thread(target=...) thread.start() ... } 중요성을 강조할 때 // 최종 결제를 하기 전에 진행해야 하는 validation 함수 function validate_buyable(wallet, price, ...){ ... } 결과를 경고할 때 // WARNING: API 서버가 항상 양호한지 알 수 없음. function connectApiServer(){ ... }..

it 책/클린코드 2022.05.21

클린 코드(네이밍)

코딩을 하면서 이름을 지을 때 대표적인 컨벤션으로 snake_case , camelCase , pascalCase , kebab-case 4가지가 있습니다. snake_case: Python, Ruby 등에서 권장함 camelCase : Java, Javascript 등에서 권장함 PascalCase : 대부분의 프로그래밍 언어에서 클래스를 네이밍할 때 사용함 kebab-case: HTML Element를 표현할 때 사용함. 변수와 상수 일반적으로 변수와 상수를 네이밍할 때는 명사 혹은 형용사 구문 형태로 짓습니다. user_data = ... #명사 is_valid = ... #형용사 함수와 메서드 일반적으로 함수와 메서드를 네이밍할 때는 동사 혹은 형용사 구문 형태로 짓습니다. function sen..

it 책/클린코드 2022.05.20

7장 클래스

Array를 생성자 함수 new와 함께 호출하면 인스턴스가 생성됩니다. 이때 Array를 일종의 클래스라고 하면, Array의 prototype 객체 내부 요소들이 인스턴스에 상속된다고 볼 수 있습니다. 엄밀히 말하면 프로토 타입 체이닝에 의한 참조지만 인스턴스에 상속되는지 여부에 따라 스태틱 멤버와 인스턴스 멤버로 나뉩니다. 다른 클래스 기반 언어와 달리 자바스크립트에서는 인스턴스에서도 직접 메서드를 정의할 수 있기 때문에 ‘인스턴스 메서드’라는 명칭보다는 프로토 타입 메서드라고 부르는 편이 좋습니다. const Rectangle = function(width, height) { this.width = width this.height = height } Rectangle.prototype.getArea..

6장 프로토 타입

어떤 생성자 함수를 new연산자와 함께 출력하면 Constructor에서 정의된 내용을 바탕으로 새로운 인스턴스가 생성되는데 이 인스턴스에는 __proto__라는 Constructor의 prototype프로퍼티를 참조하는 프로퍼티가 자동으로 부여됩니다. const Person = function(name){ this._name = name } Person.prototype.getName = function(){ return this._name } const suzi = new Person('suzi') suzi.__proto__._name = 'seung bin' suzi.__proto__.getName() // 'seung bin' suzi.getName() // suzi __proto__는 생략 가능..