시스템 시스템 제작과 시스템 사용을 분리하라 소프트웨어 시스템은 (애플리케이션 객체를 제작하고 의존성을 서로 ‘연결’하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야 한다. Main 분리 시스템 생성과 시스템 사용을 분리하는 한 가지 방법으로, 생성과 관련한 코드는 모두 main이나 main이 호출하는 모듈로 옮기고, 나머지 시스템은 모든 객체가 생성되었고 모든 의존성이 연결되었다고 가정한다. 팩토리 객체 생성 시점을 애플리케이션이 결정할 필요가 있을 때 Abstract Factory 패턴을 사용하여 코드를 감춘다. 객체를 생성하는 시점은 애플리케이션이 결정하지만 객체를 생성하는 코드는 애플리케이션이 모른다. 의존성 주입(DI) 사용과 제작을 분리하는 강력한 메커니즘 중 하나이다...
클래스 클래스 체계 클래스를 정의하는 표준 자바 관례에 따르면, 가장 먼저 변수 목록이 나오고 변수 목록 다음에는 공개 함수가 나온다. class Example { 변수들 ... 함수들 ... } 변수: 정적 공개 상수 -> 정적 비공개 변수 -> 비공개 인스턴스 변수 -> 공개 변수 변수 목록 다음에는 공개 함수가 나온다. 즉, 추상화 단계가 순차적으로 내려간다. 클래스는 작아야 한다! 클래스를 설계할 때도, 함수와 마찬가지로 ‘작게’가 기본 규칙이다. 함수는 물리적인 행 수로 크기를 측정했다면, 클래스는 맡은 책임을 센다. 작명은 클래스 크기를 줄이는 첫 번째 관문이다. 간결한 이름이 떠오르지 않는다면 필경 클래스 크기가 너무 커서 그렇다. 단일 책임 원칙(Single Responsibility Pr..
오류 처리 오류 코드보다 예외를 사용하라 오류를 코드로 처리하면 호출자 코드가 복잡해진다. 함수를 호출한 즉시 오류를 확인해야 하기 때문이다. 오류가 발생하면 예외를 던지는 편이 낫다. 호출자 코드가 더 깔끔해진다. public void sendShutDown(){ try{ tryToShutDown(); }catch(DeviceShutDownError e){ logger.log(e); } } 예외를 던지고 코드를 분리함으로써 각 개념을 독립적으로 살펴보고 이해할 수 있다. Try-Catch-Finally 문부터 작성하라 try-catch-finally 문에서 try 블록에 들어가는 코드를 실행하면 어느 시점에서든 실행이 중단된 후 catch 블록으로 넘어갈 수 있다. try 블록에서 무슨 일이 생기든지 ..
형식 맞추기 적절한 행 길이를 유지하라 파일 길이가 짧아도, 커다란 시스템을 구축할 수 있다. 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 개념은 빈 행으로 분리하라 거의 모든 코드는 왼쪽에서 오른쪽으로 그리고 위에서 아래로 읽힌다. 각 행은 수식이나 절을 나타내고, 일련의 행 묶음은 완결된 생각 하나를 표현한다. 생각 사이는 빈 행을 넣어 분리해야 마땅하다. 빈 행은 새로운 개념을 시작한다는 시각적 단서다. 세로 밀집도 줄바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다. 즉, 서로 밀집한 코드 행은 세로로 가까이 놓여야 한다. 수직 거리 서로 밀접한 개념은 세로로 가까이 둬야 한다. 같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리로 연관성을 표현한다. 변수 선언 변수는 사용하는 위..
주석은 나쁜 코드를 보완하지 못한다. 표현력이 풍부하고 깔끔하여 주석이 거의 없는 코드가, 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 코드로 의도를 표현하라 코드로 대다수 의도를 표현할 수 있다. 많은 경우 주석으로 달려는 설명을 함수로 만들어 표현해도 충분하다. //직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) 주석이 없음에도 아래쪽 코드로 의도를 표현할 수 있다. if (employee.isEligibleForFullBenefits()) 좋은 주석 어떤 주석은 필요하거나 유익하다. 법적인 주석 각 소스 파일 첫머리에 주석으로 들어가는 저작권 정보와 소유권 정보는 필요하고도 타..
의미있는 이름 의도를 분명히 밝혀라 변수(혹은 함수나 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? int d; //경과 시간(단위: 날짜) 이름 d는 아무 의미도 드러나지 않는다. 경과 시간이나 날짜라는 느낌이 안 든다. 측정하려는 값과 단위를 표현하는 이름이 필요하다. int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeIndDays; 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.그릇된 정보를 피하라 hp, aix, sco는 변수 이름으로 적합하지 않다. 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이기 때문이다. 실제 List가 아니라면, accountList라 명명하지 않는다...
- Total
- Today
- Yesterday
- 인프런
- 데이터베이스
- leetcode
- mysql 8.0
- 구현
- 김영한
- kotlin
- Algorithm
- 알고리즘
- 코테
- 스프링부트
- MySQL
- webflux
- 문자열
- 리팩토링
- 백준
- 스프링
- Real MySQL
- 정렬
- 노마드
- 자료구조
- 파이썬
- 그리디
- 릿코드
- 노마드코더
- spring boot
- 북클럽
- 스프링 부트
- 코틀린
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |