- Document 클래스의 속성은 제목 (title), 작성자 (wirter), 키워드 목록 (keywords), 요약(abstraction), 원본 링크 (original link), 파일 형식 (format), 버전 파일 목록 (files) 등입니다.
- 작성자 정보는 이름, 이메일 주소, 홈페이지 등의 복합된 속성을 지녀야 하기 하기 때문에 별개의 클래스로 분리하였습니다. 또한, 한명의 작성자가 여러 문서를 작성하는 일대다(1:n) 관계이기 때문에 분리하는 것이 타당합니다.
- 키워드는 복수의 명사 단어로 구성되며, 중복된 단어가 입력되어서는 안되기 때문에 Set<String> 타입을 선언합니다. 자료 구조 중에서 Set 타입은 포함된 데이터들의 중복을 허용하지 않는 특성을 가진다는 점을 활용하는 것입니다.
- 파일 형식은 enum 타입을 사용했으나, 향후에 refactoring 가능성이 있습니다.
- 하나의 문서가 여려 가지 버전으로 존재할 수 있고, 동일한 파일이 여러 위치에 존재할 수 있습니다. 버전을 고려했을 때 순서(order)가 중요하므로 List 타입을 사용했습니다.
package docar.archive.document;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import docar.user.Writer;
/**
* '문서' 클래스.
*
* @author "Sunny Kwak"
*/
public class Document {
private String title;
private Writer writer;
private Set<String> keywords;
private String abstraction;
private URL originalLink;
private Format format;
private List<File> files;
public Document(String title, Writer writer, Set<String> keywords,
String abstraction, URL originalLink, Format format) {
if (title == null || title.isEmpty()) {
throw new IllegalArgumentException("title argument is missing");
}
if (writer == null) {
throw new IllegalArgumentException("writer argument is missing");
}
if (originalLink == null) {
throw new IllegalArgumentException(
"originalLink argument is missing");
}
if (format == null) {
throw new IllegalArgumentException("format argument is missing");
}
this.title = title;
this.writer = writer;
this.keywords = keywords;
this.abstraction = abstraction;
this.originalLink = originalLink;
this.format = format;
files = new ArrayList<File>();
}