破棄されたブログ

このブログは破棄されました。

do-while(0) …そういうものもあるのか…でも使えないかなあ

do-while(0) 文中で break してしまえば、処理を中断できるし無限ループに陥ることもない。
手続き型プログラミングで、早期リターンみたいなことを実現する方法の一つになるのかな。

It is a way to simplify error checking and avoid deep nested if's. For example:

do {
  // do something
  if (error) {
    break;
  }
  // do something else
  if (error) {
    break;
  }
  // etc..
} while (0);
http://stackoverflow.com/a/257421

可読性の観点で言えばすごく微妙なところだし、PHP みたいな言語だとループ文中から一気に break で抜けることもできない。でも、ネスト地獄に比べたらだいぶマシなのかなあ。

ループ文からも抜けたいけどいい方法が思いつかない

<?php
do {
    // Initialize error flag
    $error = FALSE;

    // do something

    if ($error === TRUE) {
        break;
    }

    // Loop
    for ($i = 0; $i < 10; $i++) {
        // do something

        if (is_error()) {
            $error = TRUE;
            break;
        }
    }
    // Error check
    if ($error === TRUE) {
        break;
    }

    // do something

    if ($error === TRUE) {
        break;
    }
} while(0);
?>

エラー判定を 2 回してるみたいでキモい。でも、こういうことしないといけない場合って、元々のソースコードが下みたいな感じになってるから、エラー判定箇所が増えれば変わらないんじゃないかなあ。

<?php

// Initialize error flag
$error = FALSE;

// Error check
if ($error === FALSE) {
    // do something
}

if ($error === FALSE) {
    for ($i = 0; $i < 10; $i++) {
        // do something
        if (is_error()) {
            $error = TRUE;
            break;
        }
    }
}

// Error check
if ($error === FALSE) {
    // do something
}

問題は、チームで開発をしているとき、コメントを残したところでコーディングの思想を汲み取ってもらえるとは限らないことだねえ。もういっそ、全体を try-catch で囲むとかしか思いつかないや。
それに、これで条件分岐によるネストが浅くなっても、結局 do-while(0) によって実現される早期リターンもどきは、モンスターメソッド状態なわけだし、普通に関数書いてやるべきですわなあ。

広告を非表示にする