⛏️
공부방
  • README.md
  • 프로젝트
    • ft_transcendence
      • 설계
        • 0. 프론트 디자인
        • 1. BackboneJS 뷰 객체
        • 2. API 설계
        • 3. 레일즈 라우팅 구현
        • 4. DB 설계
        • 5. 채널 설계
    • slab-saver
    • react-payment
  • 공부
    • HTML, CSS
      • GRID
      • emmet
      • position
      • CSS Unit
        • 단위 정리
        • 기준을 정해보자
        • em의 정확한 기준은 뭐야?
      • flex
      • NAVBAR 실습
      • 유튜브 화면 만들어보기
    • SQL
      • 이론
        • 1강 데이터베이스
        • 2강 다양한 데이터 베이스
        • 3강 데이터베이스 서버
      • 명령어
        • DB 관리
        • TABLE 관리
        • Constraints
        • SQL 명령어 - 1
        • SQL 명령어 - 2
        • SQL 명령어 - 3
        • SQL 명령어 - 4
        • SQL 명령어 - 5
    • Ruby
      • 루비 객체와 클래스
      • 곡괭이
        • Chapter2. Ruby.new
        • Chapter3. 클래스, 객체, 변수
        • Chapter4. 컨테이너, 블록, 반복자
        • Chapter5. 기능 공유하기
        • Chapter6. 표준 타입
        • Chapter8. 메서드 파헤치기
    • Python
      • 유용한 링크
    • RubyOnRails
      • 아직 정리하지 못한 것들
        • RSPEC 을 이용한 테스트 완전 자동화
        • 레일즈 이니셜라이징 과정
        • 액션케이블 구체적으로 정리하기
        • 웹팩으로 자바스크립트 모듈 관리하기
      • ACTIVE JOB
        • 액티브잡의 기본
        • 실전! 액티브 잡을 이용한 스케쥴링
        • 서버를 껏다 키면 스케쥴링 된 이벤트가 사라진다!
      • ACTION CABLE
        • 액션케이블 Consumer를 이용해서 문제 해결
        • 액션케이블 연결 순서
      • ACTIVE STORAGE
      • 모델
        • validation
          • seeds 데이터 validation 스킵
          • validation 검사가 save, update, create 모든 경우에 일어난다
          • validator 클래스
          • 커스텀Validation
          • validates format(정규표현식)
        • 액티브레코드 find의 다양한 활용
        • 한 레코드에 동시 접속 막자!! with_lock
        • 레일즈 where 사용법
        • 레일즈에서 모델 관련 이슈
        • 모델이름바꿀때명심할것
        • 모델의 includes 메서드
        • 연관 모델을 다른 이름으로 설정하고 가져오기
      • 기본 상식
        • form으로 전달되는 params를 분석해보자
        • StrongParameter 쿼리 배열 받기
        • view helper로 디버깅 하는 방법
        • css 파일을 수정했는데 적용이 안된다?
        • StrongParameter 일반데이터와 객체 데이터 한번에 받기
        • wrap-parameter body가 두 번씩 날라오는 이유
        • 컬렉션 map에서 요소 스킵하는법
        • CASE를 이용해서 정렬(일반적인 정렬 X)
        • 문자열(정규표현식)
        • TIME ZONE 설정하기
        • 커스텀exception
      • RSPEC으로 모델 테스트하기
      • 한 눈에 읽는 루비 온 레일즈
      • Perfect RubyOnRails
        • Chapter1. 소개
        • Chapter2. RubyOnRails 기본
        • Chapter3. 스캐폴딩
        • Chapter7. 라우팅
        • Chapter8. 테스트
    • Javascript
      • var, let, const 차이
      • 브라우저 동작 원리
      • 디바운싱과 쓰로틀링
      • Tagged Template Literal(styled-components)
      • IntersectionObserver 를 사용해서 스크롤 이벤트의 부하 줄여주기
      • EVENT LOOP
        • 자바스크립트에서 어떻게 비동기적인 실행이 가능한걸까?
        • 이벤트 루프의 동작
        • setTimeout이 실행되면 어떤 동작이 일어날까?
        • 블록은 실행이 보장된다
        • 콜스택에 있는 블록이 보장된다는 점을 이용해서 브라우저 죽이기
        • setTimeout 무한반복으로 브라우저는 죽을까?
        • Promise 무한반복으로는 브라우저를 죽일 수 있을까?
        • RAF는 그럼 뭐야?
      • forEach는 반복도중 멈출 방법이 throw 밖에 없다!
      • 임시
        • 정리할 것 목록
          • 자바스크립트 기본 문법
        • 이벤트 임시 정리
      • 유용한 링크
      • arrow function 을 이용한 bind 이슈 해결
      • preventDefault - passive
      • CRITICAL-RENDERING-PATH
      • setInterval에 클로져 개념 사용하기
      • 오디오 문제 이슈
      • 자바스크립트의 식과 문
        • 식과 문이란 무엇인가...
        • 식
          • 1. 기본값과 래퍼객체
          • 2. 참조값과 가비지컬렉팅
        • 식을 조금 더 자세히 알아보자
      • prototype, [[Prototype]] 차이
      • export, import 학습
      • ESlint
      • 아주아주기본
        • Chatper1. 기본
        • Chapter2. 타입
        • Chapter3. 연산자
        • Chapter4. 제어문
        • Chapter5. 배열
        • Chapter6. 함수
        • Chapter7-1. 객체
        • Chapter7-2. 객체
        • Chapter8. 표준객체
        • Chapter9. DOM
      • 이벤트 위임
      • 이벤트가 버블링 되서 root 까지 가다보면... 부모의 부모의 ... 모든 click 이벤트를 발동시키는거 아니야?
      • classList
    • BackboneJS
      • Backbone Model 프로토타입에 메서드 구현하기
      • BackboneJS의 각 요소의 역할과 책임을 확실히 이해하자
      • Window 이벤트를 listenTo로 감시하기
      • 뷰 자신이 자신을 지워야 할 때를 감지하려면 어떻게 해야하는가?
      • 백본 VIEW의 remove와 jquery의 remove 는 다르다!
      • 백본 컬렉션 URL에 쿼리 붙이기
      • index.html.erb와 BackboneJS의 결합
      • 백본 모델과 컬렉션에서 fetch 를 통해 JSON 가져오기!
      • 모델은 urlRoot, 컬렉션은 url
      • ISSUE
      • Absolute Beginner
        • Part1
        • Part2
        • Part3
        • Part4
    • 문제풀이
      • 01. 유효한 팰린드롬(leetcode: 125)
      • 02. 문자열 뒤집기(leetcode: 344)
      • 03. 로그파일 재정렬(leetcode 937)
      • 04. 가장 흔한 단어(leetcode: 819)
      • 05. 그룹 애너그램(leetcode: 49)
      • 06. 가장 긴 팰린드롬 문자열(leetcode: 5)
      • 07. 두 수의 합(leetcode: 1)
      • 08. 빗물 트래핑
      • 09. 세 수의 합(leetcode: 15)
    • BlackCoffeeStudy
      • level1
        • 1주차
    • express
      • Untitled
      • 구글 애널리틱스 연결하기
      • passport를 활용한 로그인
      • express-init 명령어 사용
      • ec2와 DBeaver
      • mariadb 설치
      • sequelize 설치 및 사용법
        • sequelize 설치
        • sequelize-cli 사용법
        • 모델 간 연관관계 맺기
        • Hook 사용하기
      • express-ejs-layout 활용하기
      • Bootstrap
      • npm install로 설치한 모듈 ejs에서 사용하기
      • 미들웨어
    • cypress
      • window.alert 테스트는 어떻게 하지?
      • 상수를 어디에 저장할건가?
      • before()와 beforeEach()
    • aws
      • aws로 프로젝트를 배포해보자!
      • nginx로 리버스프록시 서버를 만들자
      • github actions 로 푸쉬되면 자동으로 업데이트 하는 기능 만들어보기
    • react
      • Drag & Drop 를 이용해서 리스트 요소 순서 바꾸기
      • CRA에서 CRACO 사용하지 않고 절대경로 import(NODE_PATH)
      • useEffect내에서 state의 dependency 문제
      • IntersectionObserverAPI로 무한스크롤 구현
      • react-testing-library
        • 기본
        • react-router-dom 에서의 에러
        • event 발생시키기
        • Integration testing하기
        • async하게 렌더링 되는 요소 잡기
        • Mocking 하기
      • CRA로 만든 앱에서 절대경로로 import 해오기(alias하기)
      • 커스텀 훅 만들기
    • 타입스크립트
      • 조건부타입 (Conditional types)
      • Generics
      • Keyof 타입 오퍼레이터
      • Indexed Access Types
      • 타입 챌린지
        • easy
          • 00. Awaited
          • 01. Concat
          • 02. Exclude
          • 03. First Of Array
          • 04. If
          • 05. Includes
          • 06. Pick
          • 07. Readonly
          • 08. Length
          • 09. Tuple to Object
        • mediun
          • 01. Absolute
    • Firebase
      • 파이어스토어 규칙
    • 기타
      • 협업 프로세스
      • UUID
      • 구글애널리틱스 설치하기
      • 드림코딩 강의
        • 포트폴리오
          • CSS
            • nth-child
            • CSS 팁
          • 자바스크립트
            • 1. 스크롤에 따른 navbar 의 색 변경하기
            • 2. navbar 버튼을 누르면 해당 페이지로 스크롤링 되게 만들자
            • 3. 스크롤 다운 하면 arrow-up 버튼 나오게 하기
            • 4. project 필터링 구현
            • 5. project 필터링에 transition 효과 넣기
      • GIT
        • 기본 사용법 정리
        • git remote update - remote 브랜치 가져오기
  • 기타
    • 이것저것
      • 독서
        • 클린코드
          • Chapter0. 나는 왜 클린코드 책을 읽는가?
          • Chapter1. 클린코드
          • Chapter2. 의미있는 이름
          • Chapter3. 함수
          • Chapter4. 주석
          • Chapter5. 형식 맞추기
      • 용어
      • IDE
        • RubyMine
          • 실전이 중요!
          • 1. Editor Basic
          • 2. Navigation
          • 3. Completion
          • 4. Refactoring
          • 5. Code Assistance
      • MAC에서 살아남기
        • Alfred - Spotlight 업그레이드
        • Vimium
        • BetterTouchTool - 트랙패드
        • 구름 입력기 - ESC, `
        • Spectacle - 화면 분할
    • 원티드 프리온보딩
      • 1주차
        • 월요일
        • 목요일
      • 2주차
      • 3주차
      • 4주차
      • 5주차
      • 6주차
    • 일기장
      • 2020
        • December
          • 20201208(화)
          • 20201209(수)
          • 20201210(목)
          • 20201211(금)
          • 20201214(월)
          • 20201215(화)
          • 20201216(수)
          • 20201217(목)
          • 20201218(금)
          • 20201219(토)
          • 20201221(월)
          • 20201222(화)
          • 20201223(수)
          • 20201224(목)
          • 20201226(토)
          • 20201228(월)
          • 20201229(화)
          • 20201230(수)
          • 20201231(목)
      • 2021
        • January
          • 20210101(금)
          • 20210102(토)
          • 20210105(화)
          • 20210106(수)
          • 20210107(목)
          • 20210108(금)
          • 20210109(토)
          • 20210112(화)
          • 20210113(수)
          • 20210114(목)
          • 20210115(금)
          • 20210117(일)
          • 20210118(월)
          • 20210119(화)
          • 20210120(수)
          • 20210121(목)
          • 20210125(월)
          • 20210126(화)
          • 20210127(수)
          • 20210128(목)
          • 20210129(금)
        • February
          • 20210201(월)
          • 20210202(화)
          • 20210203(수)
          • 20210204(목)
          • 20210205(금)
          • 20210207(일)
          • 20210208(월)
          • 20210209(화)
          • 20210217(수)
          • 20210218(목)
          • 20210219(금)
          • 20210220(토)
          • 20210222(월)
          • 20210223(화)
          • 20210224(수)
          • 20210226(금)
          • 20210228(일)
        • March
          • 20210302(화)
          • 20210303(수)
          • 20210304(목)
          • 20210305(금)
          • 20210306(토)
          • 20210308(월)
          • 20210309(화)
          • 20210310(수)
          • 20210311(목)
          • 20210312(금)
          • 20210313(토)
          • 20210315(월)
          • 20210316(화)
          • 20210317(수)
          • 20210318(목)
          • 20210319(금)
          • 20210322(월)
          • 20210323(화)
          • 20210324(수)
          • 20210325(목)
          • 20210327(토)
          • 20210329(월)
          • 20210330(화)
          • 20210331(수)
        • April
          • 20210406(화)
          • 20210407(수)
          • 20210408(목)
          • 20210409(금)
          • 20210410(토)
          • 20210412(월)
          • 20210413(화)
          • 20210414(수)
          • 20210415(목)
          • 20210416(금)
          • 20210417(토)
          • 20210419(월)
          • 20210420(화)
          • 20210421(수)
          • 20210422(목)
        • July
          • 20210728(수)
Powered by GitBook
On this page
  • 이름을 짓는 규칙
  • 1. 의도를 분명히 밝혀라
  • 2. 그릇된 정보를 피하라
  • 3. 의미 있게 구분하라
  • 4. 발음하기 쉬운 이름을 사용하라
  • 5. 검색하기 쉬운 이름을 사용하라
  • 6. 인코딩을 피하라
  • 7. 자신의 기억력을 자랑하지 마라
  • 8. 클래스 이름
  • 9. 메써드 이름
  • 10. 기발한 이름은 피하라
  • 11. 개념 하나에 단어 하나를 사용하라
  • 12. 말장난을 하지 마라
  • 13. 해법 영역에서 사용하는 이름을 사용하라
  • 14. 문제 영역과 관련 있는 이름을 사용하라
  • 15. 의미 있는 맥락을 추가하라
  • 16. 불필요한 맥락을 없애라
  • 결론

Was this helpful?

  1. 기타
  2. 이것저것
  3. 독서
  4. 클린코드

Chapter2. 의미있는 이름

이름 하나 만으로 맥락을 파악할 수 있어야 한다.ß

이름을 짓는 규칙

1. 의도를 분명히 밝혀라

"의도가 분명하게 이름을 지어라." 중요하다는 100줄 이상의 코드를 짜 본 사람이라면 모두가 아는 사실이다. 하지만 의도가 분명하게 이름을 짓는건 생각보다 어렵다. 어떻게 하면 이름에서 그 의도가 명백히 들어날 수 있을까? 정답은 추상화에 있는 것 같다. 추상화를 하면 코드가 추상이라는 껍질 안에 숨고 코드를 보는 사람은 보다 인간에게 친숙한 언어로 코드를 볼 수 있다. 예는 1장에서의 추상을 생각하면 될 것 같다.

2. 그릇된 정보를 피하라

  • 흡사한 이름은 사용하지 않는다.

  • 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안된다.

    • hp, aix, sco 등의 단어는 최대한 삼가자.

  • List라는 이름은 정말로 list 자료구조를 사용하는게 아니라면 사용하지 말자. group과 같은 다른 단어를 선택하자.

3. 의미 있게 구분하라

  • 같은 이름을 가진 변수는 있을 수 없다. 만약 비슷한 동작을 하기 때문에 같은 이름을 지었고, 컴파일 에러가 발생해 이름을 바꿔야 하는 상황이 있다고 해보자. 이 때 이름을 생각하고 새로 짓는게 번거롭다는 마음에 이름에 1과 같이 숫자를 붙이는 행동은 절대로 하지 말자.

  • 또한 Info나 Data, a, the 와 같은 단어는 의미가 불분명한 불용어다. 불용어는 중복이나 다름없다. 아래의 두 메써드는 info의 차이가 있다. 혹시 이 두 함수의 이름을 보고 각각이 어떤 차이가 있는지 알 수 있는가? 없다. 즉 info는 의미가 없는, 중복된 불용어다.

    • getAccount

    • getAccountInfo

4. 발음하기 쉬운 이름을 사용하라

  • APPLE 발음이 너무 쉽다. 애플이 그래서 성공한 걸까?ㅎㅎ

5. 검색하기 쉬운 이름을 사용하라

  • 검색하기 쉬운 이름일 수록 프로젝트의 단위가 커질 수록 그 위력을 발휘한다.

6. 인코딩을 피하라

  • 헝가리식 표기법, 멤버 변수 접두어

    • 옛날에, IDE 와 같은 툴이 발달하기 전에는 변수 자체에 대해 정보를 알아내기가 어려웠다. 따라서 변수 하나가 대부분의 정보를 포함하고 있어야했다. 따라서 헝가리식 표기법, 멤버 변수 접두어 등을 사용했는데 이제는 시간이 흘렀다. 따라서 굳이 위 두가지 방법을 사용할 필요는 없다.

  • 인터페이스 클래스와 구현 클래스

    • 흠.. 난 동의하지 못한다. 인터페이스 클래스는 I 접두어를 붙이는게 좋다고 생각한다.

7. 자신의 기억력을 자랑하지 마라

8. 클래스 이름

클래스 이름과 객체 이름은 명사나 명사구가 적합하다.

  • 좋은 예

    • Customer, WikiPage, Account

  • 나쁜 예

    • Manager, Processor, Data, Info

9. 메써드 이름

동사나 동사구가 적합하다. 접근자 변경자, 조건자는 get, set, is를 붙이자.

10. 기발한 이름은 피하라

나만 알아 볼 수있는 기발한 이름은 사용하지 말자. 코드는 공공재다.

11. 개념 하나에 단어 하나를 사용하라

메써드의 이름은 독자적이고 일관적이어야 한다. 그래야만 주석을 뒤지지 않고서도 올바르게 사용할 수 있다. 예를 들어 fetch, retrieve, get 이 셋의 정확한 차이를 아는가? 말을 할 때도 그렇지만 코드로 짤 때는 더욱 신중하게 하나의 이름을 일관적으로 사용해야한다.

12. 말장난을 하지 마라

한 단어를 두 가지 의미로 사용하지 마라. 11 에서 하나의 개념에는 단어 하나만을 사용하라고 했다. add 라는 이름을 생각해보자. add는 무엇인가 추가가 된다 라는 의미를 가진다. 새로운 메써드를 만들어보자. 이 메써드는 집합에 값 하나를 추가한다. 에 새롭게 만들어지는 메써드에 add 라는 이름을 붙여야 할까? 일관성을 지키려면 그렇게 해야하지! 아니다! 새롭게 만든 메써드는 add 와는 맥락이 다르다! 지금은 append가 더 어울린다. 따라서 새 메써드를 add 로 부르는 것은 말장난이다. 프로그래머는 최대한 이해가 쉽게 코드를 만들어야 한다. 즉, 맥락이 정말 중요하다.

13. 해법 영역에서 사용하는 이름을 사용하라

익숙한 단어가 최고다.

14. 문제 영역과 관련 있는 이름을 사용하라

당연한 이야기다. 만약 우주선을 쏘아 올려야 하는 프로젝트를 진행중인다. 뜬금 없이 배 에서 사용하는 용어를 이름으로 사용하면 될까?

15. 의미 있는 맥락을 추가하라

맥락을 추가하라는 것은 읽기 쉽게 만드는 것을 의미한다. addDataToCGI와 같이 이름 하나로 그 맥락을 파악하게 만드는 것이 핵심.

16. 불필요한 맥락을 없애라

당연하게도 불필요한 맥락이 있을 수 있다. 이런 경우는 없도록 만들자.

결론

당연한 이야기다. 당연한 이야기를 읽고 글로 정리했다. 하지만 나는 제대로 된 이름을 부여하지 않았다. 왜 그랬을까... 변명을 해보자면 코드를 작성하기 전에는 머릿속으로 먼저 청사진을 그려놓는다. 이후에는 청사진이 지워질라.. 노심초사 하면서 얼른 얼른 코드를 짠다. 이 때는 이름을 짓는 시간도 아까워서 신경쓰지 않고 만든다. 물론! 나중에 바꿔야지 라는 생각을 한다. 하지만 르블랑의 법칙은 나를 배신하지 않는다. 그렇게 나는 신경쓰지 않은 이름을 가진 코드 그 상태로 팀원분들에게 코드리뷰를 받고 지적을 받는다. 이제는 바뀌어야 한다. 클린코드라는 것은 의도적으로 클린 코드라는 것을 의식해야만 되는 것 같다. 이제부터는 의식적으로 이름을 신경써서 짓도록 해야겠다. 글쓴이는 결론 부분에서 말한다. 프로그래머는 읽히는 코드를 짜는 데만 집중해야 한다라고. 프로그래머가 코드를 머릿속에 외우는 시대는 지났다. 외우는건 멍청한 바보 상자가 해준다. 우리는 오롯이 읽기만 하면 머릿속에 쏙쏙 들어오는 코드를 짜야한다.

PreviousChapter1. 클린코드NextChapter3. 함수

Last updated 4 years ago

Was this helpful?