Wzorce walidacji i Guard
Proszę wcześnie weryfikować dane wejściowe za pomocą klauzul ochronnych, zgłaszać właściwe wyjątki oraz stosować kontrole w stylu TryParse dla danych użytkownika.
Wzorce walidacji i Guard to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.
Dlaczego klauzule ochronne
Cel: Zachować bezpieczeństwo i czytelność metod.
- Używaj klauzul ochronnych na początku metody
- Rzucaj określone typy wyjątków (ArgumentNullException, ArgumentOutOfRangeException)
- Używaj TryParse dla danych wprowadzanych przez użytkownika
- Kończ działanie natychmiast w razie błędu; unikaj głębokiego zagnieżdżania
Przykład wczesnych klauzul ochronnych
Dodaj na początku małe sprawdzenia poprawności argumentów; rzucaj określone typy wyjątków, aby kod wywołujący wiedział, co poszło nie tak.
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); }
}
}
Klasa pomocnicza Guard
Wydziel wspólne sprawdzenia do niewielkiej klasy Guard, aby zachować czystość i spójność treści metod.
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); }
}
}
Walidacja za pomocą TryParse
W przypadku typowych nieprawidłowych danych wejściowych preferuj metody w stylu TryParse, które zwracają false zamiast rzucać wyjątkami.
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"));
}
}
Rzucać wyjątek czy zwracać wynik
- Throw stosuj w przypadku błędów programisty (nieprawidłowe użycie API, niedozwolona wartość null, wartość spoza zakresu)
- Return false/Result stosuj w przypadku typowych błędów użytkownika (nieprawidłowy tekst)
- Używaj określonych typów wyjątków; dołączaj nazwę parametru
- Waliduj od zewnątrz do środka: najpierw wykonuj tanie sprawdzenia
Najlepsze praktyki
Wskazówki:
- Wykonuj walidację na granicach systemu (kontrolery, publiczne interfejsy API)
- Preferuj małe metody ochronne zamiast głębokiego zagnieżdżania
- Twórz krótkie i jasne komunikaty o błędach
- Zapisuj błąd w logu raz na granicy systemu, a nie w każdej klauzuli ochronnej
Znaczenie klauzuli ochronnej
Podsumowanie
Podsumowanie: Wykonuj wczesną walidację za pomocą klauzul ochronnych, rzucaj określone wyjątki w przypadku błędów programisty i używaj TryParse dla codziennych danych wejściowych użytkownika.
Często zadawane pytania
Czy lekcja „Wzorce walidacji i Guard” jest bezpłatna?
Tak — pełny tekst „Wzorce walidacji i Guard” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Wzorce walidacji i Guard”?
Proszę wcześnie weryfikować dane wejściowe za pomocą klauzul ochronnych, zgłaszać właściwe wyjątki oraz stosować kontrole w stylu TryParse dla danych użytkownika. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.
Ile czasu zajmuje lekcja „Wzorce walidacji i Guard”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Abstrakcje logowania, Debug/Trace
- Podstawy profilowania i śladów (koncepcje)
- Wzorce walidacji i Guard