2012-06-03 2 views
1

표준 행/열 유형 출력에서 ​​불일치 데이터를 어셈블하는 시스템을 설계하고 있습니다.불일치 데이터를 조립하기위한 디자인 패턴?

각 열 수 :

  • 독립 시스템에 존재한다.
  • 페이지 매김이 가능합니다.
  • 정렬 가능.
  • 각 열은 수백만 개의 행을 포함 할 수 있습니다.

그리고 시스템 :

  • 다른 열 확장 때문에 다른 테이블을 출력 할 수 있어야합니다.
  • 최종 도메인 개체가 알려져 있습니다 (행).
  • 키는 모든 시스템에서 동일합니다.

현재 구현 계획은 열당 두 개의 클래스 (또는 두 개의 인터페이스를 구현하는 하나의 클래스 열)를 디자인하는 것입니다. 인터페이스는 다음과 같습니다.

  1. 페이지 매김 및 정렬을 구현합니다.

아이디어는 테이블 생성자는 현재 정렬 열 및 페이지에 대한 정보를받을 것입니다 "차압"구현합니다. 그런 다음 테이블에 대한 적절한 키 목록을 리턴합니다. 이 정보는 각 열 정보가 순차적으로 추가 될 수 있도록 각 열 "garnishing"구현에 차례로 전달되는 도메인 객체 행의 목록을 만드는 데 사용됩니다.

내 질문은 - 어떤 디자인 패턴을 권장 할 것인가 - 또는 다른 디자인 결정을 사람들이 공용 키와 변수 열을 사용하여 불일치 데이터를 어셈블하는 데 사용할 것이라고 생각합니다.

+0

이 불일치 데이터가 무엇인지 조금 더 구체적으로 알려주시겠습니까? 어쩌면 각각의 "시스템"에서 하나씩 두 가지 예를 들어 보겠습니다. – Hassan

+0

패턴은 시스템과 독립적이어야합니다. 모든 시스템에서 작동하는 공통 키를 가지고 있으며 궁극적으로 데이터를 링크하는 데 사용되는 시스템이 어떤 시스템인지는 중요하지 않습니다. –

+0

"각 열에 수백만 개의 행이 포함될 수 있습니다"라고 말하면 데이터가 이러한 "열"개체에 포함된다는 의미입니까? – Hassan

답변

0

당신이하려는 일을 완전히 이해했는지는 확실치 않지만, 수집 한 것부터 나중에 구조화 된 테이블을 만들 수있는 방법으로 임의의 데이터 행을 저장하려고합니다. . 당신은 Column를 구현하여 열을 만들 수있는, 그런

public interface Column { 
    String value; 
} 

: 내가이 경우 (자바를 사용하는 가정)에서하는 것은 단지 "값"속성을 것이다 매우 간단한 Column 인터페이스를 만드는 것입니다

그 객체는 실제 데이터를 포함하는 것
public class Key implements Column { 
    String value = new String(); 

    public Key(String keyValue){ 
     this.value = keyValue; 
    } 
} 

그래서 당신은 DataRow라는 클래스를 만들 수 있습니다 (또는 당신이 원하는대로). 당신이 볼 수 있듯이

public class DataRow { 

    List<Column> data = new ArrayList<Column>(); 

    public DataRow(String key){ 
     this.setColumn(new Key(key)); 
    } 

    public void setColumn(Column columnData) { 
     this.data.add(columnData); 
    } 

    public Column getColumn(Class column){ 
     for(Column c : this.data){ 
      if(c.getClass().equals(column)){ 
       return c; 
      } 
     } 
     return null; 
    } 

} 

, 당신은 그에게 새로운 Column 객체를 제공하여 방법 setColumn()를 호출 할 수 있습니다 : 예를 들어, 데이터를 추가 할 것이라고 클래스의 메소드를 가질 수있다. 이렇게하면 임의 유형의 데이터를 DataRow 개체에 추가 할 수 있습니다.

public List<DataRow> createTable(List<DataRow> data, List<Class<? extends Column>> columns){ 
    List<DataRow> table = new ArrayList<DataRow>(); 
    for(DataRow row : data){ 
     DataRow ret = new DataRow(row.getColumn(Key.class).value); 
     for(Class column : columns){ 
      if(row.getColumn(column.getClass()) != null)ret.setColumn(row.getColumn(column.getClass())); 
     } 
     table.add(ret); 
    } 
    return table; 
} 

이 허용됩니다 : 그럼, 일부 테이블을 만들기 위해, 당신은 지정된 행의 데이터가있는 경우에만 개체를 ​​반환 할 것 DataRowsList, 및 클래스의 List를받는 함수를 가질 수있다 데이터를 사용하여 테이블을 만들고 테이블에 포함 할 열을 만들 수 있습니다.

아이디어를 전달하기 위해이 코드를 작성했는데, 지금은 꽤 지저분합니다. 그러나 이것이 약간의 방법으로 도움이되기를 바랍니다.

+0

매우 유연하다는 점에서이 점이 좋습니다. 그러나 그 데이터의 구성을 다루지는 않습니다. 패턴이 페이지 매김을위한 열을 선택하고 어떤 키가 반환되는지를 상상해 봅니다. 그런 다음 데이터로 데코레이션하기 위해 다른 열로 전달됩니다. 마지막 구문을 다음과 같이 상상해보십시오. 새 AccountTableBuilder(). 페이지 매기기 (ScoreColumn) .garnish (주소 열) .garnish (JobTitleColumn) .garnish (OpenIdColumn); –

+0

그런 식으로 할 수도 있습니다. 대체 디자인을 요청한 이래로이 디자인을 제안했습니다. 제가이 방법으로 쓴 이유는 그것이 다소 더 단순하다고 믿기 때문입니다. 데이터의 생성에 관해서는, 위의 코드의 프로덕션 품질 버전이 존재한다면, 새로운'DataRow' 객체를 만들고 그것을 원하는만큼 여러 번'setColumn()'을 호출함으로써 데이터를 생성 할 수 있습니다. 그게 당신이 의미 한 것입니까? – Hassan