다 대다 관계를 관리하기위한 디자인 패턴이 있습니까?


10

이 데이터 패턴을 정의하는 데 문제가 있습니다. 여러 응용 프로그램에서 작업했습니다.

다음으로 구성됩니다.

  1. 많은 객체 자체로 구성된 객체 유형
  2. 두 번째 객체 유형으로, 각 인스턴스에는 첫 번째 객체가 '많이 있습니다'
  3. 또한, 제 1 객체의 각 서브 객체는 제 2 객체 유형에 대한 각 연관마다 수정 가능하다.

간단한 예는 다음과 같습니다.

  1. 일련의 수업으로 구성된 프로그래밍 과정
  2. 수업은 정해진 과제로 구성됩니다.
  3. 코스는 학생에게 할당 될 수 있습니다.
  4. 그러나 코스가 학생에게 배정되면 각 수업 및 / 또는 과제는 원래 코스를 인식 할 수없는 지점까지 제거 및 추가와 함께 해당 학생에 맞게 사용자 정의 할 수 있습니다.

내 솔루션에서 결과는 다음과 같습니다.

코스를 학생에게 배정하면 코스가 메모리에로드됩니다. 그런 다음 각 하위 개체에 대해 적절한 메타 데이터를 사용하여 학생 / 하위 개체 관계 개체가 생성됩니다. 기본적으로 원본 객체를 템플릿으로 사용하여 필요한 사용자 정의 객체를 생성합니다.

하위 오브젝트가 더 복잡하고 번호가 지정됨에 따라 엄청난 양의 데이터가 생성됩니다. 이 데이터 패턴을 조작하는 데 필요한 논리 / 복잡성의 양을 줄이기위한 최적화 또는 패턴이 있는지 궁금합니다.


2
"데이터 양을 줄이겠습니까?" 필요한 동작을 구현하기 위해 작성해야하는 "사소한 코드와 논리의 양을 줄이는"방법을 찾고 있습니까? (데이터를 지속적으로 관리하려면 데이터베이스와 유사한 관계형 데이터 구조가 필요하다는 것을
알았습니다

@rwong 네, "사소한 코드와 논리의 양을 줄이는 것"이 ​​나의 최종 목표입니다. 나에게 이것은 어떤 식 으로든 데이터 복잡성을 줄이는 것을 의미하지만 반드시 그럴 필요는 없습니다. 데이터를 관리하는 간단한 방법이 있는지 궁금해하는 일반적인 데이터 패턴이되었습니다.
니콜라스 피커링

1
원칙적으로 이것은 m : n 관계의 향상된 버전입니다. »복잡한 개체 관계를 관리하는 방법«과 같은 제목은 어떻습니까?
토마스 정크

1
엄청난 양의 데이터는 데이터의 복잡한 수준과 다릅니다. 건물을 관리하는 데 어려움이있을 경우 볼륨보다 복잡성이 커질 수 있습니다.
Walter Mitty

1
흥미 롭군 이 패턴을 가진 여러 응용 프로그램에서 작업했지만 그 패턴을 발견 한 적이 없습니다. 또한 이러한 종류의 데이터를 관리하는 간단한 방법을 알고 싶습니다.
Jules

답변:


6

(1) 공통 알고리즘을 따르는 고유 한 인스턴스가 많은 경우, (2) 유사한 객체가 많거나 런타임에 객체를 생성하는 경우, (3) 실행하는 동안 객체의 동작을 동적으로 수정하려고합니다. 참고 : 필요한 경우 여기에서 언급 한 모든 패턴을 결합 할 수 있습니다.

  1. 각 "두 번째 객체 유형"이 고유하지만 유사한 동작 패턴을 따르는 경우 템플릿 패턴을 사용할 수 있습니다 . 당신이하고있는 것처럼 들립니다. 그러나이를 명확하게하기 위해 추상 기본 클래스에는 일반 알고리즘이 프로그래밍되어 있습니다. 이 알고리즘의 특정 단계는 파생 클래스에서 구현됩니다.

  2. 많은 객체를 만들거나 런타임에 객체를 만드는 것이 중요하다면 팩토리 패턴을 사용할 수 있습니다 .

  3. 그리고 동작을 동적으로 변경하려면 Stategy Pattern 이 작동 할 수 있습니다. 예를 들어, 정규 커리큘럼의 학생이 특별한 도움이 필요하거나 빠른 프로그램에 참여하기로 결정한 경우. 이것은 커리큘럼의 기본 클래스를 나타내는 객체의 "학생"을 구성함으로써 작동합니다. 커리큘럼은 학생 구성시 파생 커리큘럼에 할당되며 (이상하게 들립니다) 나중에 다른 파생 커리큘럼에 다시 할당 될 수 있습니다.

참고로 C ++에서 (3) 전략 패턴을 사용하는 경우 컴포지션을 위해 Rvalues를 사용해야합니다.

객체와 두 번째 객체를 저장하려면 반복자 패턴을 고려할 필요가 있습니다 (순환, 추가, 삭제, 정렬 등).

좋은 언급은 Head First Design Patterns 인데, 여기에는 내가 언급 한 패턴과 해당 구현이 포함됩니다. 그들은 자바에서 작동합니다.


0

데이터 저장소 또는 지속성이있는 경우 런타임의 특정 시점에 이러한 종류의 깊이를 가진 객체가 필요하다고 생각하기가 어렵습니다. CRUD GUI 용입니까? 그렇다면 시작부터 접근 방식을 변경하는 것이 좋습니다. IE :

쇼 학생에 필요한 하부 구조를 확인하고, 상태 저장 DB를에 그 기원 인덱스 등을 저장하고, statelessly 또는 뷰와 백엔드 DB에서가는 것을 업데이트합니다.


나는 당신의 제안을 이해하지 못합니다. 빈 하위 객체를 생성 한 다음 사용자가 하위 객체를 수정할 수있는 다른 양식으로 강제 실행해야합니까?
Nicholas Pickering

콘텐츠와 백엔드 데이터베이스 간의 상태 비 저장 트랜잭션 만 수행하면 객체 자체의 성능이 크게 향상되지 않는 것이 좋습니다. 이 경우,이를 제거하고 클라이언트가 직면 한 특정 데이터에 대한 트랜잭션을 수행하십시오.
John P. Feltz

편집 : 이것은 ORS에 편의가있어 ORM에 편향되어있는 경우 거래되는 특정 데이터를 캡처하기 위해 객체를 생성하는 것을 의미 할 수도 있습니다.
John P. Feltz

내가 오해하지 않는 한, 프로세스에 관한 어떤 것도 무국적자가 될 수 있다고 생각하지 않습니다. 그것은 모두 사용자 행동의 맥락에 달려 있습니다. 사용자가 기본 개체를 만들면 하위 구조를 즉시 수정할 수 있어야합니다.
Nicholas Pickering

-1

원래의 과정을 인식 할 수없는 수준까지 각 학생을위한 맞춤형 과정은 원래 과정이 단순히“기본”참조임을 나타냅니다. 내가 할 일은 CustomizedCourse (또는 그 목록)라는 클래스를 만들고 학생의 재산으로 그 (또는 그 목록)를 갖는 것입니다. CustomizedCourse는 "참조"사용에 대한 원래 과정을 참조 할 수 있지만 주요 작업 및 데이터는 CustomizedCourse 자체에 있습니다.


downvoter 관심이 있으십니까?
frezq

나는 공감하지 않았지만 (나는 OP 다), 이미 다른 답변에서 설명 된 템플릿 또는 전략 패턴을 설명하려고하는 것 같습니다.
니콜라스 피커링
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.