0Pricing
C# Academy · レッスン

ガードと検証のパターン

ガード節で入力を早期に検証し、適切な例外をスローし、ユーザーデータにはTryParse形式のチェックを使います。

「ガードと検証のパターン」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

ガードを使用する理由

目標: メソッドを安全で読みやすく保ちます。

  • 先頭でガード節を使用します
  • 具体的な例外(ArgumentNullException、ArgumentOutOfRangeException)をスローします
  • ユーザー入力にはTryParseを使用します
  • 早期に失敗させ、深い入れ子を避けます

早期ガードのデモ

先頭に小さなチェックを追加して引数を検証し、呼び出し側が問題の内容を把握できるように具体的な例外をスローします。

using System;

// Demo: validate inputs at the top; keep main logic flat.
public class Program
{
  // Compute price with simple rules; guard early.
  public static decimal ComputePrice(string sku, int qty, decimal unitPrice)
  {
    if (sku == null) throw new ArgumentNullException("sku");
    if (sku.Length == 0) throw new ArgumentException("sku must not be empty", "sku");
    if (qty <= 0) throw new ArgumentOutOfRangeException("qty", "qty must be > 0");
    if (unitPrice < 0m) throw new ArgumentOutOfRangeException("unitPrice", "unitPrice must be >= 0");

    // Main logic stays simple
    decimal subtotal = qty * unitPrice;
    if (qty >= 10) subtotal = subtotal * 0.9m; // small bulk discount
    return subtotal;
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(ComputePrice("ABC", 2, 5m));   // ok
    try { Console.WriteLine(ComputePrice("", 2, 5m)); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name); }
  }
}

ガードヘルパークラス

共通のチェックを小さなGuardクラスに切り出し、メソッド本体を簡潔で一貫したものに保ちます。

using System;

// Minimal static helper for common validations (beginner friendly).
public static class Guard
{
  public static void NotNull(object value, string name)
  {
    if (value == null) throw new ArgumentNullException(name);
  }

  public static void NotNullOrEmpty(string value, string name)
  {
    if (value == null) throw new ArgumentNullException(name);
    if (value.Length == 0) throw new ArgumentException(name + " must not be empty", name);
  }

  public static void InRange(int value, int minInclusive, int maxInclusive, string name)
  {
    if (value < minInclusive || value > maxInclusive)
      throw new ArgumentOutOfRangeException(name, "Expected " + minInclusive + ".." + maxInclusive);
  }
}

public class Program
{
  static int ScoreFor(string userId, int level)
  {
    Guard.NotNullOrEmpty(userId, "userId");
    Guard.InRange(level, 1, 10, "level");
    // pretend logic
    return level * 100;
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(ScoreFor("u42", 3));
    try { Console.WriteLine(ScoreFor(null, 3)); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name); }
  }
}

TryParseによる検証

通常発生する無効な入力には、例外をスローする代わりにfalseを返すTryParse形式のメソッドを優先します。

using System;

// Use TryParse for user-provided text; avoid throwing for normal invalid input.
public class Program
{
  public static bool TryGetPort(string text, out int port)
  {
    port = 0;
    int value;
    if (!int.TryParse(text, out value)) return false;
    if (value < 1 || value > 65535) return false;
    port = value;
    return true;
  }

  public static void Main(string[] args)
  {
    int p;
    Console.WriteLine("8080 -> " + (TryGetPort("8080", out p) ? ("ok " + p) : "invalid"));
    Console.WriteLine("abc -> " + (TryGetPort("abc", out p) ? ("ok " + p) : "invalid"));
  }
}

スローと戻り値の使い分け

  • プログラマーのエラー(APIの誤用、許可されないnull、範囲外の値)にはスローします
  • 通常のユーザー入力ミス(無効なテキスト)にはfalse/Resultを返します
  • 具体的な例外型を使用し、パラメーター名を含めます
  • 外側から内側へ検証し、低コストのチェックを先に行います

ベストプラクティス

ヒント:

  • 境界(コントローラー、公開API)で検証します
  • 深い入れ子よりも小さなガードメソッドを優先します
  • エラーメッセージは短く明確にします
  • すべてのガードでログを出力せず、境界で一度だけ記録します

ガード節の意味

確認問題: ガード節を最もよく説明しているものはどれですか

まとめ

まとめ: ガード節で早期に検証し、プログラマーのエラーには具体的な例外をスローし、日常的なユーザー入力にはTryParseを使用します。

よくある質問

「ガードと検証のパターン」レッスンは無料ですか?

はい。「ガードと検証のパターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「ガードと検証のパターン」で何を学びますか?

ガード節で入力を早期に検証し、適切な例外をスローし、ユーザーデータにはTryParse形式のチェックを使います。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「ガードと検証のパターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ロギングの抽象化、Debug/Trace
  2. 基本的なプロファイリングとトレース(概念)
  3. ガードと検証のパターン
← C# Academyに戻る