객체지향 생활체조 원칙은 소트웍스 앤솔러지(ThoughtWorks Anthology) 라는 책에 나오는 원칙이다.
목차
- 한 메서드에 오직 한 단계의 들여쓰기(indent)만 한다.
- else 예약어를 사용하지 않는다.
- 모든 원시 값과 문자열을 포장한다.
- 일급 컬렉션을 쓴다.
- 한 줄에 점을 하나만 찍는다.
- 줄여 쓰지 않는다 ( 축약 금지 )
- 모든 엔티티를 작게 유지한다.
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- Getter / Setter / Property를 쓰지 않는다.
모든 원시 값과 문자열을 포장한다.
쉽게말해 int, String 과 같은 타입의 값을 객체로 포장하는겁니다.
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
Student 객체에는 이름과 나이를 가지고 있습니다.
만약 이름은 최소 2자 이상, 나이는 20세 이상 이라는 조건이 추가된다면?
public class Student {
private String name;
private int age;
public Student(String name, int age) {
validName(name);
validAge(age);
this.name = name;
this.age = age;
}
private void validName(String name) {
if (name.length() < 2) {
throw new IllegalStudentNameException("이름은 최소 2자 이상이어야 합니다.");
}
}
private void validAge(int age) {
if (age < 20) {
throw new IllegalStudentAgeException("나이는 20살 이상이어야 합니다.");
}
}
}
잘못된 값의 검증을 제외한 일반적인 예외처리를 했음에도 Student가 할 일이 엄청 늘어났습니다.
Student는 이제 이름과 나이에 대한 상태관리를 모두 해야합니다.
그럼 만약 Student에 이메일, 성별 등 변수가 추가된다면 코드는 복잡해질것입니다.
이제 원시 타입 변수로 포장해보겠습니다.
public class Student {
private Name name;
private Age age;
public Student(Name name, Age age) {
this.name = name;
this.age = age;
}
}
public class Name {
private String name;
public Name(String name) {
validName(name);
this.name = name;
}
private void validName(String name) {
if (name.length() < 2) {
throw new IllegalStudentNameException("이름은 최소 2자 이상이어야 합니다.");
}
}
}
public class Age {
private int age;
public Age(int age) {
validAge(age);
this.age = age;
}
private void validAge(int age) {
if (age < 20) {
throw new IllegalStudentAgeException("나이는 20살 이상이어야 합니다.");
}
}
}
이제 Student에서 이름과 나이에 대한 책임이 분리 되면서 단일 책임 원칙(SRP)도 지키게 되었습니다.
'Language > 객체지향' 카테고리의 다른 글
객체지향 생활체조 원칙 6. 줄여 쓰지 않는다 (축약 금지) (0) | 2024.01.21 |
---|---|
객체지향 생활체조 원칙 5. 한 줄에 점을 하나만 찍는다. (0) | 2024.01.21 |
객체지향 생활체조 원칙 4. 일급 컬렉션을 사용한다. (0) | 2024.01.16 |
객체지향 생활체조 원칙 2. else 예약어를 사용하지 않는다. (0) | 2024.01.02 |
객체지향 생활체조 원칙 1. 한 메서드에 오직 한 단계의 들여쓰기(indent)만 한다. (0) | 2024.01.02 |