Facebook - konwersja
  • nowość

Refaktoryzacja w C#. Jak zredukować dług techniczny i optymalizować kod z Visual Studio, .NET 8 i C# 12 - ebook

Wydawnictwo:
Tłumacz:
Data wydania:
21 stycznia 2025
Format ebooka:
EPUB
Format EPUB
czytaj
na czytniku
czytaj
na tablecie
czytaj
na smartfonie
Jeden z najpopularniejszych formatów e-booków na świecie. Niezwykle wygodny i przyjazny czytelnikom - w przeciwieństwie do formatu PDF umożliwia skalowanie czcionki, dzięki czemu możliwe jest dopasowanie jej wielkości do kroju i rozmiarów ekranu. Więcej informacji znajdziesz w dziale Pomoc.
Multiformat
E-booki w Virtualo.pl dostępne są w opcji multiformatu. Oznacza to, że po dokonaniu zakupu, e-book pojawi się na Twoim koncie we wszystkich formatach dostępnych aktualnie dla danego tytułu. Informacja o dostępności poszczególnych formatów znajduje się na karcie produktu.
, PDF
Format PDF
czytaj
na laptopie
czytaj
na tablecie
Format e-booków, który możesz odczytywać na tablecie oraz laptopie. Pliki PDF są odczytywane również przez czytniki i smartfony, jednakze względu na komfort czytania i brak możliwości skalowania czcionki, czytanie plików PDF na tych urządzeniach może być męczące dla oczu. Więcej informacji znajdziesz w dziale Pomoc.
Multiformat
E-booki w Virtualo.pl dostępne są w opcji multiformatu. Oznacza to, że po dokonaniu zakupu, e-book pojawi się na Twoim koncie we wszystkich formatach dostępnych aktualnie dla danego tytułu. Informacja o dostępności poszczególnych formatów znajduje się na karcie produktu.
, MOBI
Format MOBI
czytaj
na czytniku
czytaj
na tablecie
czytaj
na smartfonie
Jeden z najczęściej wybieranych formatów wśród czytelników e-booków. Możesz go odczytać na czytniku Kindle oraz na smartfonach i tabletach po zainstalowaniu specjalnej aplikacji. Więcej informacji znajdziesz w dziale Pomoc.
Multiformat
E-booki w Virtualo.pl dostępne są w opcji multiformatu. Oznacza to, że po dokonaniu zakupu, e-book pojawi się na Twoim koncie we wszystkich formatach dostępnych aktualnie dla danego tytułu. Informacja o dostępności poszczególnych formatów znajduje się na karcie produktu.
(3w1)
Multiformat
E-booki sprzedawane w księgarni Virtualo.pl dostępne są w opcji multiformatu - kupujesz treść, nie format. Po dodaniu e-booka do koszyka i dokonaniu płatności, e-book pojawi się na Twoim koncie w Mojej Bibliotece we wszystkich formatach dostępnych aktualnie dla danego tytułu. Informacja o dostępności poszczególnych formatów znajduje się na karcie produktu przy okładce. Uwaga: audiobooki nie są objęte opcją multiformatu.
czytaj
na laptopie
Pliki PDF zabezpieczone watermarkiem możesz odczytać na dowolnym laptopie po zainstalowaniu czytnika dokumentów PDF. Najpowszechniejszym programem, który umożliwi odczytanie pliku PDF na laptopie, jest Adobe Reader. W zależności od potrzeb, możesz zainstalować również inny program - e-booki PDF pod względem sposobu odczytywania nie różnią niczym od powszechnie stosowanych dokumentów PDF, które odczytujemy każdego dnia.
Informacje na temat zabezpieczenia e-booka znajdziesz na karcie produktu w "Szczegółach na temat e-booka". Więcej informacji znajdziesz w dziale Pomoc.
czytaj
na tablecie
Aby odczytywać e-booki na swoim tablecie musisz zainstalować specjalną aplikację. W zależności od formatu e-booka oraz systemu operacyjnego, który jest zainstalowany na Twoim urządzeniu może to być np. Bluefire dla EPUBa lub aplikacja Kindle dla formatu MOBI.
Informacje na temat zabezpieczenia e-booka znajdziesz na karcie produktu w "Szczegółach na temat e-booka". Więcej informacji znajdziesz w dziale Pomoc.
czytaj
na czytniku
Czytanie na e-czytniku z ekranem e-ink jest bardzo wygodne i nie męczy wzroku. Pliki przystosowane do odczytywania na czytnikach to przede wszystkim EPUB (ten format możesz odczytać m.in. na czytnikach PocketBook) i MOBI (ten fromat możesz odczytać m.in. na czytnikach Kindle).
Informacje na temat zabezpieczenia e-booka znajdziesz na karcie produktu w "Szczegółach na temat e-booka". Więcej informacji znajdziesz w dziale Pomoc.
czytaj
na smartfonie
Aby odczytywać e-booki na swoim smartfonie musisz zainstalować specjalną aplikację. W zależności od formatu e-booka oraz systemu operacyjnego, który jest zainstalowany na Twoim urządzeniu może to być np. iBooks dla EPUBa lub aplikacja Kindle dla formatu MOBI.
Informacje na temat zabezpieczenia e-booka znajdziesz na karcie produktu w "Szczegółach na temat e-booka". Więcej informacji znajdziesz w dziale Pomoc.
99,00

Refaktoryzacja w C#. Jak zredukować dług techniczny i optymalizować kod z Visual Studio, .NET 8 i C# 12 - ebook

Termin dług techniczny oznacza zbiór skrótów, niedociągnięć i potworków projektowych, które powstają w trakcie ewolucyjnego rozwoju programu. Jeśli się ich nie zlikwiduje, mogą dramatycznie spowolnić pracę nad programem. Rozwiązywanie tego typu problemów jest nazywane refaktoryzacją i każdy programista powinien umieć ją przeprowadzać.

Dzięki tej przystępnej, świetnie napisanej książce dowiesz się, czym jest dług techniczny, co prowadzi do jego powstawania i w jaki sposób można go bezpiecznie zrefaktoryzować przy użyciu nowoczesnych narzędzi dostępnych w środowisku Visual Studio, a także najnowszych składników języka C# 12 i platformy .NET 8. Nauczysz się też korzystać z zaawansowanych testów jednostkowych tworzonych przy użyciu xUnit i takich bibliotek jak Moq, Snapper czy Scientist.NET. Dowiesz się, jak stosować zasady SOLID, aby tworzyć łatwy w utrzymaniu kod, poznasz również techniki programowania defensywnego, które można stosować w nowszych wersjach C#. Ponadto nauczysz się przeprowadzać analizy kodu i pisać własne analizatory Roslyn do wykrywania i rozwiązywania problemów typowych dla Twojego projektu.

Najciekawsze zagadnienia:

  • najważniejsze informacje o długu technicznym
  • różne sposoby refaktoryzacji klas, metod i wierszy kodu
  • efektywne testy jednostkowe
  • zasady SOLID i tworzenie kodu łatwego w utrzymaniu
  • korzystanie ze sztucznej inteligencji GitHub Copilot
  • standardy kodowania w zwinnych zespołach

Spis treści

O autorze

O recenzentach

Przedmowa

Wstęp

