해적 코드와 마찬가지로 SRP는 규칙보다 지침이 아니며, 특히 잘 표현 된 것은 아닙니다. 대부분의 개발자는 Martin Fowler ( Refactoring )와 Robert Martin ( Clean Code ) 의 재정의를 받아 들여 클래스가 한 가지 책임이 아닌 변경해야 할 이유가 하나만 있어야한다고 제안합니다 .
좋은 견실 한 (말장난을 용서하는) 가이드 라인이지만, 그것을 무시하는 것처럼 끊는 것은 거의 위험합니다.
태그에 게시물을 추가 할 수 있고 그 반대의 경우에도 단일 책임 원칙을 위반하지 않았습니다. 객체의 구조가 변경되면 여전히 둘 다 변경해야 할 이유가 하나 있습니다. 하나의 구조를 변경해도 다른 구조가 추가되는 방식은 변경되지 않으므로 새 "책임"을 추가하지 않습니다.
최종 결정은 실제로 프론트 엔드에 필요한 기능에 의해 결정되어야합니다. 어떤 시점에서 게시물에 태그를 추가해야 할 수도 있으므로 다음과 같이하십시오.
// C-style-language pseudo-code
class Post {
string _title;
string _content;
Date _date;
List<Tag> _tags;
Post(string title, string content) {
_title = title;
_content = content;
_date = Now;
_tags = new List<Tag>();
}
Tag[] getTags() {
return _tags.toArray();
}
void addTag(Tag tag) {
if (_tags.contains(tag)) {
throw "Cannot add tag twice";
}
_tags.Add(tag);
tag.referencePost(this);
}
// more stuff here, obviously
}
class Tag {
string _name;
List<Post> _posts;
Tag(string name) {
_name = name;
}
Post[] getPosts() {
return _posts.toArray();
}
void referencePost(Post post) {
if (!post.getTags().contains(this) || _posts.contains(post)) {
throw "Only reference a post by calling Post.addTag()";
}
_posts.Add(post);
}
// more stuff here too
}
나중에 태그에 게시물을 추가해야하는 경우 Tag 클래스에 addPost 메소드를 추가하고 Post 클래스에 referenceTag 메소드를 추가하십시오. 분명히 addPost에서 addTag를 호출하고 addTag에서 addPost를 호출하여 실수로 스택 오버플로가 발생하지 않도록 이름을 다르게 지정했습니다.