Skip to content

Commit 847829e

Browse files
authored
Merge pull request #33 from coders-school/master
Update 23.06.2020
2 parents 55470bb + 4c85c6b commit 847829e

17 files changed

+1484
-44
lines changed

module2/index.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ <h3>Łukasz Ziobroń</h3>
5252
5. <!-- .element: class="fragment fade-in" --> klasy abstrakcyjne
5353
6. <!-- .element: class="fragment fade-in" --> interfejsy
5454
7. <!-- .element: class="fragment fade-in" --> polimorfizm
55-
8. <!-- .element: class="fragment fade-in" --> `static`
55+
8. <!-- .element: class="fragment fade-in" --> pola i metody statyczne
56+
57+
Możliwe, że dzisiaj nie przerobimy wszystkiego. Będzie na kolejną lekcję :)
58+
<!-- .element: class="fragment fade-in" -->
5659

5760
</textarea>
5861
</section>
@@ -110,6 +113,10 @@ <h3>Łukasz Ziobroń</h3>
110113
data-separator-vertical="^___"
111114
data-separator-notes="^Note:">
112115
</section>
116+
<section data-markdown="presentation_homework.md"
117+
data-separator-vertical="^___"
118+
data-separator-notes="^Note:">
119+
</section>
113120
<!-- section data-markdown="presentation_solutions.md"
114121
data-separator-vertical="^___"
115122
data-separator-notes="^Note:">

module2/oop2.pdf

1.17 MB
Binary file not shown.