Część 1. Refaktoryzacja w C# w Visual Studio

  • Rozdział 1. Dług techniczny, zapaszki kodu i refaktoryzacja
    • Dług techniczny i stary kod
      • Skąd się bierze dług techniczny
    • Identyfikacja zapaszków kodu
    • Wprowadzenie do refaktoryzacji
      • Narzędzia do refaktoryzacji w Visual Studio
    • Studium przypadku - linie lotnicze Cloudy Skies
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 2. Wprowadzenie do refaktoryzacji
    • Wymagania techniczne
    • Refaktoryzacja kalkulatora cen bagażu
      • Konwersja własności na własności automatyczne
      • Wprowadzanie zmiennych lokalnych
      • Wprowadzanie stałych
      • Wprowadzanie parametrów
      • Usuwanie nieużywanego i nieosiągalnego kodu
      • Wyodrębnianie metod
      • Ręczna refaktoryzacja
      • Testowanie kodu po refaktoryzacji
    • Refaktoryzacja w innych edytorach
      • Refaktoryzacja w Visual Studio Code z dodatkiem C# Dev Kit
      • Refaktoryzacja w środowisku JetBrains Rider
      • Refaktoryzacja w Visual Studio z dodatkiem ReSharper
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 3. Refaktoryzacja przepływu sterowania i iteracji
    • Wymagania techniczne
    • Refaktoryzacja aplikacji do obsługi przyjmowania na pokład
    • Kontrola przepływu sterowania
      • Odwracanie instrukcji if
      • Opuszczanie instrukcji else po instrukcjach return
      • Restrukturyzacja instrukcji if
      • Operator trójargumentowy
      • Zamiana instrukcji if na instrukcje switch
      • Konwersja na wyrażenia switch
    • Tworzenie obiektów
      • Zamiana var na konkretne określenia typów
      • Prostsze tworzenie przy użyciu słowa kluczowego new z określeniem typu docelowego
      • Inicjalizatory obiektów
    • Iterowanie kolekcji
      • Pętla foreach
      • Konwersja na pętlę for
      • Konwersja na LINQ
    • Refaktoryzacja instrukcji LINQ
      • Wybór odpowiedniej metody LINQ
      • Łączenie metod LINQ
      • Przekształcanie przy użyciu metody Select
    • Przegląd i testowanie kodu po refaktoryzacji
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 4. Refaktoryzacja na poziomie metod
    • Wymagania techniczne
    • Refaktoryzacja rejestratora lotów
    • Refaktoryzacja metod
      • Zmiana modyfikatorów dostępu do metod
      • Zmienianie nazw metod i parametrów
      • Przeciążanie metod
      • Łańcuchy wywołań metod
    • Refaktoryzacja konstruktorów
      • Generowanie konstruktorów
      • Łańcuchy konstruktorów
    • Refaktoryzacja parametrów
      • Zmiana kolejności parametrów
      • Dodawanie parametrów
      • Wprowadzanie parametrów opcjonalnych
      • Usuwanie parametrów
    • Refaktoryzacja do funkcji
      • Składowe z wyrażeniem w treści
      • Przekazywanie funkcji jako parametrów z akcjami
      • Zwracanie danych z akcji przy użyciu struktur typu Func
    • Wprowadzanie metod statycznych i rozszerzających
      • Tworzenie statycznych metod
      • Przenoszenie statycznych składowych do innych typów
      • Tworzenie metod rozszerzających
    • Przegląd i testowanie kodu po refaktoryzacji
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 5. Refaktoryzacja kodu obiektowego
    • Wymagania techniczne
    • Refaktoryzacja systemu wyszukiwania lotów
    • Organizowanie klas przez refaktoryzację
      • Przenoszenie klas do osobnych plików
      • Zmienianie nazw plików i klas
      • Zmiana przestrzeni nazw
      • Unikanie klas częściowych i regionów
    • Refaktoryzacja i dziedziczenie
      • Przesłanianie metody ToString
      • Generowanie metod równości
      • Wyodrębnianie klasy bazowej
      • Przenoszenie implementacji interfejsów w górę drzewa dziedziczenia
    • Kontrolowanie dziedziczenia za pomocą słowa kluczowego abstract
      • Wyrażanie intencji za pomocą słowa kluczowego abstract
      • Wprowadzanie składowych abstrakcyjnych
      • Konwersja metod abstrakcyjnych na wirtualne
    • Poprawianie hermetyzacji
      • Hermetyzacja pól
      • Pakowanie parametrów do klasy
      • Opakowywanie własności w klasy
      • Kompozycja zamiast dziedziczenia
    • Ulepszanie klas za pomocą interfejsów i polimorfizmu
      • Wyodrębnianie interfejsów
      • Domyślne implementacje interfejsów
      • Wprowadzanie polimorfizmu
    • Przegląd i testowanie zrefaktoryzowanego kodu
    • Podsumowanie
    • Pytania
    • Dalsza lektura

