Czysta architektura Flashcards

1
Q

Czym cechuje się paradygmat funkcyjny?

A
  • wymusza dyscyplinę bezpośredniego przekazania sterowania (direct transfer)
  • kod zawierający funkcje, pętle, if/else if/else
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Czym cechuje się paradygmat obiektowy?

A
  • wymusza dyscyplinę pośredniego przekazania sterowania (indirect transfer)
  • zlikwidował koniecznośc stosowania wskaźników na funkcje dzięki mechanizmowi polimorfizmu
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Co oznacza pośrednie przekazanie sterowania w paradygmacie obiektowym?

A

Wywołane odpowiedniej funkcji wirtualnej jest obsługiwane przez mechanizm polimorfizmu. Poprzez wskaźnik na funkcję wywoływana jest odpowiednia funkcja

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Czym cechuje się paradygmat funkcyjny?

A

Wymusza dyscyplinę podczas przypisywania wartości (wartości nie mogą się zmienić)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Jak paradygmat funkcyjny wspiera używanie współbieżności?

A

Brak możliwości zmiany wartości zmiennych powoduje brak zakleszczeń, warunków wyścigu, sekcji krytycznych i innych

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Co to Segregation of mutability?

A

Podział aplikacji na komponenty zmienne i niezmienne. Komponenty niezmienne wykonują swoje zadania w sposób całkowicie funkcyjny. Komunikują się z komponentami zmiennymi, które dokonują zmian zmiennych

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Więcej czy mniej kodu w komponentach funkcyjnych?

A

Radzone jest umieszczać jak najwięcej pracy w komponentach niemodyfikujących zmienne i jednocześnie redukować ilość kodu umieszczanego w komponentach, w których jest to dozwolone

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Co to Event Sourcing?

A

Przechowywanie wszystkich zmian stanu zamiast stanu. Sprzyja to paradygmatowi funkcyjnemu. Na przykład zamiast przechowywać obecny stan konta, można przechowywać wszystkie transakcje, których suma da posiadaną kwotę.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Jakie są konsekwencje stosowania paradygmatów programowania?

A
  • każdy nakłada na programistę jakąś dodatkową dyscyplinę
  • mówią czego nie robić
  • każdy paradygmat coś zabiera (np.: goto, wskaźniki na funkcje, przypisania)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Czemu dowodzą testy?

A

Testami dowodzi się niepoprawności programu, a zatem dowodzimy poprawności poprzez porażki w próbach dowiedzenie niepoprawności

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Charakterystyka Single Responsibility Principle

A

Każdy moduł powinien odpowiadać (mieć powód do zmiany) tylko przed jednym aktorem

Aktor symbolizuje daną grupę ludzi np.: użytkownicy, udziałowcy)

Przykład: klasa Emplyee z funkcją save (dla bazy danych) i reportHours (dla dziau HR). Interface tej klasy jest zbyt szeroki bo korzysta z niego dwóch aktorów.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Czym staje się Single Responsibility Principle na poziomie komponentu?

A

Common Closure Principle

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Czym staje się Single Responsibility Principle na poziomie architektury?

A

Axis of Change

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Charakterystyka Open Closed Principle

A
  • element oprogramowania powinien być otwarty na rozbudowę, ale zamknięty na modyfikację
  • jeżeli komponent A ma być chroniony przed zmianami wprowadzanymi w komponencie B, to komponent B powinien zależeć od komponentu A. Zależność oznacza, że komponent B używa interface komponentu A
  • można osiągnąć stosując Single Responsibility Principle i Dependency Inversion Principle
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Charakterystyka Liskov Substitution Principle

A
  • kod używający interfejsu może być parametryzowany dowolną klasą implementującą ten interfejs
  • zachowania specyficzne dla klasy pochodnej zamykać w implementacji interfejsu dzięki czemu uniknie się hardkodowania corner case’ów
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Charakterystyka Dependency Inversion Principle

A
  • Nie powinny istnieć zależności od niczego konkretnego (wynika z tego, że klasy konkretne powinny pojawiać się wyłącznie we wzorcach kreacyjnych)
  • podczas stosowania tej zasady ignorujemy stabilne tło (np.: klasa String)
  • unikać zależności od ulotnych implementacji
17
Q

Co powinny dołączać instrukcje takie jak import, using, include?

A

Powinny dołączać moduły zawierające interfejsy, klasy abstrakcyjne albo inny rodzaj abstrakcyjnej deklaracji

18
Q

Czy można przesłaniać funkcje konkretne?

A

Nie - dziedziczy się w ten sposób zależności

19
Q

Charakterystyka Interface Segregation Principle

A
  • rozdzielanie większego interfejsu na kilka mniejszych w celu ochrony przed uzaleznianiem się od modułów zawierających więcej niż jest potrzebne
  • ograniczony interfejs = mniej powodów do przebudowy w przypadku zmiany
20
Q

Co to jest komponent?

A

najmniejsza jednostka, którą można zainstalować (np.: plik DLL, libka)