module2/presentation_homework.md

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
<!-- .slide: data-background="#111111" -->
2+
3+
# Programowanie obiektowe
4+
5+
## Podsumowanie
6+
7+
<a href="https://coders.school">
8+
<img width="500" data-src="../coders_school_logo.png" alt="Coders School" class="plain">
9+
</a>
10+
11+
___
12+
13+
## Co pamiętasz z dzisiaj?
14+
15+
### Napisz na czacie jak najwięcej haseł
16+
<!-- .element: class="fragment fade-in" -->
17+
18+
1. <!-- .element: class="fragment fade-in" --> dziedziczenie
19+
2. <!-- .element: class="fragment fade-in" --> wielodziedziczenie
20+
3. <!-- .element: class="fragment fade-in" --> funkcje wirtualne
21+
4. <!-- .element: class="fragment fade-in" --> funkcje czysto wirtualne
22+
5. <!-- .element: class="fragment fade-in" --> klasy abstrakcyjne
23+
6. <!-- .element: class="fragment fade-in" --> interfejsy
24+
7. <!-- .element: class="fragment fade-in" --> polimorfizm
25+
8. <!-- .element: class="fragment fade-in" --> pola i metody statyczne
26+
27+
___
28+
29+
### Pre-work
30+
31+
* Dowiedzcie się czym jest problem diamentowy
32+
* Poczytajcie o zasadach SOLID, dotyczących pisania dobrego kodu obiektowego
33+
* Lektura o wzorcach projektowych z przykładami w C++ - [refactoring.guru](https://refactoring.guru/design-patterns)
34+
* Spróbujcie w grupie metodą Copy & Paste dorzucić system budowania cmake do projektu. W tym celu popatrzcie na dotychczasowe zadania domowe i plik CMakeLists.txt.
35+
36+
___
37+
38+
## Projekt grupowy
39+
40+
Wykorzystajcie kod napisany podczas zajęć. Możecie też skorzystać z kodu w katalogu [solutions](solutions)
41+
42+
Projekt grupowy - kontynuacja. Możecie zmienić grupę jeśli chcecie ;)
43+
44+
___
45+
46+
## Organizacja prac
47+
48+
* Jak wyglądało wasze daily?
49+
* Czy Code Review nie jest zaniedbane?
50+
* Czy współpraca idzie gładko?
51+
* Zróbcie sobie retrospektywę :)
52+
53+
___
54+
55+
### Punktacja
56+
57+
* 3 pierwsze zadania - 5 punktów
58+
* zadania 4, 5, 6 - 8 punktów
59+
* 20 punktów za dostarczenie wszystkich 6 zadań przed 05.07.2020 (niedziela) do 23:59
60+
* brak punktów bonusowych za dostarczenie tylko części zadań przed 05.07
61+
* 6 punktów za pracę w grupie dla każdej osoby z grupy.
62+
63+
___
64+
65+
## Zadanie 1
66+
67+
Napisz klasę `Store`, która będzie umożliwiała dokonywanie zakupów. Wykorzystaj poniższy enum i funkcje.
68+
69+
```cpp
70+
enum class Response {done, lack_of_money, lack_of_cargo, lack_of_space};
71+
72+
Response buy(Cargo* cargo, size_t amount, Player* player);
73+
Response sell(Cargo* cargo, size_t amount, Player* player);
74+
```
75+
76+
___
77+
78+
## Zadanie 2
79+
80+
W klasach `Alcohol`, `Fruit`, `Item` dopisz brakujące metody oraz ich implementacje.
81+
82+
```cpp
83+
// override from Cargo
84+
size_t getPrice() const override;
85+
std::string getName() const override { return name_; }
86+
size_t getAmount() const override { return amount_; }
87+
size_t getBasePrice() const override { return base_price_; }
88+
Cargo& operator+=(size_t amount) override;
89+
Cargo& operator-=(size_t amount) override;
90+
bool operator==(Cargo& cargo) const override;
91+
```
92+
93+
___
94+
95+
## Zadanie 3
96+
97+
Dopisz do klasy `Ship`, `Cargo` oraz `Stock` metodę `nextDay()`
98+
99+
* Klasa `Ship`: Metoda powinna odejmować po 1 sztuce monety za każdego członka załogi.
100+
* Klasa `Cargo`: Metoda powinna powodować psucie się towarów.
101+
* Klasa `Stock`: Metoda powinna zmieniać ilość towaru w sklepach.
102+
103+
___
104+
105+
## Zadanie 4 (dla ambitnych)
106+
107+
Spróbuj napisać klasę `Time`, która będzie odpowiadać za zarządzanie czasem w grze.
108+
109+
Klasa ta powinna informować inne klasy, takie jak `Cargo`, `Ship`, `Stock` o upłynięciu każdego dnia.
110+
111+
Poczytaj czym jest wzorzec projektowy [`Observer`](https://refactoring.guru/design-patterns/observer).
112+
113+
___
114+
115+
## Zadanie 5 (dla ambitnych)
116+
117+
Napisz zaprzyjaźniony operator wypisywania do strumienia
118+
119+
```cpp
120+
friend std::ostream& operator<<(std::ostream& out, const Store& store);
121+
```
122+
123+
Ma on w przystępny sposób wypisywać towar, jaki znajduje się w danym sklepie.
124+
125+
___
126+
127+
## Zadanie 6 (dla ambitnych)
128+
129+
Napisz klasę `Game`, która zarządzać będzie całą rozgrywką.
130+
131+
Dodaj jej jedną metodę publiczną `startGame()`.
132+
133+
Finalnie plik main powinien wyglądać tak:
134+
135+
```cpp
136+
#include "Game.hpp"
137+
138+
constexpr size_t start_money = 1'000;
139+
constexpr size_t game_days = 100;
140+
constexpr size_t final_goal = 2'000;
141+
142+
int main() {
143+
Game game(start_money, game_days, final_goal);
144+
game.startGame();
145+
146+
return 0;
147+
}
148+
```

module2/presentation_inheritance.md

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ ___
1313
## Wprowadzenie do dziedziczenia
1414

1515
Podczas implementacji klas, często możemy zauważyć, że część cech składowych klasy można wykorzystać także w innych klasach.
16+
<!-- .element: class="fragment fade-in" -->
1617

17-
Weźmy pod lupę klasę Komputer. Jeżeli chcielibyśmy utworzyć klasy: laptop, PC, tablet, to część metod oraz składowych klasy musielibyśmy niepotrzebnie powielić.
18+
Weźmy pod lupę klasę `Computer`. Jeżeli chcielibyśmy utworzyć klasy: `Laptop`, `PC`, `Tablet`, to część metod oraz składowych klasy musielibyśmy powielić.
19+
<!-- .element: class="fragment fade-in" -->
1820

1921
___
2022

@@ -126,35 +128,46 @@ private:
126128
Keyboard keyboard_;
127129
};
128130
```
131+
<!-- .element: class="fragment fade-in" -->
129132

130133
___
131134

132135
## Klasy bazowe i pochodne
133136

134-
Klasa, po której dziedziczymy, nazywają się <span class="fragment highlight-green">**klasą bazową**</span>.
137+
Klasa, po której dziedziczymy, nazywają się <span class="fragment highlight-green">**klasą bazową (base class)**</span>.
138+
<!-- .element: class="fragment fade-in" -->
135139

136-
Klasy, które dziedziczą nazywa się <span class="fragment highlight-green">**klasami pochodnymi**</span>.
140+
Klasa, która dziedziczy nazywa się <span class="fragment highlight-green">**klasą pochodną (derived class)**</span>.
141+
<!-- .element: class="fragment fade-in" -->
137142

138143
Inaczej, klasa, po której dziedziczymy to rodzic (parent class).
144+
<!-- .element: class="fragment fade-in" -->
139145

140146
Klasa, która dziedziczy to dziecko (child class).
147+
<!-- .element: class="fragment fade-in" -->
141148

142149
___
143150

144-
### Co z metodami klas `Laptop` i `Tablet`, czy można wydzielić kolejną klasę?
151+
### Co z metodami klas `Laptop` i `Tablet`?
152+
153+
#### Czy można wydzielić kolejną klasę?
154+
<!-- .element: class="fragment fade-in" -->
145155

146156
```cpp
147157
void display();
148158
void getUserInput();
149159
```
160+
<!-- .element: class="fragment fade-in" -->
150161

151162
___
152163

153164
## Klasa `Screen` i `TouchScreen`
154165

155166
Załóżmy, że dodajemy klasę `Screen`. Klasa ta wyświetla na bieżąco interfejs użytkownika.
167+
<!-- .element: class="fragment fade-in" -->
156168

157-
Chcemy też stworzyć klasę reprezentującą ekran dotykowy, który również umożliwia odczyt akcji od użytkownika i ich wyświetlanie.
169+
Chcemy też stworzyć klasę reprezentującą ekran dotykowy - `TouchScreen`, który również umożliwia odczyt akcji od użytkownika i ich wyświetlanie.
170+
<!-- .element: class="fragment fade-in" -->
158171

159172
<style>
160173
.container {
@@ -181,6 +194,7 @@ private:
181194
Monitor monitor_;
182195
};
183196
```
197+
<!-- .element: class="fragment fade-in" -->
184198
185199
</div>
186200
@@ -199,12 +213,14 @@ private:
199213
Monitor monitor_;
200214
};
201215
```
216+
<!-- .element: class="fragment fade-in" -->
202217

203218
</div>
204219

205220
</div>
206221

207222
### Jak uprościć powyższy kod?
223+
<!-- .element: class="fragment fade-in" -->
208224

209225
___
210226

@@ -220,7 +236,10 @@ private:
220236

221237
Monitor monitor_;
222238
};
239+
```
240+
<!-- .element: class="fragment fade-in" -->
223241
242+
```cpp
224243
class TouchScreen : public Screen {
225244
public:
226245
void getUserInput();
@@ -229,10 +248,11 @@ private:
229248
void displayKeyboard();
230249
};
231250
```
251+
<!-- .element: class="fragment fade-in" -->
232252