Część 2. Bezpieczna refaktoryzacja

  • Rozdział 6. Testy jednostkowe
    • Wymagania techniczne
    • Testowanie i testy jednostkowe
      • Typy testów i piramida testowania
      • Testy jednostkowe
    • Testowanie kodu przy użyciu xUnit
      • Tworzenie projektu testowego xUnit
      • Łączenie projektu testów xUnit z własnym projektem
      • Pierwszy test jednostkowy
      • Wzorzec Organizacja-Akcja-Asercja
      • Testy i wyjątki
      • Dodawanie kolejnych metod testowych
    • Refaktoryzacja testów jednostkowych
      • Parametryzacja testów za pomocą atrybutów Theory i InlineData
      • Inicjalizacja kodu testów za pomocą konstruktorów i pól
      • Współdzielenie kodu przez metody
    • Inne środowiska testowe
      • Środowisko NUnit
      • Środowisko testowe MSTest
    • Myślenie w kategoriach testów
      • Włączanie testów do codziennego toku pracy
      • Izolowanie zależności
      • Dobre i złe testy
      • Uwagi na temat pokrycia kodu
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 7. Programowanie oparte na testach
    • Wymagania techniczne
    • Czym jest programowanie oparte na testach
    • Programowanie oparte na testach w Visual Studio
      • Ustawianie salda początkowego
      • Dodawanie kilometrów i generowanie metod
      • Wykorzystywanie kilometrów i refaktoryzacja testów
    • Kiedy stosować metodykę TDD
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 8. Unikanie antywzorców dzięki zasadom SOLID
    • Identyfikacja antywzorców w kodzie C#
    • Przestrzeganie zasad SOLID
      • Zasada pojedynczej odpowiedzialności
      • Zasada otwarty-zamknięty
      • Zasada zastępowania Liskov
      • Zasada segregacji interfejsów
      • Zasada odwrócenia zależności
    • Inne zasady architektoniczne
      • Zasada DRY
      • Zasada KISS
      • Wysoka spójność i niski stopień sprzężenia
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 9. Zaawansowane testy jednostkowe
    • Wymagania techniczne
    • Tworzenie czytelnych testów przy użyciu Shouldly
      • Instalowanie pakietu NuGet Shouldly
      • Czytelne asercje z Shouldly
      • Czytelne asercje z FluentAssertions
      • Testowanie wydajności z Shouldly
    • Generowanie danych testowych przy użyciu biblioteki Bogus
    • Imitowanie zależności za pomocą bibliotek Moq i NSubstitute
      • Dlaczego należy korzystać z bibliotek imitacyjnych
      • Tworzenie atrap obiektów przy użyciu biblioteki Moq
      • Programowanie wartości zwrotnych biblioteki Moq
      • Weryfikacja wywołań Moq
      • Tworzenie atrap przy użyciu biblioteki NSubstitute
    • Testy migawkowe z biblioteką Snapper
    • Eksperymentowanie z Scientist .NET
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 10. Defensywne techniki pisania kodu
    • Wymagania techniczne
    • API Cloudy Skies
    • Sprawdzanie poprawności danych wejściowych
      • Podstawowa weryfikacja poprawności danych
      • Słowo kluczowe nameof
      • Weryfikacja przy użyciu klauzul ochronnych
      • Klauzule ochronne z biblioteki GuardClauses
      • Atrybuty informacyjne
    • Ochrona przed null
      • Włączanie analizy dopuszczalności wartości null w C#
      • Operatory dopuszczalności wartości null
    • Poza granicą klas
      • Preferowanie klas niezmiennych
      • Własności wymagane i tylko do inicjalizacji
      • Konstruktory podstawowe
      • Konwertowanie klas na rekordy
      • Klonowanie obiektów przy użyciu wyrażeń with
    • Zaawansowane techniki pracy z typami
      • Dopasowywanie wzorców
      • Ograniczanie dublowania za pomocą typów generycznych
      • Tworzenie aliasów typów za pomocą dyrektywy using
    • Podsumowanie
    • Pytania
    • Dalsza lektura

