객체지향 생활체조 원칙은 소트웍스 앤솔러지(ThoughtWorks Anthology) 라는 책에 나오는 원칙이다.
목차
- 한 메서드에 오직 한 단계의 들여쓰기(indent)만 한다.
- else 예약어를 사용하지 않는다.
- 모든 원시 값과 문자열을 포장한다.
- 일급 컬렉션을 쓴다.
- 한 줄에 점을 하나만 찍는다.
- 줄여 쓰지 않는다 ( 축약 금지 )
- 모든 엔티티를 작게 유지한다.
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- Getter / Setter / Property를 쓰지 않는다.
모든 엔티티를 작게 유지한다.
이 규칙은 클래스는 50줄 이하로 유지하고, 패키지는 10개 이하의 파일만 가져야한다. 라고 책에서 설명되어있습니다. 가능한가? 싶기도 하지만 잘 생각해보면 '코드가 길어진다는 것은 클래스가 한가지 이상의 일을 하고있을 확률이 높다' 라고도 해석할 수 있을 것같습니다.
그러니 50줄 이하의 클래스, 10개 이하의 패키지에 초점을 맞추기 보단 최대한 엔티티를 작게 유지할 수 있도록 노력하는것이 제가 해석하는 바입니다.
그냥 말로만 하고 넘어가긴 아쉬우니 지금까지 만들었던 StudentList 객체가 규칙을 잘 지키고 있는지 확인해보겠습니다.
public class StudentList {
private final List<Student> students;
public StudentList() {
this.students = new ArrayList<>();
}
public void addStudent(Student student) {
validateStudentsSize();
validateStudentName(student);
students.add(student);
}
public Student getTopScoreStudent() {
Student topStudent = null;
for (Student student : students) {
if (topStudent == null) {
topStudent = student;
continue;
}
topStudent = topStudent.compareScore(student);
}
return topStudent;
}
public List<Student> getStudents() {
return Collections.unmodifiableList(students);
}
public double getAverageAge() {
return students.stream()
.mapToInt(student -> student.getAge().getAge()) // 쉿!
.average()
.orElse(0);
}
private void validateStudentName(Student student) {
String name = student.getName().getName();
for (Student studentFor : students) {
String nameFor = studentFor.getName().getName();
if (name.equals(nameFor)) {
throw new IllegalStudentsException("중복된 이름이 존재합니다.");
}
}
}
private void validateStudentsSize() {
if (students.size() > 10) {
throw new IllegalStudentsException("최대 학생 수는 10명입니다.");
}
}
}
라인을 확인해보니 58줄.. 8줄 오버되고 있네요. 저번편을 보신분들이라면 눈에 거슬리는 메서드가 있을겁니다.
바로 validateStudentName() 메서드입니다. 아.. '코드가 길어진다는 것은 클래스가 한가지 이상의 일을 하고있을 확률이 높다' 이 말이 틀린게 하나 없었네요. 대체 어디까지 보신겁니까....
// 변경 전
private void validateStudentName(Student student) {
String name = student.getName().getName();
for (Student studentFor : students) {
String nameFor = studentFor.getName().getName();
if (name.equals(nameFor)) {
throw new IllegalStudentsException("중복된 이름이 존재합니다.");
}
}
}
// 변경 후
private void validateStudentName(Student student) {
for (Student studentFor : students) {
student.checkDistinctName(studentFor);
}
}
자세한 내용은 5편에서 다뤘기 때문에 생략하도록 하겠습니다.
StudentList의 길이가 58줄에서 52줄로 6줄 줄어들었습니다. 강박적으로 줄이라면 더욱 줄일 수 있겠지만 이 정도만해도 최대한 엔티티를 작게 유지하도록 노력한것이라고 봐도 무방하겠죠?
'Language > 객체지향' 카테고리의 다른 글
객체지향 생활체조 원칙 9. Getter / Setter / Property 를 쓰지 않는다. (0) | 2024.01.21 |
---|---|
객체지향 생활체조 원칙 8. 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. (0) | 2024.01.21 |
객체지향 생활체조 원칙 6. 줄여 쓰지 않는다 (축약 금지) (0) | 2024.01.21 |
객체지향 생활체조 원칙 5. 한 줄에 점을 하나만 찍는다. (0) | 2024.01.21 |
객체지향 생활체조 원칙 4. 일급 컬렉션을 사용한다. (0) | 2024.01.16 |