2015. 3. 11. 17:54
  • 파일 클래스의 역할(role)은 문서의 바이너리 형식 데이터(binary formatted data)를 표현(묘사)하는 것이다.
    표현(represent) 한다는 용어를 사용한 이유는 파일 객체는 물리적인 파일 그 자체가 아니기 때문이다. 달리 말해 파일 객체는 물리적 파일의 제한적인 특성만을 담고 있는 것이다.

  • 파일(file) 클래스는 문서(document) 객체에 포함되는 객체이다. (has-a relationship)
    객체는 상태(state)와 행위(behavior)로 구성된다. 따라서, 파일 클래스를 설계하기 위해 필요한 상태와 행위들을 정의한다.

  • 파일 클래스에 포함되어야 하는 '상태(state)' 혹은 속성(property)들은 다음과 같다.
    • 위치(location) : 물리적인 저장 매체(storage media) 내에서 실제 파일 데이터가 존재하는 주소(address). 주소 체계(addressing scheme)는 별도의 설계가 필요하다.
    • 크기 (size) : 바이너리 데이터의 길이, 64 bit 정수로 표현해야 함.
    • 체크섬 (check sum) : 바이너리 파일의 지문(finger print), 파일의 중복 검사에 이용된다. DocAr 내에서 동일한 내용을 가진 파일이 중복해서 존재하는 것을 막기 위해 모든 파일에 대한 디지털 지문을 생성하고, 새로운 파일 등록을 수행할 때마다 이미 등록되어 있는 파일들의 디지털 지문과 대조하여 이미 존재하는 파일인지 검사하고, 중복을 방지한다.
    • 버전 정보 (version info) :문서 내에서 파일 내용이 여러 번 변경되었을 경우, 현재 파일의 변경된 순서(혹은 순번), 최초 등록된 파일은 1번을 부여받는다. 또한 버전 정보에는 해당 버전에 대한 변경 일자와 간단한 설명(comment)이 포함될 수 있다.

  • 파일 클래스에 포함되어야 하는 '행위(behavior)' 혹은 메소드(method)들은 다음과 같다.
    • 파일 인스턴스를 생성하는 생성자(constructor)
    • 속성값을 반환하는 getter 메소드들 (location, size, checksum, version)

  •  '객체의 정의'를 적용하기(applying definition of object : self-contained entity)

    • 객체는 데이터와 데이터를 조작하는 프로시져로 구성된 필요한 모든 것을 자체적으로 담고 있는 독립체이다. 
      an object is a self-contained entity that consists of both data and procedures to manipulate the data.
      좋은 객체(혹은 잘 설계된 객체)는 자기 자신을 초기화하고, 데이터를 조작하기 위해서 외부의 도움(혹은 조작)을 필요로 하지 않아야 한다. 객체를 사용(혹은 호출)하는 프로그램이나 프로그래머는 특정 객체를 사용할 때, 다른 클래스를 사용하지 않고도 해당 객체를 제어할 수 있어야 한다는 말이다. (현실적으로 완벽히 지키기 어렵다. 설계자가 지향해야 하는 자세라고 생각하는 것이 타당하다.)

    • 파일 객체가 '바이너리 데이터'를 표현 한다는 것은 바이너리 데이터를 사용(조작)하는 관점에서 필요한 정보와 기능을 모두 제공해야 한다는 말이다. 파일 객체를 생성하는 수단 (엄밀히 말하자면 생성 시 외부에서 주어진 데이터를 이용해 스스로를 초기화하는)으로 생성자 메소드, 그리고 파일에 대한 각종 속성 정보를 조회할 수 있는 메소드와 바이너리 데이터를 제공하는 메소드를 선언한다.

  • 객체의 행위에 대한 설계 리뷰(review)

    • 파일 객체를 변경(수정)하는 메소드가 필요한가? DocAr 내에서 파일 객체는 물리적인 바이너리 데이터라는 실체에 대한 그림자이지, 그 자체를 나타내는 것이 아니다. 실체(물리적 파일)이 변경될 경우, 새로운 파일 객체를 생성해야 하며, 내용이 변경된 파일은 다른 버전의 파일이 된다. 따라서, setter 메소드는 선언하지 않는다. (설계자의 사상 혹은 의도를 반영하는 것이기에 모든 데이터를 다루는 객체가 변경 메소드를 제공하지 않는다고 이해해서는 안된다.) 달리 설명하자면, DocAr의 File 인스턴스는 읽기 전용(read-only) 인스턴스라고 말할 수 있다.

    • 파일 객체를 삭제하는 메소드가 필요한가? JDK에서 제공하는 java.io.File 클래스는 delete 메소드를 제공한다. 그렇다면, DocAr의 File 클래스 또한 delete() 메소드를 제공해야 하는가? 얼핏 보기에 그럴듯 하지만, DocAr의 File 인스턴스는 Document 인스턴스에 종속되어 있다. Document 내에 서로 다른 버전의 파일 객체가 존재할 수 있으며, Document 인스턴스는 하나 이상의 File 인스턴스를 소유해야 한다. 즉, File 인스턴스와 File에 연결된 물리적인 파일이 삭제될 경우, Document 인스턴스의 상태가 변경되거나, Document 인스턴스가 함께 삭제되어야 한다. 삭제 행위를 File 클래스와 Document 클래스 양쪽에 두는 것보다 Document 클래스에서만 제공하는 것이 구현의 복잡도를 낮출 수 있으며, File과 Document를 이용해 코딩하는 사용자(개발자)에게 보다 단순한 관점(view)을 제공한다.




Posted by 곽중선