문제

속성이 다른 항목 목록이있는 일반적인 응용 프로그램 유형을 상상해보십시오. 예를 들어 100 개의 항목이있는 나무 뷰, 각각 이름, ㅏ 평가, ㅏ 랭킹-이시기에는-곡물에 든-플랜 넷이 있습니다 등. 아마도 아마도 많은 관계가있을 것입니다 항목 그리고 항목-카탈로그, 또는 그 사이 항목 그리고 아이템 제작자

이제이 응용 프로그램에는 자연스럽게 필터링 시스템이 필요합니다. 예 : 다른 관계의 데이터간에 모든 종류의 여러 조건을 갖춘 복잡한 필터를 구성 할 수있는 곳.

이러한 필터링 기능을 작성하는 설계 작업은 많은 개발자가 수행 한 작업이 있어야하며 작업에 가장 적합한 일종의 디자인 패턴이 있어야합니다.

누구나?

편집하다: 커뮤니티 위키로 전환했습니다. 질문이 너무 일반적으로 공식화되었습니다.

도움이 되었습니까?

해결책

실제로 당신이 원하는 것을 지적하는 것은 약간 어렵 기 때문에 내 자신의 가정을 취할 것입니다.

  1. 필터링 후 기본 컬렉션은 변경되지 않아야합니다
  2. 결과는 지속되지 않습니다

고전적인 접근 방식은 사용입니다 견해. 이것은 기본적으로입니다 게으른 프로그래밍, 원래 컬렉션에 액세스 할 수있는 객체를 만들고 필터를 적용 할 필터를 알고 있지만 아무것도 필요하지 않은 한 계산을 만들지 않습니다.

컬렉션에서는 뷰가 종종 구현됩니다 반복자, 그리고 필터링을 위해, 물론 이미 지적한 전략 패턴.

예를 들어:

Collection myCollection;
Predicate myFilter;

// Nothing is computed here
View<Predicate> myView(myCollection, myFilter);

// We iterate until we find the first item in the collection that satisfies
// the Predicate, and no more, to initialize `begin`
View<Predicate>::Iterator begin = myView.begin(), end = myView.end();

순 이점은 10 개의 첫 번째 항목 만 필요하다면 먼저 10 개를 찾기 위해 필요한만큼의 술어 만 적용 할 수 있다는 것입니다.

또한 관련 요소의 사본이 없으며 수정하더라도 귀하의 견해가 업데이트됩니다. myCollection, 이는 반복자의 유효성에 영향을 줄 수 있지만 (평소와 같이).

문제는 (캐싱을 구현하지 않는 한) 결과가 매번 계산된다는 것입니다.

더 지속적인 결과를 원한다면 필터링 된 항목 (또는 참조) 만 포함 된 새로운 컬렉션을 만드는 것이 좋습니다. 여기에는 '필터링 된'목록을 사용하는 방법에 따라 일반적인 패턴이 없습니다.

제안 된 전략 패턴의 경우 일반적으로 복합 패턴을 사용하여 블록별로 필터를 빌드 한 다음 전략으로 구축 된 객체를 전달할 수 있습니다.

복합 패턴은 특히 구문 분석 된 표현의 결과를 나타내는 데 특히 적합합니다. 예를 들어, 아이디어를 얻기 위해 표현식 나무를 살펴볼 수 있습니다.

다른 팁

디자인 패턴에 대해 잘 모르겠지만 정렬을 위해 만들어진 접근 방식 중 일부를 볼 수 있으며, 일부 설명을 설명하고 왜 예를 들어 마음에 들지 않는지에 도움이 될 것입니다. .

예를 들어, LINQ는 표현 나무를 사용하여 분류하는 좋은 방법이 있습니다.

또한 기능적 언어로 수행 된 정렬을 볼 수 있습니다. 여기서 기능을 전달하여 특정 종류의 특정 종류를 하드 코딩하는 대신 정렬을 수행 할 수 있습니다.

JavaScript와 같은 작업을 수행 한 경우 정렬 함수가 즉석에서 생성 될 수 있습니다.

나는 좋아한다 술어로 필터Google 컬렉션 그리고 그것을 사용할 수 없다면 매우 비슷한 것을 구현할 것입니다. 확인하고 싶을 수도 있습니다 이 답변 구현 예제에 대한 유사한 질문에. 구현은 Java에 있지만 패턴을 볼 수 있습니다.

SQL을 사용할 수있는 관계형 데이터베이스를 찾고 있습니다. 당신은 전체를 서서 응용 프로그램에서 연결하거나 전체 데이터베이스와 직선 개체 사이에서 무언가를 할 수 있습니다. 예를 들어 Java에서는 hsqldb / javadb와 같은 메모리 내 데이터베이스를 사용하여 그 특징을 사용할 수 있습니다. 당신은 또한 사용할 수 있습니다 JOSQL 데이터베이스없이 객체에서 직접 SQL로 작동 할 수 있습니다.

또는 직접 프로그래밍하려면 데이터 사본 2 부를 유지하는 것으로 시작합니다. 하나는 전체 데이터 세트이고, 다른 하나는 필터링 후 데이터를 보는 것입니다. 그런 다음 데이터를 정렬하고 정렬 된 목록에 위치를 유지하여 각 열에 대한 데이터에 대한 색인을 만듭니다. 동일한 설정이 필터 일치에 대해 작동합니다. 무언가가 열의 필터와 일치하는 경우, 그렇지 않은 경우 1 또는 0을 제공하십시오. 그런 다음 누군가 정렬 순서를 전환하면 전체 목록에서 데이터를 뷰 목록으로 복사하거나 필터 정보를 변경하면 일치하는 데이터 만 가져갑니다.

이러한 관계가 RDF 및 올빼미로 표현할 수있는 경우 SPARQL 엔드 포인트 (예 : Jena) 또는 Pellet과 같은 이유가있는 도구를 사용할 수 있습니다. 그러나 자세한 내용이 없으면 이것이 최선의 접근법이라는 것이 확실하지 않습니다.

있는지 확인하십시오 http://en.wikipedia.org/wiki/criteria_pattern 당신을 도울 수 있습니다. 사양 패턴을 기반으로합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top