우테코 프리코스의 클린코드 체크리스트를 정리한 글 입니다.
자바 경험이 없는 사람의 입장에서 작성했습니다.
자바 무경험, 코틀린 3일차 입니다. 레퍼런스 자료에 포커스를 맞춰서 읽어주세요.
자바 코드 컨벤션을 지키면서 프로그래밍했는가?
https://google.github.io/styleguide/javaguide.html
https://myeonguni.tistory.com/1596 참고한다.
코드 컨벤션이란?
O 원어 그대로 code(코드) + 컨벤션(규칙) 이다.
O 코드 유지보수에 들어가는 시간의 절약
O 신입 개발자, 또는 타인의 실수로 코드가 오염되는걸 막기 위한 방지책
O 코드 문화의 차이로 커뮤니케이션 오류가 발생하지 않도록 도와주는 하나의 가이드 라인
예시 ) " 메서드 이름과 그 메서드의 파라미터 리스트의 시작인 괄호 "(" 사이에는 빈 공간이 없어야 한다. "
IntelliJ 또는 Eclipse 통합 개발 도구에서 formatting을 한다.
IDE(통합개발도구)에 코드 컨벤션을 적용하는 것이 가능하다.
초기에 설정함으로써 많은 도움을 받을 수 있음으로, 꼭 추가하고 시작할 것을 추천합니다.
한 메서드에 오직 한 단계의 들여쓰기(indent)만 허용했는가?
O 반복문과 조건문을 사용할 때 마다 늘어나는 들여쓰기를, 메소드를 사용해서 줄여준다.
else 예약어를 쓰지 않았는가?
else 예약어를 쓰지 않았을 때의 장점?
O 코드가 간결해지고 명확해진다.
O 객체지향적인 구조가 된다.
O 오류가 발생할 확률을 줄여준다. ( else를 사용했을 때 오류가 발생할 확률이 더 높다. )
모든 원시값과 문자열을 포장했는가?
원시값이란?
: 객체가 아니면서 메서드도 가지지 않는 데이터
원시값의 포장이란?
: 원시값을 객체에 넣어주는 것
+ 이해가 되지 않는 분들을 위해서
위 설명이 간단해 보이지만, 자바 지식이 없는 나에게는 이게 왜 필요한지 전혀 이해가 되지 않았다.
결론적으로, 아래 2가지의 지식이 더 필요했다.
O Object Access Operator
O Wrapper Object
이 두가지 지식은 이고잉 선생님의 유튜브 강의에서 발견할 수 있었다.
콜렉션에 대해 일급 콜렉션을 적용했는가?
바로 위 체크리스트에서 원시값을 객체로 변경해서 사용성을 높이고 Validation을 줄인 것과 비슷함
사실 나도 아직 완벽하게 이해가 되지 않는다, MutableMap, HashMap에 대한 개념도 부족한 상태라....
일급 콜렉션을 사용함으로써 생기는 장점?
O 비지니스에 종속적인 자료구조
O Collection의 불변성을 보장
O 상태와 행위를 한 곳에서 관리
O 이름이 있는 컬렉션
3개 이상의 [인스턴스 변수]를 가진 클래스를 구현하지 않았는가?
O 자바의 변수에 대해 먼저 알아야 이해가 가능하다.
public class test {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수
void method() {
int lv; // 지역 변수
}
}
쉽지 않은 연습일 수 있다. 가능하면 인스턴스 변수의 수를 줄이기 위해 노력한다.
인스턴스 변수가 많아지면 발생하는 단점
새로운 인스턴스 변수를 가진 클래스는 응집도가 떨어진다. 많은 인스턴스 변수를 가진 클래스로 응집력있는 단일 작업을 설명할 수 있는 경우는 거의 없다. (추측) 여기서 말하는 인스턴스 변수는 기본형 또는 자료구조형 객체들인 것으로, 일급 컬렉션이나 wrapper객체는 해당되지 않는 것 같다.
getter/setter 없이 구현했는가?
먼저 아래 문장에 대한 이해가 필요하다.
객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
예시 ) 객체 외부에서 직접적으로 접근하는 방법
var speed = 10
speed = 20
speed = 30
따라서 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다.
예시 ) 메소드를 통해서 데이터를 변경하는 방법
void setSpeed(double speed) {
this.speed = speed;
}
위 설명과 같이, 객체 지향 프로그래밍에서는 메소드를 통해서 객체 값을 변경시켜야 하는데,
O 객체 값을 변경 시키는 메소드를 Setter ( Set )
[ 더하기, 빼기, 곱하기, 바꾸기 ]
O 객체 값을 읽어오는 메소드를 Getter ( Get )
[ 초 > 분 > 시, km > m > cm ]
로 구분한다.
이렇게 Getter와 Setter를 사용하면 필드값을 안전하게 변경/사용 할 수 있게 된다!
하지만 프리코스 체크리스트에는 Getter와 Setter를 사용하지 말라고 말한다.
핵심 로직을 구현하는 도메인 객체에 getter/setter를 쓰지 않고 구현했는가?
Getter / Setter 를 사용했을 때의 단점
O Setter 사용의 의도를 알기 어려움
O 값의 일관성 유지에 어려움
O Builder의 사용해서 대체 가능
단, DTO는 허용한다.
DTO란? ( Data Transfer Object )
VO라고도 표현하며 계층 간 데이터 교환을 위한 자바 빈즈(Java Beans)이다.
데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다. DTO는 보통 로직을 가지고 있지 않고 data와 그 data에 접근을 위한 getter, setter만 가지고 있다.
정리하면 DTO는 Database에서 Data를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체를 말한다.
메소드의 인자 수를 제한했는가?
메소드 인자 수 증가에 따른 오류 발생률 비교 표
추가 레퍼런스
https://www.youtube.com/watch?v=tfUGpLp0tgM