단일 책임 원칙이란?
모든 클래스는 `하나의 책임`만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다.
클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다. (위키백과)
즉, 단일 책임 원칙은 클래스가 단 하나의 관심사에 집중해야 한다라는 것입니다. 단일 관심사에 집중하는 클래스는
유지보수하기 쉽고, 오류를 찾기가 용이합니다.
단일 책임 원칙을 지키지 않은 예시
//사용자 도메인은 사용자 정보를 저장, 변경의 책임이 있지만, 이메일의 유효성을 검사하거나 이메일을 전송하는 책임을 가질 필요는 없습니다.
public class User {
private static Pattern EMAIL =
Pattern.compile("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$");
private Long id;
private String name;
private String email;
public User(Long id, String name, String email) {
validateEmail(email);
this.id = id;
this.name = name;
this.email = email;
}
private void validateEmail(String email) {
if(!EMAIL.matcher(email).matches()) {
throw new IllegalArgumentException("이메일 형식이 아닙니다.");
}
}
public void sendMail() {
System.out.println("send Mail by" + email);
}
}
객체가 하나의 관심사를 갖도록 분리한다
public class User {
private Long id;
private String name;
private Email email;
public User(Long id, String name, Email email) {
this.id = id;
this.name = name;
this.email = email;
}
}
public class Email {
private final String email;
public Email(String email) {
validateEmail(email);
this.email = email;
}
private void validateEmail(String email) {
if (!EmailString.isValidEmailString(email)) {
throw new IllegalArgumentException("이메일 형식이 아닙니다.");
}
}
public void sendMail() {
System.out.println("send Mail by" + email);
}
}
public class EmailString {
private static final Pattern EMAIL = Pattern.compile("^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$");
private EmailString() {
}
public static boolean isValidEmailString(String emailString) {
return EMAIL.matcher(emailString).matches();
}
}
정리
- 단일 책임 원칙은 클래스가 하나의 관심사에 집중하게 한다.
- 단일 책임 원칙은 객체의 응집력을 높일 수 있다.
'객체지향설계 5원칙(S.O.L.I.D)' 카테고리의 다른 글
I. 인터페이스 분리 원칙(Interface Segregation Principle) (0) | 2022.01.21 |
---|---|
L.리스코프 치환 원칙(Liskov substitution principle) (0) | 2022.01.10 |
O. 개방-폐쇄 원칙(Open-Closed Principle) (0) | 2022.01.10 |