2011-12-07 1 views
1

이 질문은 주관적 일 수 있습니다. 그것이 여기에 속하는지 잘 모르겠다. Programmers임의의 논리를 기반으로 개체를 범주로 축소

데이터 유형이 X (관계형 데이터베이스로 구성된 비즈니스 객체라고 생각 함)이라고합니다. 내 최종 목표는 보고서의 테이블에이 유형의 많은 인스턴스를 나타내는 것으로, 각 인스턴스는 몇 가지 다른 제목 중 하나에 있습니다.

임의 익숙 할 것이다 기업의 소프트웨어 개발을 끝낼 사람 관리에서 전해지는 논리에 따라 선택 아래에있는 객체 표시하는 제목 :

예 :

If the instance has a FooID of 6 and a BarFactor of < 0.5, place it under the "Borked" heading.

또는

If the Weight is > 0, and the CreatedDate is before Midnight but after 3PM, and today is not the 3rd Wednesday of the month, the object should be categorised as "Fluffy".

내 질문은 :입니다 X의 인스턴스를 가져 와서 잠재적으로 두통을 유발하는 양의 논리를 인스턴스의 상태에 적용하고 해당 논리의 결과에서 범주/문자열/임의의 값을 얻는 일반적인 관용구입니까?


내 생각은 지금까지왔다 :

  1. X을 취하고 String을 반환하는 함수입니다. 나는 이것을 Megamoth으로 쉽게 볼 수 있었고, 요구 사항을 유지하기위한 b *****가 끊임없이 수정되었다.

  2. Heading 추상 형식, 그리고 나에게 제대로 오버로드 ToString 방법 Heading의 인스턴스를 제공하는 팩토리 함수를 정의합니다. 나는이 기술이 아이디어 no와 동일한 이슈에 의해 괴롭혀 질 것이라고 생각한다. 1.

  3. 우리가 올바른 표제에 도착할 때까지 각각 문제를 조금 더 분열시키는 기능의 계층 구조. 예를 들어

: 우리가 값에 도달 할 때까지

public String GetHeading(X x) 
{ 
    if (x.Weight > 0) 
     return WeightGreaterThanZero(x); 
    else if (x.Weight < 0) 
     return WeightLessThanZero(x); 
    else 
     return WeightIsZero(x); 
} 

세 가지 "무게"기능 추가 조건을 테스트 할 것입니다. 여기에서 볼 수있는 문제는 어떤 함수가 어느 함수인지를 추적해야한다는 것입니다. FooIDIs6 함수는 WeightIsZero 또는 다른 함수에 의해 호출되었는지 여부를 알아야합니다. 그렇지 않으면 앞의 결정에 잠재적으로 의미가 없습니다. 우리는 WeightIsGreaterThanZero_FooIDIs6_GrandmotherIsOlderThan100 등으로 끝납니다.

답변

1

나는 이것이 당신이 성취하고자하는 것에 완전히 적용되지는 않지만 이런 유형의 "재미"를 만날 때마다 우리는 비즈니스 사용자를 제공하게됩니다. 사용자 인터페이스를 사용하여 규칙을 정의한 다음 규칙을 특정 객체에 적용하기에 충분한 코드를 작성하십시오.

예를 들어, 우리의 응용 프로그램 중 하나에서 사용자는 true로 평가 될 때 사용자 정의 출력을 생성하는 조건 집합을 지정할 수 있습니다.

이렇게하려면 IF 문의 각 부분에 대해 하나의 레코드를 데이터베이스에 저장합니다. 각 레코드는 클래스의 속성 이름, 비교 작업 (<, =, <> 등), 비교 값, 그룹이 시작하거나 종료하는지 여부 (예 : 괄호) 및 현재 명령문이 결합되는 방식을 지정합니다 다음으로 (AND 또는 OR).

그래서 당신은 주어진 기록이 일치하는 항목이 여러 개있는 경우, 그것이하는 사용자의 책임은 적절한 통해 최고의 경기를 결정하기 때문에

Heading Record (Parent record, which defines the heading to be used) 
    Heading Selector (Child records which define the if statement) 

우리는 또한 부모 레코드에 사용자 정의 우선 순위를 지원할 수있는 것 우선 순위 적용.

런타임에 사용자가 입력 한 조건을 평가하는 명령문을 작성하기 만하면됩니다. 리플렉션을 사용하여 속성 이름을 하드 코딩 할 필요가 없습니다.

또한 SQL에서 선택 로직을 수행하는 것이 더 적절한 경우 동일한 구성 코드를 사용하여 SQL 문을 생성 할 수 있습니다.

우리는이 메커니즘을 광범위하게 사용해 왔으며 고객의 빈번하고 다양한 요구 사항을 충족시키는 데 매우 강력한 방법이라고 생각했습니다.

+0

그래, 일반적으로 그들이 갈 방법입니다. 불행히도 이번에는 옵션이 아닙니다. – Anthony

+0

@ anthony-arnold : 자신의 용도로이 구성을 앱에 설치할 수 있습니까? 데이터베이스에 조건을 포함 할 필요는 없습니다. 예를 들어, 응용 프로그램과 함께 제공되는 xml 파일에 조건을 저장할 수 있습니다. –

+0

제안 해 주셔서 감사합니다. 나는 그 해결책의 절반을 구현했다. 구성은 XML 파일에 저장되며, 우리는이를 유지 관리 할 것입니다. 의사 결정 논리를 하드 코딩하는 것보다 읽기 쉽습니다. 우리가 시간을 받으면 우리는 그것을 관리하기위한 양식을 던질 것입니다. – Anthony

0

X를 허용하고 해당 X에 대해 올바른 범주인지 여부를 나타내는 범주 클래스 집합은 무엇입니까? 뭔가 같은 :

var categories = new Category[] { new FooCategory(), new BarCategory(), new FluffyCategory() }; 

foreach(var x in myListOfXs) { 
    var cat = categories.FirstOrDefault(c => c.Matches(x)); 
    if(cat != null) { 
    x.Category = cat.Name; 
    } 
}