Część 3. Zaawansowana refaktoryzacja przy użyciu sztucznej inteligencji i analizy kodu

  • Rozdział 11. Refaktoryzacja wspomagana przez sztuczną inteligencję z GitHub Copilot
    • Wymagania techniczne
    • Wprowadzenie do GitHub Copilot
      • Model predykcyjny GitHub
      • Rozpoczynanie rozmowy z czatem GitHub Copilot
    • Rozpoczynanie pracy z GitHub Copilot w Visual Studio
      • Instalowanie i aktywacja rozszerzenia GitHub Copilot
      • Uzyskiwanie dostępu do narzędzia GitHub Copilot
      • Generowanie sugestii przez GitHub Copilot
      • Interakcja z czatem GitHub Copilot
    • Refaktoryzacja przy użyciu czatu GitHub Copilot
      • Czat GitHub Copilot jako recenzent kodu
      • Refaktoryzacja celowana przy użyciu czatu GitHub Copilot
    • Tworzenie wstępnej dokumentacji za pomocą czatu GitHub Copilot
    • Generowanie imitacji obiektów za pomocą czatu GitHub Copilot
    • Ograniczenia narzędzia GitHub Copilot
      • Prywatność danych a GitHub Copilot
      • Wątpliwości związane z kodem publicznym i narzędziem GitHub Copilot
    • Studium przypadku - linie lotnicze Cloudy Skies
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 12. Analiza kodu w Visual Studio
    • Wymagania techniczne
    • Obliczanie metryk kodu w Visual Studio
    • Analiza kodu w Visual Studio
      • Analiza rozwiązania przy użyciu domyślnego zestawu reguł
      • Konfigurowanie zestawów zasad analizy kodu
      • Reagowanie na reguły analizy kodu
      • Traktowanie ostrzeżeń jako błędów
    • Zaawansowane narzędzia do analizy kodu
      • Śledzenie metryk kodu za pomocą SonarCloud i SonarQube
      • Dogłębna analiza na platformie .NET za pomocą NDepend
    • Studium przypadku linii lotniczych Cloudy Skies
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 13. Tworzenie analizatora Roslyn
    • Wymagania techniczne
    • Analizatory Roslyn - informacje podstawowe
      • Instalowanie narzędzi do tworzenia rozszerzeń i edytora DGML
      • Wprowadzenie do wizualizatora składni
    • Tworzenie analizatora Roslyn
      • Dodawanie projektu analizatora do rozwiązania
      • Definiowanie zasady analizy kodu
      • Analizowanie symboli przez analizator Roslyn
      • Wskazówki na temat pisania analizatorów Roslyn
    • Testowanie analizatorów Roslyn za pomocą RoslynTestKit
      • Dodawanie projektu testowego analizatora Roslyn
      • Klasa AnalyzerTestFixture
      • Sprawdzanie, czy analizator Roslyn nie oznacza poprawnego kodu
      • Sprawdzanie, czy analizator Roslyn znajduje niepoprawny kod
      • Debugowanie analizatorów Analyzers
    • Udostępnianie analizatorów jako rozszerzeń do Visual Studio
      • Tworzenie rozszerzenia Visual Studio (VSIX) dla analizatora Roslyn
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 14. Refaktoryzacja kodu z analizatorami Roslyn
    • Wymagania techniczne
    • Studium przypadku - linie lotnicze Cloudy Skies
    • Budowa poprawki kodu analizatora Roslyn
      • Tworzenie dostawcy poprawki kodu
      • Rejestrowanie poprawki kodu
      • Modyfikowanie dokumentu przez poprawkę kodu
    • Testowanie poprawek kodu za pomocą RoslynTestKit
    • Publikowanie analizatorów Roslyn jako pakietów NuGet
      • Wdrażanie za pomocą pakietów NuGet
      • Tworzenie pakietu NuGet
      • Wdrażanie pakietu NuGet
      • Dodawanie pakietu NuGet
      • Pakowanie dostawcy poprawki kodu jako rozszerzenia
    • Podsumowanie
    • Pytania
    • Dalsza lektura

