2011-05-04 4 views
6

에 나는 존경하는 동료와 흥미로운 토론을 haiving 그리고 난 내 응용 프로그램에서 몇 가지 기본적인 의사 결정 테이블 로직을 구현해야 ...는 기본 자바 솔루션 의사 결정 표

을 몇 가지 추가 입력을하고 싶습니다. Excel 스프레드 시트에서 의사 결정 데이터를 나타내는 OpenL Tablets를 사용하려고했습니다. 나는 그것을 좋아하고, 설치 및 유지 보수가 쉽고 메모리와 프로세싱 공간이 적다. 새 테이블을 쉽게 추가 할 수 있으며 100 개 이상의 행과 10 개의 조건이있는 테이블이 있습니다. 이 데이터는 매우 정적이며 거의 변경되지 않습니다.

제 동료는 제 3 자 API를 믹스에 도입하고 싶지 않고 Microsoft 파일 형식에 묶여 있음에 대해 예약했습니다.

나는 자바를 통해 의사 결정 테이블을 구현하는 방법을 볼 수있는 유일한 방법은 일련의 추악한 if 또는 case 문을 코딩하는 것인데, 이는 작은 테이블에서는 문제가되지 않지만 관리 테이블에 도달하면 관리하기 어려워진다. 큰 테이블.

누구나 인수에 대한 의견이 있습니다. 누구든지 네이티브 Java에서 내 문제를 해결할 수있는 패턴에 대한 의견이 있으면 듣고 싶습니다.

시간을 내 주셔서 감사합니다.

답변

8

음, 완전히 순진 시도 :

public interface Condition<Type T> { 
    public boolean process(T object); 
} 

ArrayList row = new ArrayList<Condition>(10); 
row.add(new Condition<YourObject>() { 
       public boolean process(YourObject obj) { 
         if (obj.property > 0) return true; 
         else return false; 
       }); 
row.add(new Condition<YourObject>() { 
       public boolean process(YourObject obj) { 
         if (obj.property2 == 100) return true; 
         else return false; 
       }); 

이 그럼 당신은 반복 것 :

for (Condition<YourObject> cond : row) { 
    if (! cond.process(yourobj)) break; 
} 

약간 더 복잡한 예를 들어 당신이 당신의 의사 결정 테이블을 작성할 수 있습니다 자바 스크립트에서 훨씬 더 간결하게, 그리고 아마도 Beanshell을 사용하여 논리를 실행하십시오. 나는 당신에게 예제를 게시하기 전에 이것에 약간의 껍질과 강타를해야 할 것입니다.

예를 게시 한 사용자가 원하는대로 간단한 스칼라 루틴을 만들 수 있습니다. 편집

:

그래서 좀 연구와 생각을했고,으로 Beanshell 위해 그렇게 같은 것을 사용할 수 있습니다

import bsh.Interpreter; 

Interpreter i = new Interpreter(); // Construct an interpreter 
YourObject yourObject = new YourObject(); 
i.set("myObject", yourObject); 

// Source an external script file 
i.source("somefile.bsh"); 

을 그리고 somefile.bsh은 다음과 같습니다

var rules = new Array(); 
rules.push(function(var) { 
      if (var.getProperty() == 0) return true; 
      else return false; 
      }); 
rules.push(function(var) { 
      if (var.getProperty() < 1000) return true; 
      else return false; 
      }); 
... more rules ... 

for (var func in rules) { 
    if (!func(myObject)) break; 
} 

이렇게하면 Java 소스를 다시 컴파일하는 것보다 규칙을 변경할 수있는 유연성이 향상됩니다.

당신은 100 원 "행"

+1

와우, 감사합니다. Chris. 나는 이것으로 무언가를 할 수 있다고 생각한다. 나는 그것을 소용돌이 치게 할 것이다. – Elwood

4

1) 앱이 고성능을 필요로하는 경우, 순진하게 접근 방식은 곧 큰 테이블에 느린 될 것를 얻기 위해 이러한 솔루션 중 하나에 다른 배열을 추가해야합니다. 예를 들어 OpenL Tablets는 대부분의 경우 의사 결정 테이블을 인덱싱하여 모든 테이블 크기에 대해 일정한 성능을 제공합니다.

2) 당신은 순진한 접근 방식의 상단에 구축하기 시작하면, 당신은 당신이 조건의 다른 유형,

3) OpenL 태블릿을 사용하면 다음을 할 수 있습니다 다양한 유형 등에 대한 데이터 파서를 구현해야 것을 볼 수 있습니다 모든 Java 가능 플랫폼에서 .xls 파일을 사용하십시오. 단지 저장 형식 일 뿐이며 라이브러리 자체는 순수 Java입니다.마지막으로 Excel 파일은 전체 유니버스에서 가장 쉽게 변환/내보내기/가져온 파일 형식 중 하나입니다.

4) xls 및 xlsx 파일을 구문 분석하기위한 최신 Apache POI 라이브러리로 전환하여 OpenL Tablets 런타임 종속성 크기가 최근 커졌습니다. 현대 표준에 의해 여전히 겸손합니다.

+1

많은 감사. 나는 내 동료를 이겼다는 사실을보고 기뻐했다. 위의 사항에 대한 설명과 제품 데모가 트릭을 만들었습니다. 나는 바퀴를 다시 발명하는 열렬한 팬이 아니며 openL 정제는 내가 필요로하는 것을 완벽하게 수행한다. – Elwood

0

MS Excel은 Excel 파일을 만들 수있는 유일한 소프트웨어가 아니며 Star/Open/LibreOffice에서도 편집 할 수 있습니다. 결정 테이블 LTable처럼 간단하고, 호환성 문제가 없어야합니다.

기타 잘 알고있는 도구는 의사 결정 테이블에 Excel을 사용합니다 (JBoss Drools에서 읽음).