- 전문가로써 자신의 코드에 자부심을 가지는가
- 예전의 코더란
- 위에서 설계를 하면 그대로 찍어내는 형태로 '코더'라고 불렀음.
- 최근의 코딩이란 단순히 설계를 코드로 찍어내는게 아닌, 설계를 하면서 개발을 병행하는 형태임. 찍어내는 형태라면 좋은 코드라고 할 수 없다.
- 예전의 코더란
-
null참조의 기원: 레코드 핸들링
-
참조(Reference) - 레코드관의 관계를 표현
-
null : 관계가 없음을 나타내는 특수 값
-
null인 값을 사용하려고 하면 오류를 발생시킴
-
Null이 문제인 이유
- 모호한 null의 의미
- 초기화되지 않음, 정의디지 않음, 값이 없음. null이라는 값?
- 모든 참조의 기본 상태 또는 값 -모든 참조는 null일 가능성이 있음
-
자바가 아닌 다른 언어들은 Null의 존재를 인지하여 처리할 수 있는 다양한 연산자들을 지원함
- Null Type이 존재
- Null을 병합하거나, 조건으로 쓸 수 있는 연산자들을 지원함
-
기본적으로 null을 쓰지 말자
-
무조건적인 null 사용을 지양하자
-
객체필드, 매개변수, 반환값은 가능한 null 타입을 허용하지 않도록 하자
intelliJ @ParameterAreNonnullByDefault
-
-
null 문맥을 제한된 범뮈 안에 가두자
OOP to me means only messaging, local retention and protection and. hiding of state-process, and extreme late-binding of all things.- Dr. Alan Kay
- 설계를 잘하면 null의 위험에서 안전해 질 수 있다.
- 좋은 캡슐화
- 높은 응집성 :SRP
- 모든 필드는 객체와 생애주기가 같다
- 모든 매서드가 모든 필드를 대상으로 작업한다.
- 낮은 결합도
- 디미터법칙, 묻지 말고 시켜라
디미터 법칙 예 ) DDD Agreegate
- 인터페이스의 사용
- 디미터법칙, 묻지 말고 시켜라
- 높은 응집성 :SRP
-
API에 Null을 최대한 쓰지 말아라.
- Null로 지나치게 유연한 메서드를 만들지 말고 명시적인 메서드를 만들어라
- Null을 반환하지 말라
- 빈 컬렉션이나 null객체를 활용하라.
- 반환값이 없을 수도 있으므로 명시적으로 Optional로 표현하라.
- 오류상황에서는 null을 반환하지 말고 예외를 던저라.
- 선택적인 매개변수는 정적 다형성 (overload)를 사용해서 표현하라.
-
null객체를 활용하자
- null 객체(특수사례패턴 : Special Case Pattern)
- 인터페이스는 동일하지만 아무 일도 하지 않는, 일종의 더미 객체
- 이 객체와 협력하는 객체는 더미라는 사실을 몰라야함
- 타입이 안전하면서 의미를 표현할 수 있는 동일 타입의 특수 상황용 객체를 null 대신 반환
- 리스코프 치환 원칙 주의
- 디미터 법칙과 '묻지 말고 시켜라'를 잘 지켜야 유용
이종립님
- null 객체(특수사례패턴 : Special Case Pattern)
-
null을 명시적으로 표현하자
- null은 참조 값이 없음을 나타내는 암시적인 표현 방법
- java.util.Optional은 값이 없음을 명시적으로 표현하는 컨테이너 객체
-
계약에 의한 설계를 적용하자(design by contract)
- API 규약을 소비자와 제공자 사이에 지켜야 할 엄격한 계약으로 여기는 설계방법
- 형식적 규약 외에 사전 조건과 사후 조건과 유지조건(불변식)을 포함
- 오브젝트 부록 A
계약에 의한 설계 -조영호
- 자바는 대표적으로 Assert class를 통해서 설계를 적용할 수 있다.
-
구초체에는 functor를 활용하자
- 자바는 순수 OOP언어가 아니다.
- 자바 클래스는 데이터 구조체로 적절히 사용 가능 (DTO)
- 구조체는 객체가 아니므로 디미터 법칙 적용 대상이 아님
-
객체의 기본값을 유용하게 만들자
- 객체를 생성했을 때 갖는 기본 값이 쓰기에 문제 없어야 한다.
- 실행 전에 모든 필드가 초기화되어야 한다.(지연 초기화 제외)
- 실행 시점에 null인 필드는 초기화되지 않았다는 의미가 아닌, 값이 없다는 의미로 전달되어야 한다.
- 객체 필드의 생명주기는 모두 객체의 생명 주기와 같아야 한다.
- JSR305
- 중단된 미완성 표준
- 각종 정적 분석 도구에서 비표준 어노테이션 제공
- 정적분석도구 (find bugs / spot bugs)
- intelliJ 제공 어노테이션
- 매개변수를 기본으로 Null이 아닌 것으로 설정
- 이클립스 제공 어노테이션
- @NonNull, @Nullable
- @NonNullByDefault
- 외부 어노테이션 적용
- 스프링 제공 어노테이션
- @NonNull, @Nullable : 매개변수, 반환값, 필드에 지정 가능
- @NonNullApi, @NonNullFields : 패키지에 지정 가능, 지정된 범위의 매서드 매개변수, 반환값, 필드가 기본 Null이 아님
- JSR308
- check framework와 동시에 진행
- null 안정성 확인 @Nullable, @NonNull, @PolyNull
- 패키지, 클래스 수준 기본 정책 설정 가능
- check framework와 동시에 진행