진정한 객체지향으로 코딩하는 것은 무엇인가에 관한 가이드를 담은 글이나 저자에 생각이 매우 강경하기에 모든 내용에 공감할 수는 없었다. 하여 개인적인 생각을 첨부하여 담고자 한다
- er로 시작하는 클래스 이름을 사용하지 마세요
- 클래스는 객체의 팩토리임으로 관리자의 역할을 하기 위해 new 연산자 보다는 팩토리 패턴을 사용하자
- handler, reader, converter, validator 와 같은 이름은 연결( connector ) 의 의미를 지니기 때문에 자립적인 객체의 입장을 존중받을 수 없다
무엇을 하는지 가 아닌 무엇인지 에 의미를 두어 클래스 이름을 작성해야 한다
- 개인적인 생각: 무엇을 하는가에 따라 무엇인지 정의 할 수 있는거 아닐까?
- 생성자 하나를 주 생성자로 만드세요
- 적은 수의 메서드와 다양한 생성자를 이용하여 응집도가 높은 클래스를 작성 할 수 있다
- 부 생성자들이 주 생성자를 호출하는 형태로 작성하여 유지보수성을 향상시킬 수 있다
- 개인적인 생각: 다양한 생성자를 가진다는 건 다양한 일을 처리하므로 SRP가 깨진건 아닐까?
- 주 생성자에 처리 코드를 넣지 마세요
- 진정한 객체 지향은 더 작은 객체를 조합하여 큰 객체를 만드는것이다
- 생성자에 처리 코드를 넣는것은 좋지 않다 → 객체로 감싸 나중에 처리한다면 처리를 지연시켜 더 좋은 성능을 얻을 수 있다
- 생성자에서는 저 수준의 객체를 이용하여 처리지연에 도움을 줄 수 있다
- 가능한 적게 캡슐화 하세요
- 하나의 객체에 4개 이하의 프로퍼티를 담도록 노력하세요 → 적은 복잡도의 유지가 됩니다
- 항상 equals 과 hashcode 메서드를 오버라이드 하세요
- 개인적인 생각: 동의하나 현실적으로는 어렵다
- 최소한 뭔가는 캡슐화 하세요
- 캡슐화가 없는 객체가 과연 존재할 수 있는가에 대한 의문
- 유틸리티 클래스, 정적 메서드를 사용하지 마세요
- 개인적인 생각: 그럼 모두가 공용으로 쓰는 함수는 어디에 위치해야 하는가?
- 항상 인터페이스를 사용하세요
- 인터페이스는 계약이고 실제 구현체는 계약을 구현한 각각의 경쟁자들로써 쉽게 대체 가능해야 한다
- 개인적인 생각: 경쟁자가 없는 경우가 존재한다면 이것은 인터페이스로 만들어야 하는가? → 미래는 알 수 없다
- 메서드 이름을 신중하게 선택하세요
- 빌더 ( 새로운 객체를 반환 ) 의 이름은 명사로, 조정자 ( 엔티티를 수정 ) 의 이름은 동사로 지어야 한다
- 객체 자체에서 해결 가능하다는 뜻을 가진 이름을 지으려고 노력하세요 → SRP 원칙을 지키기 쉬워 집니다
- Boolean 값을 반환하는 메서드는 형용사로 지어야 합니다 → ex: empty, readable, negative 등등
- 개인적인 생각: 동의
- 퍼블릭 상수를 사용하지 마세요 → enumeration class로 대체하라
- 어디서나 접근 가능한 상수를 통해 결합도가 높아지고 응집도가 낮아진다
- 상수를 사용하는 곳의 파악이 쉽지 않고, 객체의 사용 용도를 알 수 없게 된다
- 퍼블릭 상수마다 해당하는 의미를 지닌 클래스를 생성해서 사용해야 한다
- 개인적인 생각: 엄청난 챌린지…
- 불변 객체로 만드세요
- 저자는 불변 객체가 언어 차원의 지연 로딩을 지원해야 한다고 생각한다 → 불변 객체의 단점 해결
- 불변 객체에는
식별자 가변성의 문제가 없다
- 실패하는 원자성 목표의 달성이 쉽다
- 시간적 결합이 제거 된다
- 개인적인 생각: 동의한다
- 문서를 작성하는 대신 테스트를 만드세요
- 메인 코드만큼 테스트에도 관심을 기울여야 한다
- 단위 테스트는 클래스의 일부이다
- 개인적인 생각: 동의한다
- 목 객체 대신 페이크 객체를 사용하세요
- 테스트를 더 짧고 간결하게 만든다 → 다만 페이크 객체가 테스트를 올바르게 지원하도록 작성해야 한다
- 목킹은 세부구현에 의존하여 내부 구현을 노출해야하는 필연적인 단점이 있다
- 인터페이스 설계를 더 고민하도록 하여 더 좋은 설계를 만든다
- 개인적인 생각: 테스트 종류마다 목과 페이크를 적절히 써야한다고 생각한다
- 인터페이스를 짧게 유지하고 스마트를 사용하세요
- 인터페이스 안에 스마트 클래스(인터페이스를 지원하는)를 생성해라 → 유틸리티 성격은 이를 통해 지원하자
- 개인적인 생각: 헬퍼, 유틸리티 클래스의 대안이지만 불필요한 인터페이스 양산의 가능성도 있다
- 5개 이하의 퍼블릭 메서드만 노출하세요
- public + protected 메서드의 총 수를 5개 이하로 유지하세요
- private 메서드 수는 관계가 없다
- 개인적인 생각: 이건 말도 안된다. 차라리 총 메서드의 수가 10개라면 모를까, 하나의 클래스에서 5개의 메서드로 수십가지 기능 지원이 가능해 진다
- 정적 메서드를 사용하지 마세요
- 선언형 방식을 이용할 수 없어 직접 성능 최적화를 할 수 없다
- 선언형 방식을 이용하면 결합도가 더 낮은 프로그램을 작성할 수 있다
- 객체지향은 선언형 언어이며
알고리즘과 실행 대신 객체와 행동의 관점에서 사고 해야 한다
- 정적 메서드는 합성이라는 아이디어와 대치되는 개념이라 별로다
- 개인적인 생각: 어떤 객체의 특성에 적합한지 확인하는 경우 그럼 인터페이스의 스마트 클래스를 사용하라는 건가…
- 유틸리티 클래스, 싱글턴 클래스를 생성하지 마세요
- 싱글톤과 유틸리티 클래스는 분리 가능성,의존성을 가진다는 차이점 외에는 둘 다 안티 패턴이다
- 개인적인 생각: 유틸리티 클래스만 동의한다. 객체는 라이프 사이클을 가져야 한다
- 인자의 값에서 NULL을 절대 허용하지 마세요
- 자바에는 포인터가 없기 때문에 역 참조가 필요 없다
- NULL 값은 상대 객체에게 객체를 체크해야 하는 로직을 강요하므로 좋지 않다
- 개인적인 생각: 동의
- 변수는 불변이거나 상수여야 한다
- 객체 세상에서는 동일한 객체가 생긴다는 것은 말이 안된다
- 그러므로 팩토리에서 생성하는 같은 객체는 모두 동일하다고 판단해야 한다
- 상태(state)와 데이터(data)를 구분해라
- 개인적인 생각: 같은 크기의 돈은 동일한 객체가 맞는가? 아닌건가?
- 절대 getter 와 setter를 사용하지 마세요
- 자료구조는 투명하지만 객체는 불투명하다. → get,set은 이를 모두 위반한다
- 개인적인 생각: 동의한다. 그러나 Dto 변환에서는 어떻게 해야하나..