これがよくわかるかどうかわかりませんが、たとえば Java の if 文は、単一エントリ/単一出口ステートメントと呼ばれます。その条件が true の場合、これは単一のエントリ ポイントと見なされ、false の場合は単一の出口ポイントと見なされますか?
if(someCondition)
doSomething();
非-(single-entry/single-exit) ステートメントの例は何ですか?
これがよくわかるかどうかわかりませんが、たとえば Java の if 文は、単一エントリ/単一出口ステートメントと呼ばれます。その条件が true の場合、これは単一のエントリ ポイントと見なされ、false の場合は単一の出口ポイントと見なされますか?
if(someCondition)
doSomething();
非-(single-entry/single-exit) ステートメントの例は何ですか?
1 つの出口点方式 (単一出口):
public int stringLength(String s) {
return s.length();
}
2 つの出口点方式:
public int stringLength(String s) {
if(s == null) {
return 0;
}
return s.length();
}
以下は、Martin Fowler の著書Refactoringからの引用です。
メソッドのエントリ ポイントとエグジット ポイントを 1 つだけ持つように教えられたプログラマと一緒に作業しているときに、ネストされた条件付きの置換をガード句で使用することがよくあります。現代の言語では 1 つの入口点が強制されており、1 つの出口点は実際には有用な規則ではありません。明快さが重要な原則です。メソッドが 1 つの出口点でより明確な場合は、1 つの出口点を使用します。そうでなければしないでください。
および上記のステートメントの図で、同じことを行うこれら 2 つのメソッドのコードを比較します。
double getPayAmount() {
double result;
if (_isDead) result = deadAmount();
else {
if (_isSeparated) result = separatedAmount();
else {
if (_isRetired) result = retiredAmount();
else result = normalPayAmount();
};
}
return result;
};
そして、いくつかの出口点があります:
double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};
入れ子になった条件付きコードは、多くの場合、メソッドから 1 つの出口点を持つように教えられたプログラマによって記述されます。これは単純すぎるルールであることがわかりました。メソッドにそれ以上興味がなくなったときは、外に出て興味がないことを示します。読者に空のelseブロックを見るように指示することは、理解の邪魔になるだけです.
おそらく例:
do {
}while()
か何か :
int someMethod() throws Exception {
try {
someInt = someComplexOp();
return someInt;
}
catch(Exception e) {
log.error(e.getMessage(),e);
throw e;
}
}
こちらの記事もご覧ください。
オブジェクト指向、抽象化、カプセル化など、最新の高水準言語で複数のエントリ ポイントを考えるのは困難です。しかし、メソッドからの複数の出口を見るのは簡単です。例えば:
public static int CountCommas(string text)
{
if (String.IsNullOrEmpty(text))
{
return 0;
}
if (text.Length == 0)
{
return 0;
}
int index = 0;
int result = 0;
while (index > 0)
{
index = text.IndexOf(',', index);
if (index > 0)
{
result++;
}
}
return result;
}