233253
___
234254

235-
## Wielodziedziczenie #1
255+
## Wielodziedziczenie
236256

237257
```cpp
238258
class Screen {
@@ -279,13 +299,25 @@ class Tablet : public Computer,
279299
280300
___
281301
282-
## Wielodziedziczenie #2
302+
## Wielodziedziczenie - disclaimer
303+
304+
Wielodziedziczenie to dziedziczenie z kliku klas bazowych.
305+
306+
Wybór implementacji zależy od programisty.
307+
<!-- .element: class="fragment fade-in" -->
308+
309+
Nie zawsze wielodziedziczenie będzie lepszym rozwiązaniem.
310+
<!-- .element: class="fragment fade-in" -->
283311
284-
Wybór implementacji zależy od programisty. Nie zawsze wielodziedziczenie będzie lepszym rozwiązaniem. Należy się zawsze zastanowić czy dziedziczenie po konkretnej klasie uprości nam program i czy nie będzie powodować żadnych komplikacji w dalszym procesie rozbudowy naszego programu.
312+
Należy się zawsze zastanowić czy dziedziczenie po konkretnej klasie uprości nam program i czy nie będzie powodować żadnych komplikacji w dalszym procesie rozbudowy naszego programu.
313+
<!-- .element: class="fragment fade-in" -->
314+
315+
Najwyżej trzeba będzie refaktoryzować program ;)
316+
<!-- .element: class="fragment fade-in" -->
285317
286318
___
287319
288-
## Wielodziedziczenie - problemy #1
320+
## Dziedziczenie - problemy
289321
290322
```cpp
291323
struct Bird {
@@ -308,7 +340,7 @@ struct Hummingbird {
308340
___
309341
<!-- .slide: style="font-size: 0.9em" -->
310342

311-
## Wielodziedziczenie - problemy #2
343+
## Dziedziczenie - zasada LSP
312344

313345
Jeżeli spróbujemy teraz uprościć klasę poprzez dziedziczenie pojawi się problem:
314346

@@ -335,4 +367,12 @@ uniknąć podobnych problemów.
335367
336368
___
337369
370+
### Dla ciekawskich
371+
372+
Poczytajcie o zasadzie Liskov Substitution Principle (LSP). Mówi ona jak powinno / nie powinno się projektować kodu obiektowego. Ta zasada została złamana w ostatnim przykładzie.
373+
374+
Możecie też poczytać o wszystkich zasadach SOLID.
375+
376+
___
377+
338378
## Q&A

0 commit comments

Comments
 (0)