Exceptions vs Wartości Błędów: Jak Wybrać Strategię

Otwórz w Python plik, który nie istnieje, i open() zgłasza FileNotFoundError, który wychodzi poza twoją funkcję. Zrób to samo w Go, a os.ReadFile zwraca wartość error razem z nilowym slice’em bajtów. Ten sam błąd, dwie zupełnie inne formy kodu wokół niego. Różnica nie jest kosmetyczna. Decyduje o tym, czy wywołujący może przypadkowo zignorować błąd, i czy kompilator to zauważy, gdy to się stanie. Co exceptions i wartości błędów robią naprawdę inaczej? Exception to przepływ sterowania, który skacze. Coś zawodzi, funkcja zgłasza wyjątek, a wykonanie opuszcza bieżący stos wywołań i trafia do najbliższego dopasowanego bloku catch albo except, niezależnie od tego, ile poziomów wyżej to jest. Sygnatura funkcji nie daje żadnej wskazówki, że to może się zdarzyć. loadConfig(path: string): Config w TypeScript wygląda jak funkcja, która nie może zawieść — aż zgłosi wyjątek przy brakującym pliku. ...

26 października 2026 · 7 min · 1429 słów · SpaghettiCoder

Zasady SOLID Wyjaśnione na Przykładach w Pythonie

Klasa, która zapisuje użytkownika w bazie danych, wysyła mu powitalny email i formatuje rachunek, jest jedną zmianą od zepsucia dwóch funkcji, z którymi nie ma nic wspólnego. Zmieniasz szablon emaila i ryzykujesz zapis do bazy. Zmieniasz układ rachunku i ryzykujesz email. SOLID to pięć zasad, które atakują ten rodzaj splątania z różnych stron, i łączy je jedna idea: klasa powinna mieć jeden powód do zmiany, a reszta kodu powinna zależeć od tego, co element obiecuje robić, nie od tego, jak to robi. ...

10 października 2026 · 9 min · 1750 słów · SpaghettiCoder

Czym Jest Dependency Injection? (Z Przykładami)

Oto klasa, której nie przetestujesz jednostkowo bez działającej bazy danych i serwera SMTP: 1 2 3 4 5 6 7 8 9 10 11 public class OrderService { private readonly SqlOrderRepository _repository = new SqlOrderRepository("Server=prod-db;Database=Orders;..."); private readonly SmtpEmailSender _emailSender = new SmtpEmailSender("smtp.company.com"); public void PlaceOrder(Order order) { _repository.Save(order); _emailSender.Send(order.CustomerEmail, "Order confirmed"); } } OrderService tworzy własne instancje SqlOrderRepository i SmtpEmailSender przez new, razem z connection stringiem. Każdy test dotykający PlaceOrder potrzebuje prawdziwej bazy Orders i działającego serwera pocztowego, inaczej padnie, zanim dojdzie do asercji. Logika, którą chcesz przetestować, to dwie linijki: zapisz zamówienie, wyślij potwierdzenie. Jest zespawana z dwiema konkretnymi klasami, których nie da się podmienić. ...

1 października 2026 · 7 min · 1384 słów · SpaghettiCoder

Czym Jest Spaghetti Code i Jak Go Zrefaktoryzować

Otwierasz funkcję, żeby naprawić błąd w jednej linijce, i czterdzieści minut później wciąż śledzisz, która gałąź ustawia którą zmienną. Trzy niepowiązane ze sobą zadania są zespawane w jeden blok, i żadne z nich nie ma nazwy. Pociągasz za jedną nitkę i nie wiesz, które inne się poruszają. To właśnie spaghetti code, i nazwa nie ma nic wspólnego z wcięciami czy stylem nazewnictwa. Opisuje przepływ sterowania: wykonanie skacze między warunkami tak, jak jeden makaron krzyżuje się z każdym innym w misce, a podążanie jedną ścieżką do końca oznacza trzymanie w głowie czterech poziomów if naraz. ...

25 września 2026 · 9 min · 1839 słów · SpaghettiCoder