Część 4. Refaktoryzacja w firmie

  • Rozdział 15. Informowanie o długu technicznym
    • Pokonywanie barier w refaktoryzacji
      • Pilne terminy
      • "Nie ruszać kodu wysokiego ryzyka"
      • "Ten kod zniknie, nie marnuj na niego czasu"
      • Aplikacje kończące cykl życia
      • "Zrób tylko to, co jest wymagane"
      • "Refaktoryzacja nie daje wartości biznesowej"
    • Informowanie o długu technicznym
      • Dług techniczny jako ryzyko
      • Tworzenie rejestru ryzyka
      • Co zamiast rejestru ryzyka
    • Ustalanie priorytetów długu technicznego
      • Obliczanie priorytetów ryzyka za pomocą oceny ryzyka
      • Podejście oparte na przeczuciu
    • Uzyskiwanie poparcia organizacyjnego
      • Przygotowywanie się do rozmowy
      • Przewidywanie pytań i zastrzeżeń
      • Różne podejścia dla różnych liderów
      • Znaczenie komunikacji
    • Studium przypadku - linie lotnicze Cloudy Skies
    • Podsumowanie
    • Pytania
    • Dalsza lektura
  • Rozdział 16. Wdrażanie standardów kodowania
    • Wymagania techniczne
    • Czym są standardy kodowania
      • Znaczenie standardów kodowania
      • Jak standardy kodu wpływają na refaktoryzację
      • Stosowanie standardów kodowania do istniejącego kodu
    • Ustanowienie standardów kodowania
      • Zbiorowe standardy kodowania
      • Wybór tego, co ważne
      • Źródła standardów kodowania
      • Ewolucja standardów kodowania
      • Włączanie standardów do procesów
    • Formatowanie i czyszczenie kodu w Visual Studio
      • Formatowanie dokumentów
      • Automatyczne formatowanie dokumentów
      • Konfigurowanie ustawień stylu kodowania
    • Stosowanie standardów kodowania za pomocą plików EditorConfig
      • Kod początkowy do przeglądu
      • Dodawanie pliku EditorConfig
      • Dostosowywanie pliku EditorConfig
    • Podsumowanie
    • Pytania
    • Więcej informacji
  • Rozdział 17. Zwinna refaktoryzacja
    • Refaktoryzacja w zwinnym środowisku
      • Kluczowe elementy zwinnych zespołów
      • Czynniki przeszkadzające w refaktoryzacji
    • Strategie dające sukces w zwinnej refaktoryzacji
      • Zadania poświęcone refaktoryzacji
      • Refaktoryzacja kodu, który jest zmieniany
      • Sprinty refaktoryzacji
      • Urlopy refaktoryzacyjne
    • Wykonywanie refaktoryzacji na dużą skalę
      • Dlaczego duże refaktoryzacje są trudne
      • Pułapka przepisywania
      • Lekcje z okrętu Tezeusza
      • Aktualizowanie projektów za pomocą .NET Upgrade Assistant
      • Refaktoryzacja i wzorzec dusiciela
    • Odzyskiwanie sprawności, gdy refaktoryzacja pójdzie źle
      • Wpływ nieudanych refaktoryzacji
      • Zapewnienie bezpieczeństwa w zwinnych środowiskach
    • Wdrażanie refaktoryzacji na dużą skalę
      • Korzystanie z flag funkcji
      • Wdrożenia etapowe lub niebiesko-zielone
      • Wartość ciągłej integracji i ciągłego dostarczania
    • Studium przypadku - linie lotnicze Cloudy Skies
    • Podsumowanie
    • W kierunku bardziej zrównoważonego oprogramowania
    • Pytania
    • Więcej informacji
Kategoria: Programowanie
Zabezpieczenie: Watermark
Watermark
Watermarkowanie polega na znakowaniu plików wewnątrz treści, dzięki czemu możliwe jest rozpoznanie unikatowej licencji transakcyjnej Użytkownika. E-książki zabezpieczone watermarkiem można odczytywać na wszystkich urządzeniach odtwarzających wybrany format (czytniki, tablety, smartfony). Nie ma również ograniczeń liczby licencji oraz istnieje możliwość swobodnego przenoszenia plików między urządzeniami. Pliki z watermarkiem są kompatybilne z popularnymi programami do odczytywania ebooków, jak np. Calibre oraz aplikacjami na urządzenia mobilne na takie platformy jak iOS oraz Android.
ISBN: 978-83-289-1692-0
Rozmiar pliku: 19 MB

BESTSELLERY

Kategorie: