0

给定一个 IP 地址范围(abcd - abce),我想要一种方法来返回该范围之间的数组列表中的 IP 地址。

选项1 :

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

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

选项 2:

public static List getIPAddressesFromRange(String rangeStr)

返回值是IP地址列表'

我的选项是 2,但那是直觉,虽然不能支持我的论点。

编辑:选项1是否违反任何设计原则?

4

11 回答 11

5

我会说

public static List<String> getIPAddressesFromRange(String rangeStr)

如果您决定将 IP 地址表示为字符串。

反对#1的论点:

  • 调用者需要提前构造列表
  • 除非您记录它,否则返回值是什么并不直截了当
  • 该方法改变了它的一个参数,这通常不是被禁止的,但最好避免让你的 API 用户感到惊讶(特别是如果他们倾向于不阅读文档)
  • 意外为列表参数传入null值将导致 NullPointerException。
  • 如果您真的关心它,您总是可以从列表本身获取列表的长度。
于 2012-07-05T09:02:58.473 回答
2

为什么要在第一种方法中返回计数?您可以从 List 本身获取 IP 的数量。

第二种方法应该是首选

于 2012-07-05T09:04:27.667 回答
2

比选项 1 更喜欢选项 2。

该列表无论如何都包含其计数,因此无需返回两个值(计数和列表)。

此外,由于您知道列表的类型,因此可以使用泛型List<String>

最后,您还可以考虑采用两个参数:范围的开头和结尾。

于 2012-07-05T09:02:35.653 回答
2

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

  1. 这是多余的。如果 aList返回,您可以使用它的size()方法来获取该计数,因此通过返回该计数您将一无所获。
  2. 该列表必须经过验证,在某些情况下,该方法完全无法执行其工作。NullPointerException如果调用者传递 null,如果代码编写不仔细,就有被抛出的危险。同样在这种情况下,调用者不会观察到重新分配参数以指向新列表,因此您唯一的远程理智选择是抛出一个明确的异常。使用第二个选项,您可以完全控制列表,直到它返回给调用者。
于 2012-07-05T09:08:17.040 回答
1

我认为第二个更好:

  • 计数是列表的大小
  • 您不必为函数提供列表
  • 减少空指针异常风险
于 2012-07-05T09:04:17.353 回答
1

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

如果您以后需要在检索到的列表上进行迭代,选项二也使它更整洁,不需要临时变量:

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

您还应该更喜欢使用泛型类型 List<>而不是原始类型。

于 2012-07-05T09:02:45.367 回答
1

塞进去,塞出来。这就是您的选项 2 所做的。

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

另一件事是,也许某个 IP 地址范围可以用其他类型而不是字符串来更好地描述。

于 2012-07-05T09:03:26.370 回答
1

IMO方法签名表明它将返回范围内的IP地址列表,而不是该范围内有多少地址,因此我也支持选项2。

于 2012-07-05T09:03:54.343 回答
0

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

于 2012-07-05T09:03:18.963 回答
0

我的观点是,第二种方法签名通常是最好的,因为第一种方法会将您的列表对象暴露给并发修改。因此,在您的方法结束时,它可能包含比预期更少、更多的其他对象。

于 2012-07-05T09:03:30.187 回答
0

这取决于您是要填充预先创建的列表还是创建新列表。

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

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

我会选择选项 2。

于 2012-07-05T09:08:00.987 回答