スマホユーザーにお知らせ

2023年10月26日以降、テクニカル諏訪子のブログがスマホでの閲覧を対応しなくなったと案内しています。
パソコンやサーバーを使用するようにとの指示があります。

おすすめブラウザこちらです:

なお、理由については、「STOP!!スマホ」キャンペーンをご覧下さい。

ご理解お願い申し上げます。

ヘッダー
支援♡ : Monero

【プログラミング】アドバイス2:早期リターン

トップページに戻る
凛、 2023年12月21日 — jp, blog, システム開発, c言語, プログラミング

前回は運命のピラミッドを避ける事について話しました。
運命のピラミッドを避けるる際、早期リターンをよく使用します。

早期リターンとは?

早期リターンは、特定の条件が真(true)の場合に、関数の実行を直ぐに終了させる事です。
例えば、エラーが発生した場合、関数の最後まで実行する意味はありませんので、早期リターンを使う方が良いでしょう。

C言語の例(早期リターンを使わない場合):

const char *get_token() {
  char *token = malloc(64);
  json_object *res = curl_con("auth/login", "POST", data, "");

  if (res == NULL) {
    printf("エラー:ログインに失敗。");
    token = "";
  }

  json_object *data_obj, *token_obj;
  if (!json_object_object_get_ex(res, "data", &data_obj)) {
    printf("JSONで'data'を見つけられませんでした。");
    token = "";
  }

  if (!json_object_object_get_ex(data_obj, "token", &token_obj)) {
    printf("JSONの'data'鍵で、'token'を見つけられませんでした。");
    token = "";
  }

  token = json_object_get_string(token_obj);
  json_object_put(res);

  return token;
}

上記の問題は、3つの異なるエラーチェックがあるにも関わらず、エラーが発生しても最後まで処理を続ける事です。
それは非効率的です。
さらに、上記の例ではメモリリークが発生する可能性がある為、この方法はお勧め出来ません。
そこで、早期リターンを使って問題を解決しましょう。

const char *get_token() {
  char *token = malloc(64);
  json_object *res = curl_con("auth/login", "POST", data, "");

  if (res == NULL) {
    printf("エラー:ログインに失敗。");
    free(token); // メモリ割当しましたが、エラーが発生したから、開放して下さい
    return NULL; // エラーが発生したから、終了しよう
  }

  json_object *data_obj, *token_obj;
  if (!json_object_object_get_ex(res, "data", &data_obj)) {
    printf("JSONで'data'を見つけられませんでした。");
    json_object_put(res); // エラーが発生したから、JSONオブジェクトを開放する
    free(token);
    return NULL;
  }

  if (!json_object_object_get_ex(data_obj, "token", &token_obj)) {
    printf("JSONの'data'鍵で、'token'を見つけられませんでした。");
    json_object_put(res);
    free(token);
    return NULL;
  }

  token = json_object_get_string(token_obj);
  json_object_put(res);

  return token;
}

結果は同じですが、処理が少なくなる為、効率が向上します。

以上


Valid XHTML 1.1 正当なCSSです! どのブラウザでも表示出来ます! hacker emblem SDGsに反対 スマホに反対

匿名自営業076の設立者
ページのGitGitリポジトリ