21
Q

Scharakteryzuj REP (Reuse/Release Equivalence Principle)

A
  • “Podstawą ponownego użycia komponentu jest jego numer wydania”
  • dostarczać listę zmian/dokumentację każdego wydania
  • klasy i moduły zgromadzone w jednym komponencie powinny pozwalać na utworzenie wspólnego wydania
  • z punktu widzenia architektury zasada ta oznacza, że klasy i moduły zgrupowane w jeden komponent muszą tworzyć spójną grupę
22
Q

Scharakteryzuj CCP (Common Closure Principle)

A

W ramach komponentu zgromadź te klasy, które zmieniają się z tego samego powodu i w tym samym czasie. Na różne komponenty rozdziel te klasy, które zmieniają się w różnym czasie i z różnych powodów

23
Q

Scharakteryzuj CRP (Common Reuse Principle)

A
  • mówi które klasy nie powinny być grupowane w komponent: klasy, które nie są ściśle powiązane, nie powinny być częścią jednego komponentu
  • jeżeli jeden komponent używa drugiego komponentu to tworzona jest zależność między nimi. Jeżeli zmieni się “używany” komponent to trzeba będzie kompilować/instalować takżę “używający” komponent. Powinny zostać złączone w jeden komponent by uniknąć instalacji wielu komponentów.
  • jest to uogólniona wersja ISP
24
Q

Które zasady spójności komponentów ze sobą współgrają?

A

REP i CCP są sprzeczne z CRP. Trzeba znaleźć równowagę w stosowaniu

25
Q

Scharakteryzuj zasadę zależności niecyklicznych (Acyclic Dependencies Principle)

A
  • nie dopuść do powstania cyklicznych związków w diagramie zależności komponentów
  • diagram zależności komponentów powinien tworzyć skierowany graf niecykliczny
26
Q

Jak usunąc cykliczność w diagramie zależności komponentów?

A
  • poprzez zastosowanie Dependency Inversion Principle. W komponencie tworzącym cykl wprowadzić użycie interfejsu. Kierunek zależności zostanie odwrócony
  • poprzez wydzielenie osobnego komponentu, od którego zależeć będą dwa komponenty z cyklu
27
Q

Scharakteryzuj zasadę stabilnych zależności (Stable Dependencies Principle)

A
  • zależności kierować w stronę elementu stabilnego
28
Q

Czy stabilny komponent powinien zależeć od niestabilnego?

A
  • Żaden stabilny komponent nie powinien zależeć od niestabilnego
  • miara stabilności komponentu powinna być większa niż miary stabilności komponentów, od których on zależy. Oznacza to, że miara stabilności powinna zmniejszać się zgodnie z kierunkiem zalezności
29
Q

Co to jest stabilność komponentu?

A

To ilość pracy jaką trzeba włożyć w zmianę

30
Q

Jak obliczyć miarę stabilność komponentu?

A

Fan-In - liczba klas spoza naszego komponentu, zależących od klas wewnątrz tego komponentu
Fan-Out - liczba klas w naszym komponencie, zależących od klas spoza tego komponentu

I = Fan-Out / (Fan-In + Fan-Out)

31
Q

Jak usunąć miejsce łamiące Stable Dependency Principle?

A

Stosując Dependency Inversion Principle. Komponent z mniejszą stabilnością zależeć będzie od interfejsu, który jest bardzo stabilny (według książki ma wartość stabilności 1)

32
Q

Scharakteryzuj zasadę stabilnej abstrakcji (Stable Abstraction Principle)

A

komponent powinien być tak abstrakcyjny jak jest stabilny

33
Q

Jak obliczyć miarę abstrakcji komponentu?

A
  • Nc - liczba klas w komponencie
  • Na - liczba klas abstrakcyjnych w komponencie

A = Na / Nc

34
Q

Po co stosować diagram zależności komponentów?

A
  • służy do konserwacji aplikacji. Wraz ze zmianą wymagań i wzrostem rozmiaru kodu wzrasta liczba komponentów. Aktualizacje i monitorowanie diagramu pozwalają znaleźć zależności cykliczne
  • izolacja szybkozmiennych elementów od stabilnych
35
Q

Diagram komponentów robić od razu czy wraz z ewolucją projektu?

A

Na początku projektu nie ma sensu. Struktura zależności komponentów ewoluuje w czasie gdy system się rozrasta i zmienia.

36
Q

Jaki problem może zaistnieć w podeściu Weekly build?

A

Jeżeli istnieją zależności cykliczne pomiędzy komponentami to czas potrzebny na mergowanie zmian będzie ciągle rósł, pozostawiając coraz mniej czasu na development.

37
Q

Jak rozwiązać “syndrom dnia następnego” przy użyciu diagramu komponentów?

A

dzielić oprogramowanie na wydawane niezależnie komponenty i wypuszczać releasy z określonym numerem wersji. Zespoły używające takiego komponentu mogą zdecydować czy przejść na nową wersję czy używać poprzedniej.