歴史的背景:ダイクストラは、構造化プログラミング(、、、など)の代わりに多くのプログラマーが使用した1968年にGotoThoughdHarmfulを書いたことを覚えておく必要があります。 goto
if
while
for
それは44年後のことであり、このような使用法が実際に見られることはめったにありませんgoto
。構造化プログラミングは、ずっと前にすでに勝っています。
ケース分析:
サンプルコードは次のようになります。
SETUP...
again:
COMPUTE SOME VALUES...
if (cmpxchg64(ptr, old_val, val) != old_val)
goto again;
構造化バージョンは次のようになります。
SETUP...
do {
COMPUTE SOME VALUES...
} while (cmpxchg64(ptr, old_val, val) != old_val);
構造化されたバージョンを見ると、すぐに「ループだ」と思います。バージョンを見るとgoto
、最後に「再試行」のケースが付いた直線だと思います。
このgoto
バージョンには両方がSETUP
ありCOMPUTE SOME VALUES
、同じ列にあります。これは、ほとんどの場合、制御フローが両方を通過することを強調しています。構造化バージョンはSETUP
、COMPUTE SOME VALUES
異なる列に配置します。これは、制御が異なる列を通過する可能性があることを強調しています。
ここでの問題は、コードにどのような重点を置きたいかということです。goto
これをエラー処理と比較できます。
構造化バージョン:
if (do_something() != ERR) {
if (do_something2() != ERR) {
if (do_something3() != ERR) {
if (do_something4() != ERR) {
...
後藤バージョン:
if (do_something() == ERR) // Straight line
goto error; // |
if (do_something2() == ERR) // |
goto error; // |
if (do_something3() == ERR) // |
goto error; // V
if (do_something4() == ERR) // emphasizes normal control flow
goto error;
生成されるコードは基本的に同じであるため、インデントのような活版印刷の問題と考えることができます。