Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 编程到接口,如何泛型太泛型?_Language Agnostic_Oop_Interface - Fatal编程技术网

Language agnostic 编程到接口,如何泛型太泛型?

Language agnostic 编程到接口,如何泛型太泛型?,language-agnostic,oop,interface,Language Agnostic,Oop,Interface,在返回对象时,我要备份实现层次结构到什么程度 以Java集合接口为例,这是否合适 Collection outerMethod() { return innerMethod(); } List innerMethod() { List list = new ArrayList(); //do something with the list that requires a method in the List interface return list; } 或

在返回对象时,我要备份实现层次结构到什么程度

以Java集合接口为例,这是否合适

Collection outerMethod() {
    return innerMethod();
}

List innerMethod() {
    List list = new ArrayList();
    //do something with the list that requires a method in the List interface
    return list;
}
或者您想使用List作为外部方法的返回

再比如,

List outerMethod() {
    List list = innerMethod();
    //do something with the list that requires a method in the List interface
    return list;
}

Collection innerMethod() {
    return new ArrayList();
}
一个带有参数的示例

void outerMethod() {
    innerMethod((List) innerMethodTwo);
}

void innerMethodOne(List list) {
    //do something with the list
}

Collection innerMethodTwo() {
    return new ArrayList();
}

有人能提供一般性建议吗?

您的退货类型应尽可能具体,以便为您的方法的消费者提供最大的灵活性。本着同样的精神,使任何参数的类型尽可能抽象也是最佳实践,这样方法的使用者也可以更灵活地传递什么类型的参数。

我认为这是一个更通用的版本。我给出的一般建议是,我遵循两条规则:

  • 接受最基本的工作类型
  • 返回用户需要的最丰富类型

我发现,当从类中公开类型时,如何具体化这个问题的答案取决于您对调用方如何与类交互以及代码如何演变的期望和限制。这是一个复杂的平衡过程

例如,如果您希望调用者需要按索引访问元素,您可以返回
列表
,但如果没有,则
集合
可能就足够了。如果要限制调用方只能迭代结果而不能更改它们,则需要返回
Iterable
包装。如果您知道您的内部表示可能会发生变化,那么您可能希望避免返回非常特定的类,如List,这样消费者就可以与您的实现更加解耦

回答这些问题并不容易——没有正确或错误的答案——也没有完美的指导方针。它需要经验、思想和直觉。而且(像我们大多数人一样),你可能会弄错


我要说的是,就我个人而言,我犯了一个错误,那就是在我从代码中暴露的内容上更加严格——特别是当它还不成熟并且还没有被广泛使用的时候。有时,您可以返回并更改公共界面中的返回类型。。。有时您不能。

但这给了您很小的灵活性,无法在以后更改实现。这是一种平衡行为。非常正确——这是一种平衡行为。但是,通过将特定接口指定为返回类型,您至少可以自由地切换实现。Jon,您会提出什么替代方案?或者这是一个取决于没有严格的规则设计选择的情况吗?这些都是很好的点——我唯一的补充就是考虑代码的最终使用。您正在创建公共框架吗?如果需要,您是否能够访问(从而重构)所有方法调用方?预期用途更容易确定您当前是否有消费者,而不是确定(猜测?)未来的灵活性。您如何可能预测您的用户将需要什么?很难预测,但这就是软件工程的全部内容。:-)就是,;根据你的最佳猜测选择一个合理的选择;根据需要调整(迭代)。