我必须编写一个函数来从链表中删除一个元素(我的,而不是集合框架的元素),所以这是我的第一次尝试:
public void remove(E element) {
Cell<E> cell = sentinel;
int i = 0;
while (i < count) {
if (cell.getElement().equals(element)) {
cell.getPrevious().setNext(cell.getNext());
--count;
return;
}
++i;
cell = cell.getNext();
}
}
我的问题是:使用return
这样好吗?
更一般地说,当检查条件并且没有指示运行以下指令时,我使用return
是有意义的:
void func() {
while (condition) {
if (something) {
instructions;
return;
}
more instructions;
}
}
但是因为它不是很易读,而且每个人都说可读性是java的优先考虑,所以我不得不考虑另一种方法。所以我改变了条件并使用了一个额外的布尔值。
public void remove(E element) {
boolean found = false;
Cell<E> cell = sentinel;
int i = 0;
while (!found && i < count) {
if (cell.getElement().equals(element))
found = true;
else {
++i;
cell = cell.getNext();
}
}
if (found) {
cell.getPrevious().setNext(cell.getNext());
--count;
}
}
通过这种方式,没有奇怪的return
,并且仅在必须执行时才执行指令。如果我再次遇到这种情况,我想我将不得不重新编写这样的循环。
也许我完全错了,第一种方法更好。你觉得怎么样?
答案 0 :(得分:5)
在我看来,如果不是太复杂的话,早点返回是完全没问题的。类似于使用break语句提前摆脱循环。
你可以在程序员看一下这个问题,他们每个都提出有效的观点。 https://softwareengineering.stackexchange.com/questions/18454/should-i-return-from-a-function-early-or-use-an-if-statement
答案 1 :(得分:1)
功能中的单独逻辑,有些只读取,有些只改变状态。如果你有一个find-something函数,很清楚在搜索过程中返回
例如
public void remove(E element) {
Cell<E> cell = FindCell(element);
if (cell != null)
RemoveCell(cell);
}
private <E> FindCell(E element) {
<E> cell = sentinel;
int i = 0;
while (i < count) {
if (cell.getElement().equals(element)) {
return cell;
}
++i;
cell = cell.getNext();
}
return null;
}
private void RemoveCell(<E> cell) {
cell.getPrevious().setNext(cell.getNext());
--count;
}
这种分离给你一些好处。您可以根据需要多次调用只读函数(可能是并行线程),您肯定知道没有任何反应。例如,C ++具有const函数
当你需要打破两个或多个嵌套循环时,返回非常方便
答案 2 :(得分:0)
这完全是一个选择问题,他们提出的任何一种方法都没有错,只需记住两件事。
如果您不想在该特定方法的循环外执行其余代码并返回给调用者,则可以使用返回。
当你不想执行时,可以使用布尔
true or false
循环,但你仍然想继续其余的代码 那种方法。