2013-10-28 3 views
2

JCL을 생성하는 데 Java를 사용하고 있습니다. 데이터 정의 문을 추가하는 네 가지 방법이 있습니다. 하나는 char, 하나는 문자열, 하나는 array (Strings)를 받아 들인다. 그리고 다른 하나는 두 번째 매개 변수에 아무 것도 없다.(자바) 오버로딩 : 얼마나 많은가?

public void addDD (String label, char classChar) //Generates: SYSIN DD SYSOUT=[classChar] 
public void addDD (String label, String dataset) //Generates: SYSIN DD DSN=[dataset] 
public void addDD (String label) //Generates: SYSIN DD DUMMY 
public void addDD (String label, String datasets[]) //Generates: SYSIN DD * 
                // DSN=[datasets[0]], 
                // DSN=[datasets[1]] 

이러한 메서드는 다른 매개 변수 유형을 받아들이지 않습니다. 유형에 따라 전체 메소드가 변경됩니다. 문자열 인 경우 "DSN ="이 필요합니다. char 인 경우 "SYSOUT ="이 필요합니다. 동시에 클라이언트가 이러한 각 시나리오에 대해 다른 메소드 이름을 사용하는 것에 대해 걱정하지 않기를 바랍니다.

현재 디자인이 좋지 않다고 생각합니까?

+0

빌더 패턴에 대한 정보 http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html – Prateek

+0

입력 해 주셔서 감사합니다. 빌더 패턴은 확실히 좋은 생각 일 것입니다.하지만 슬프게도 이것은 이미 하나의 일부이며 너무 혼란 스러울 수 있습니다. –

+1

별도의 DD 클래스 및 빌더가 유용 할 수 있습니다. 당신은 간단한 경우를 위해 아주 기본적인 addDD를 유지할 수 있지만 더 복잡한 것을 위해 addDD (DDdef ddDef)를 추가하십시오. DD 형식에는 많은 변형이 있습니다. 현재 메서드를 사용하는 많은 메서드가 필요합니다. –

답변

0

이러한 결정은 항상 부분적으로 맛이 있습니다.

이 특별한 경우에는 실제로 뭔가 다른 것을 수행하기 때문에 메서드 이름을 변경하려고합니다. 이런 식의 오버로드 메서드는 대부분 편의상 사용할 수 있습니다. char 또는 String variant를 사용하면 char이 문자열로 변환되고 효과가 동일 함을 의미합니다. 이는 예제에 해당하지 않습니다.

(올바른 방법을 찾기 위해 리플렉션을 사용하여) 이렇게하는 다른 이유가있을 수 있지만,이 경우 메소드가 실제로 혼동을 피하기 위해 설명하는 명확한 Javadoc을 작성하는 것이 좋습니다.

0

당신이하고있는 일은 꽤 위험합니다. addDD(String, char)의 호출자에게 javadocs를 읽고 그 대신 addDD(String, String)을 사용해서는 안됩니다.

옵션 1 : 메소드의 이름을 변경 : addDDSysout()addDDDsn()

옵션 2 : 단지 하나의 방법으로 모든 구현 : 당신이 할 수있는

addDD(String label, String... args) 

및 확인 매우 확인 arg에 문자열 없음, 단일 문자열, 다중 문자열, 단일 문자 등

0

나는 이런 것들이 종종 맛의 문제라고 동의해야합니다. 그러나 다른 응답자가 JCL DD 서술문의 중요성을 이해하는지 확신 할 수 없습니다. 나는 그 문제의 영역에 따라 그들과 의견이 맞지 않기 때문입니다.

나는 당신의 디자인을 좋아한다. 나는 다른 방법 이름을 막을 것이다. 그것은 기본적으로 TSO가 FILE (xxx) 대 DSN (xxx)을 수행 한 것이고 나는 항상 그것을 좋아하지 않습니다. 메소드가 입력 판독기 스트림에서 다른 "결과"를 생성하는 동안 이러한 차이는 JCL의 구문에 의해 강제됩니다. 더 구체적이지 않으려면 다른 작업을 수행하십시오. 근본적으로 배치 작업에 대한 데이터 소스/싱크를 선언하고 있습니다. 사용자가이를 수행하는 데 4 가지 방법을 배우게하지 마십시오.

0

모든 DD 문 구조를 처리하는 데 필요한 메소드 서명 수는 이 될 수 있습니다.

public void addDD (String label, String datasets[]) 

생성하는 :

예를 들어, 나는 방법은 너무 확실하지 않다

//SYSIN DD * 
// DSN=[datasets[0]], 
// DSN=[datasets[1]]... 

는 아주 잘 작동하는 것입니다의 DD *이 따르지 인라인 데이터를 표시하고, 그 추가 데이터 집합 (있는 경우)을 연결하기 전에 을 /*으로 종료해야합니다.

//SYSIN DD 
// DSN=[datasets[0]], 
// DSN=[datasets[1]]... 

서명의 어떤 종류의 당신은 인라인 데이터 세트를 생성하는 데 사용하는 다음과 같이 아마 DD 문 간단한 시리즈를 생성해야 위의 방법은? 아마 같은 일 :

public void addDD (String label, String inlinedata[]) 

가 생성 : - 작동하지 않습니다

//SYSIN DD * 
inlinedata[0] 
inlinedata[1]... 
/* 

그러나 두 방법은 동일한 서명을해야합니다. 서명 충돌을 피하려면 복수 메서드를 사용하는 것이 좋습니다. 또는 오버로드 된 단일 메서드를 계속 사용하는 경우 늪에 너무 깊이 들어가기 전에 가능한 모든 DD 이름 구조가 있는지 확인하십시오.

어느 쪽이든, 이것은 최종 사용자가 (JCL은 스크립트 언어의 실제 개가 될 수 있음)을 이해할 수 있도록 상당한 양의 문서화가 필요합니다.