ガードと検証のパターン
ガード節で入力を早期に検証し、適切な例外をスローし、ユーザーデータには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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ロギングの抽象化、Debug/Trace
- 基本的なプロファイリングとトレース(概念)
- ガードと検証のパターン