2

我正在使用 Java 生成 JCL。我有四种添加数据定义语句的方法。一个接受一个字符,一个接受一个字符串,一个接受一个数组(字符串),另一个没有第二个参数。

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=”。同时,我不希望客户端担心为这些场景中的每一个使用不同的方法名称。

我目前的设计被认为是不好的做法还是好的?

4

4 回答 4

0

您正在做的事情非常危险-您指望调用者addDD(String, char)阅读 javadocs 并找出他不应该使用它addDD(String, String)

选项1:重命名方法:addDDSysout()addDDDsn()

选项 2:只用一个方法实现所有这些:

addDD(String label, String... args)

确保您可以处理抛出的任何内容 - args 中没有字符串、单个字符串、多个字符串、单个字符等。

于 2013-10-28T19:49:05.537 回答
0

这些决定总是部分出于个人喜好。

在这种特殊情况下,我宁愿更改方法名称,因为它们确实做了不同的事情。大多数情况下,像这样的重载方法只是为了方便:拥有 char 或 String 变体主要意味着 char 将被转换为字符串并且效果将是相同的,而在您的示例中并非如此。

像您这样做可能还有其他原因(使用反射来找到正确的方法),但在这种情况下,我建议编写清晰的 Javadoc 来描述这些方法实际上可以避免混淆。

于 2013-10-28T19:39:48.043 回答
0

覆盖所有 DD 语句构造所需的方法签名数量可能会变得非常混乱。

例如,我不太确定该方法:

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

生成:

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

会很好地工作,DD *指示要遵循的内联数据,并且需要/*在连接其他数据集(如果有)之前用 a 终止。上面的方法大概应该会生成一系列简单的 DD 语句,如下所示:

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

您将使用哪种签名来生成内联数据集?可能是同一件事:

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

生成:

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

但是这两种方法都有相同的签名——那是行不通的。您最好使用多种方法来避免签名冲突。或者,如果您继续使用重载的单一方法,那么请确保在深入沼泽之前已涵盖所有可能的 DD 名称构造。

无论哪种方式,最终用户都需要大量文档才能理解(JCL 可以成为脚本语言的真正狗)。

于 2013-10-31T16:43:51.227 回答
0

我不得不同意,这些事情往往是一个品味问题。但我不确定其他响应者是否理解 JCL DD 声明的重要性。因为根据您的问题领域,我不同意他们的观点。

我喜欢你的设计。我不鼓励使用不同的方法名称。这基本上就是 TSO 对 FILE(xxx) vs DSN(xxx) 所做的,我一直讨厌它。虽然您的方法在输入阅读器流中产生不同的“结果”,但这些差异是由 JCL 的语法所强制的。更具体地说,他们没有做不同的事情。从根本上说,您正在为批处理作业声明数据源/接收器。不要让您的用户学习 4 种不同的方法来做到这一点。

于 2013-10-28T20:53:47.387 回答