0

문서 생성기를 구현하려고합니다. 나는 Open-Closed Principle을 따르라고 주장한다.중첩 추상화 및 폐가 원칙

  • 여러 문서 유형 (즉, 계약, 위임장)
  • 여러 문서 형식이있을 것이다있을 것이다 (즉, XML, JSON, HTML, PDF)
  • 각각 다음과 같이 요구 사항은 문서 형식은 문서에 다른 데이터 집합이 있어야합니다 (예 : 클라이언트 세부 정보, 전체 권한)

다음과 같은 개방형 원칙을 선택했기 때문에 switch 문을 사용하지 않는 것이 좋습니다. 즉, 특정 유형의 문서 및 형식 유형에 대한 추상화 및 구현을 소개해야합니다.

m x n 클래스 구현을 제공해야합니까? 여기서 m은 문서 유형의 수이고 n은 문서 형식의 수입니까? 나는 이것이 잘못된 방법이라고 생각한다. 이런 문서 생성기를 올바르게 설계하는 방법에 대한 힌트를 주시겠습니까?

+0

나는 언제나 어떤 원칙을 항상 존중한다고 생각하지 않습니다. O/C 또는 다른 지침에 초점을 맞춰서는 안됩니다. 도메인을 이해하고 이에 기초하여 디자인해야합니다. 가치 객체와 적절한 집계가 핵심입니다. – MikeSW

+0

"적절한 집계"란 무엇을 의미합니까? 몇 가지 예를 들어 주시겠습니까? – Dawid

+1

적절한 집계는 도메인에서 볼 수있는 각 문서 모델을 올바르게 식별해야 함을 의미합니다. 기본적으로 각 문서의 각 세부 사항을 고유 한 제약 조건 및 규칙으로 이해해야합니다. 코드, OOP, SOLID 등과 아무런 관련이 없습니다. 도메인에 대한 생각과 접근 방식, 즉이 특정 주제에 대해 도메인 전문가가되어야한다는 점을 이해해야합니다.도메인 자체의 언어를 사용하여 도메인처럼 생각하십시오. 시력에 클래스, 기능 등. – MikeSW

답변

0

각 형식의 동작이 완전히 다르므로 공용 인터페이스 (예 : 'IFormatter')를 구현하여 각기 다른 클래스를 만드는 것이 좋습니다. 문서 포맷터를 호출해야하는 클라이언트 클래스에 'IFormatter'인터페이스를 삽입 할 수 있습니다. 다른 방법으로 객체 생성의 책임을 수행 할 수 있습니다. 하나는 간단한 공장 방법이 될 것입니다 (개인적으로 저는 공장 방식의 큰 팬이 아닙니다). 또 다른 방법은 책임의 사슬입니다. 일치하는 개체가 발견되면 개체 생성을 연결하여 해당 개체를 만들 수 있습니다.

클라이언트 클래스를 작성한 후에는 다시 수정할 필요가 없습니다. 문서를 다른 형식으로 포맷하려면 'IFormatter'인터페이스를 구현하여 새 클래스를 만드는 것만 큼 쉽습니다. 모든 문서 유형이 각 유형에 대해 하나 개의 클래스를 만들고, 적어도 하나 개의 다른 개념을 사용하여 서로 다른 비즈니스 제약이있는 경우

0

내가 당신에게 몇 가지 힌트

  • 을 줄 것이다. DRY에 대해 땀을 내지 마십시오. 유일한 재사용은 문서의 각 세부 사항을 캡슐화하는 데 사용되는 값 객체이어야합니다.
  • Html, PDf 등은 가져 오기/내보내기 형식입니다. 고작, 실제 문서와 관련된 메타 데이터. 형식

이 약 switch ... 오히려 이상한 제약이 내용 :이 중요하면이 개 속성이 FormattedContent 같은 값 객체를 가질 수 있습니다. 그러나 스위치 대신 사전을 사용할 수 있습니다! 그리고 아마 초록 공장.