メソッド内に複数のリターンを持つことは本質的に間違っていることではありません。ほとんどの再帰関数はmulipleリターンを持つことになります。
public String flattenTree(Node currentNode, String stringSoFar) {
// do our work on this node
stringSoFar = stringSoFar + currentNode.getName();
// end condition- if we've got no children left we're done so leave now
if (currentNode.countChildren() ==0) {
return stringSoFar;
}
// recursive condition- keep digging through the children of our current node
for (int i=0; i<currentNode.countChildren(); i++) {
stringSoFar = stringSoFar + flattenTree(currentNode.getChild(i));
}
return stringSoFar;
}
がきれいに見え、あなたがはっきりあなたの終了条件をマークすることができます...私はかなりあなたが再帰を行うことを教えられたように見えるように構築されていますという理由だけで、このアプローチのようにバック学校で...
単一のリターンにそれを圧縮すると間違って何もない:間違いなくより良い
public String flattenTree(Node currentNode, String stringSoFar) {
// do our work on this node
stringSoFar = stringSoFar + currentNode.getName();
// loop through children if neccessary
for (int i=0; i<currentNode.countChildren(); i++) {
stringSoFar = stringSoFar + flattenTree(currentNode.getChild(i));
}
return stringSoFar;
}
より少ないコード、間違いなく、あまり目立たない、あなたのエンドケースはどこにあるのか...
パフォーマンス面では、パフォーマンスが他のものよりも優れているとは言えませんが、性能が重視されるコードで作業しない限り、少なくともこの仮説的な例では、読みやすくするために複数のリターンを選択することをお勧めします。
これは、必要なネスティングのレベルを低下させる傾向があります。私は同意する、それは通常より読みやすい。 –
これは、コードの構造を難読化する犠牲を払って入れ子のレベルを減らします。そうではありませんが、コードを読みやすくすることはできませんが、読みやすく表示されるようになりますが、それはうそです。 – JeremyP
@JeremyP:私はそれがかなり逆であると言いたいと思います。コードを通るパスをはっきりと見せます。なぜなら、あなたが戻ってくるのを見て、何が起こったのか知っているからです。ちょうど関連する何かをやり直す場合に備えて、残りのメソッド*を読む必要はありません。私は両方のスタイルでコードを扱ってきました。そして、 "ワン・リターン・ポイント"のマントラは可読性のためにひどい*です。 –