2012-07-05 69 views
0

给定一个IP地址范围(a.b.c.d - a.b.c.e)我想要一个方法来返回范围内数组列表中的IP地址。哪种方法签名好,为什么?

选项1:

public static int getIPAddressesFromRange(String rangeStr, List list) ; 

返回值是count,并输入列表将与IP的范围列表来填充具有

选项2:

public static List getIPAddressesFromRange(String rangeStr) 

返回值是IP地址列表'

我的选择是2,但这是直觉,但不能支持我的论点。

编辑:有没有任何设计原则的选项1违反?

+2

尝试编写调用代码。这应该引导你选择2。 – assylias 2012-07-05 09:03:13

+0

没关系设计原则 - 选项1强加了一个功能限制,*由于语言的性质而无法修复*,因此即使在您考虑设计之前,您也会遇到正确性问题。 – 2012-07-05 09:20:31

回答

2

偏好的选项2选项1

列表中包含反正它的数量,所以没有必要返回两个值(计数和列表)。

另外,既然您知道列表的类型,您可以使用泛型:List<String>

最后,您也可以考虑采用两个参数:范围的开始和结束。

1

选项二可能更好,因为任何读者都清楚该方法返回的是什么。
方法1可能会导致未来的编码人员花时间思考这个参数是什么(除非它被正确记录),而方法2则是直截了当的。

方案二也使得它更整洁,如果你以后需要遍历检索列表上,不需要临时变量:

for (Object o : getIPAddressesFromRange(String rangeStr)) { ... } 

你也应该更喜欢使用generic typeList<>,而不是原始类型。

5

我想说

public static List<String> getIPAddressesFromRange(String rangeStr) 

如果你决定要代表IP地址为字符串。

理由反对#1:

  • 呼叫者需要构建名单提前
  • ,除非你将其记录下来
  • 它不是简单的返回值是什么方法变异它的一个参数,这是一般禁止的,但最好避免让你的API的用户感到意外(特别是如果他们倾向于不阅读文档)
  • 意外地传递一个null值的列表参数将导致在NullPointerException中。
  • 如果你真的关心它,你总是可以从列表中获得列表的长度。
+1

此外,即使该方法是防御性编写的,也不可能在函数调用中将空列表变为非空列表,因此第一个选项实际上具有第二个选项潜在功能的子集。更糟糕的是,这完全是由设计强加的,而不是由问题领域造成的。 – 2012-07-05 09:18:39

+0

@PlatinumAzure:+1伟大的补充,谢谢。 – 2012-07-05 10:19:37

0

你的直觉也是我的,最好让getIPAddressesFromRange使用它的首选List实现,并避免有人给你一个已经填充的列表。

1

东西,东西了。这就是你的选项2所做的。

选项1改变其输入参数并返回冗余值(可以从列表中获得)。

另一件事是,也许一系列的IP地址将被一些其他类型比字符串更好地描述。

0

我的意见是,第二个方法签名通常是最好的一个,因为第一个方法将公开您的列表对象并发修改。因此,在你的方法结束时,它可能容纳比预期更少,更多的其他对象。

1

IMO方法签名表明它将从范围在此范围内返回的IP地址的列表,而不是有多少地址,所以我也很为选项2

1

我觉得第二个的为佳:

  • 计数是列表的大小
  • 你不必给一个列表功能
  • 减空指针异常风险
2

为什么你想在第一种方法返回计数?您可以从列表本身获取IP的数量。

第二种方法应首选一个

0

这取决于你是否要填写预先创建的列表,或创建新的。

例如:您可以使用同一个List对象对您的函数进行多次调用以节省一些内存。

或者:要比较多个列表,您可能需要为每个调用返回一个新列表。

我会选择去2.

2

你的第二个选择是最好的,因为第一个选项有两个问题:

  1. 这是多余的。如果返回List,则可以使用其size()方法计算该值,因此您可以通过返回计数来获得任何结果。
  2. 该列表必须经过验证,并且在某些情况下,该方法彻底无法执行其工作。如果调用者传递null,那么如果代码没有被仔细写入,则存在引发NullPointerException的危险。同样在这种情况下,重新分配参数以指向新列表将不会被调用者观察到,所以您唯一的远程理智选项是抛出明确的异常。使用第二个选项,您可以完全控制列表,直到它返回给调用者。