0Pricing
Ruby Academy · Lekcja

Klauzule ochronne

Czytelne wcześniejsze zwroty

Klauzule ochronne to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 4 z 4. 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 Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.

Czyste wcześniejsze zwroty

Klauzula ochronna to sprawdzenie na początku metody, które kończy jej działanie wcześniej w przypadku nieprawidłowych danych lub sytuacji brzegowych. Dzięki niej główna logika pozostaje płaska i łatwa do odczytania.

def greet(name)
  return "Hello, stranger" if name.nil?
  "Hello, #{name}"
end
puts greet(nil)
puts greet("Ada")

Problem: głębokie zagnieżdżenie

Bez klauzul ochronnych walidacje nakładają się w zagnieżdżonych blokach if. Właściwa logika zostaje zakopana głęboko przy prawej krawędzi ekranu.

def charge(user)
  if user
    if user[:active]
      puts "Charging #{user[:name]}"
    end
  end
end
charge({ name: "Sam", active: true })

Rozwiązanie: klauzule ochronne

Odwróć każdy warunek i zakończ działanie wcześniej. Ścieżka pomyślna znajduje się teraz na podstawowym poziomie wcięcia, bez dodatkowego wcięcia i jest oczywista.

def charge(user)
  return unless user
  return unless user[:active]
  puts "Charging #{user[:name]}"
end
charge({ name: "Sam", active: true })

return bez wartości

Samodzielne return kończy metodę i zwraca nil. Używaj go, gdy wywołujący nie potrzebuje wyniku w odrzuconym przypadku.

def log(message)
  return if message.nil? || message.empty?
  puts "LOG: #{message}"
end
log("")
log("started")

Zwracanie wartości

Klauzula ochronna może również zwracać znaczącą wartość, na przykład rozsądną wartość domyślną, dzięki czemu wywołujący zawsze otrzymuje coś użytecznego.

def discount(price)
  return 0 if price <= 0
  price * 0.1
end
puts discount(-5)
puts discount(200)

Klauzula ochronna z unless

return unless condition można odczytać jako „przerwij działanie, jeśli ten warunek nie jest spełniony”. To jeden z najczęściej używanych idiomów Ruby.

def withdraw(balance, amount)
  return "Insufficient funds" unless balance >= amount
  "New balance: #{balance - amount}"
end
puts withdraw(100, 150)
puts withdraw(100, 40)

Wiele klauzul ochronnych

Układaj kilka klauzul ochronnych jedna po drugiej, aby sprawdzać dane wejściowe krok po kroku. Każdy wiersz wyraża jedną regułę, dzięki czemu metoda sama się dokumentuje.

def register(name, age)
  return "Name required" if name.to_s.empty?
  return "Must be 18+" if age < 18
  "Registered #{name}"
end
puts register("", 30)
puts register("Lee", 16)
puts register("Lee", 21)

Klauzule ochronne z next w pętlach

Wewnątrz bloku lub pętli nie możesz użyć return, aby pominąć tylko jedną iterację. Użyj next jako klauzuli ochronnej, aby przejść do następnego elementu.

[1, -2, 3, -4].each do |n|
  next if n.negative?
  puts n
end

Klauzule ochronne zwiększają czytelność

Porównaj w myślach oba style przedstawione poniżej: klauzule ochronne usuwają else i zmniejszają poziom wcięcia. Czytelnik widzi najpierw obsługę nieprawidłowych przypadków, a następnie główną logikę.

def area(width, height)
  return 0 unless width.positive? && height.positive?
  width * height
end
puts area(0, 5)
puts area(4, 5)

Zgłaszanie wyjątku w klauzuli ochronnej

Gdy nieprawidłowe dane wejściowe są błędem programisty, a nie oczekiwanym przypadkiem, zgłoś wyjątek w klauzuli ochronnej, aby szybko i wyraźnie przerwać działanie.

def sqrt(n)
  raise ArgumentError, "n must be >= 0" if n.negative?
  Math.sqrt(n)
end
puts sqrt(16)
puts sqrt(-1) rescue puts "caught negative input"

Połączenie wszystkiego

Klauzule ochronne to niewielki nawyk, który przynosi duże korzyści:

  • Obsługuj przypadki brzegowe na początku i kończ działanie.
  • Utrzymuj główną logikę bez dodatkowego wcięcia.
  • Używaj return/next/raise zależnie od sytuacji.
def initials(name)
  return "" if name.nil? || name.strip.empty?
  name.split.map { |part| part[0].upcase }.join
end
puts initials("  ").inspect
puts initials("grace hopper")

Szybki test

Sprawdź swoją wiedzę na temat klauzul ochronnych.

Podsumowanie

Poznałeś klauzule ochronne:

  • Kończ działanie wcześniej w przypadku nieprawidłowych danych lub sytuacji brzegowych.
  • return unless kończy działanie, gdy wymaganie nie jest spełnione.
  • Używaj next, aby pominąć iterację pętli, a raise w przypadku rzeczywistych błędów.
  • Rezultatem są płaskie metody, które same się dokumentują.
def safe_divide(a, b)
  return nil if b.zero?
  a / b
end
puts safe_divide(10, 0).inspect
puts safe_divide(10, 2)

Często zadawane pytania

Czy lekcja „Klauzule ochronne” jest bezpłatna?

Tak — pełny tekst „Klauzule ochronne” 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 Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Klauzule ochronne”?

Czytelne wcześniejsze zwroty Ćwiczysz Ruby 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ąć Ruby Academy?

Nie wymagamy żadnego doświadczenia. Ruby 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 4 z 4.

Ile czasu zajmuje lekcja „Klauzule ochronne”?

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 Ruby Academy?

Tak. Każda lekcja Ruby 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

  1. if, unless, ternary
  2. Wyrażenia case/when
  3. Prawdziwość w Ruby
  4. Klauzule ochronne
← Powrót do Ruby Academy