2013-10-28 36 views
2

我正在使用Java來生成JCL。我有四種添加數據定義語句的方法。一個接受一個字符,一個字符串,一個數組(字符串),另一個對第二個參數沒有任何作用。(Java)重載:多少太多?

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 =」。如果是字符,則需要「SYSOUT =」。同時,我不希望客戶擔心爲每種情況使用不同的方法名稱。

是我目前的設計中考慮不好的做法還是不錯的?

+0

閱讀關於生成器模式http://www.javacodegeeks.com/2013/01/the-builder-pattern-in-practice.html – Prateek

+0

感謝您的意見。建設者模式肯定會是一個好主意,但遺憾的是,這已經是其中的一部分,而且可能會讓人感到非常困惑。 –

+1

單獨的DD Class&Builder可能是明智的;你可以爲簡單的情況保留非常基本的addDD,但爲更復雜的情況添加addDD(DDdef ddDef)。 DD的變化很多,您需要使用當前方法的很多方法。 –

回答

0

這些決定總是部分是品味的問題。

在這種特殊情況下,我寧願改變方法的名字,因爲他們真的做不同的事情。大多數情況下,像這樣重載方法只是方便的:擁有char或String變體大多意味着char將被轉換爲字符串,並且效果將相同,在您的示例中不是這種情況。

有可能是其他原因這樣做,你沒有(使用反射來找到正確的方法)一樣,但在這種情況下,我會建議寫說明這些方法實際上做,以避免混亂明確的Javadoc。

0

你在做什麼是相當危險的 - 你指望addDD(String, char)的調用者閱讀javadocs並找出他不應該使用addDD(String, String)來代替。

選項1:重命名方法:addDDSysout()addDDDsn()

1選項:實現所有這些只是一個單一的方法:

addDD(String label, String... args) 

,並非常肯定可以處理任何東西 - 在參數中沒有字符串,單個字符串,多個字符串,單個字符等。

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 *指示內聯數據可循,那需要 在連接其他數據集(如果有)之前以/*終止。以上方法 也許應該產生一系列簡單的DD語句如下:

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

你會用什麼樣的簽名生成數據集內聯?可能是相同的 的事情:

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

產生:

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

但是這兩種方法具有相同的簽名 - 這是行不通的。您最好使用多個 方法來避免簽名衝突。或者,如果繼續使用重載的單一方法,那麼確保在深入沼澤之前覆蓋所有可能的DD名稱結構。無論採用哪種方式,這都需要大量的文檔給最終用戶使其具有 的意義(JCL可以成爲腳本語言的真正使用者)。