Skip to content

Update 23.06.2020 #33

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Jun 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion module2/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,10 @@ <h3>Łukasz Ziobroń</h3>
5. <!-- .element: class="fragment fade-in" --> klasy abstrakcyjne
6. <!-- .element: class="fragment fade-in" --> interfejsy
7. <!-- .element: class="fragment fade-in" --> polimorfizm
8. <!-- .element: class="fragment fade-in" --> `static`
8. <!-- .element: class="fragment fade-in" --> pola i metody statyczne

Możliwe, że dzisiaj nie przerobimy wszystkiego. Będzie na kolejną lekcję :)
<!-- .element: class="fragment fade-in" -->

</textarea>
</section>
Expand Down Expand Up @@ -110,6 +113,10 @@ <h3>Łukasz Ziobroń</h3>
data-separator-vertical="^___"
data-separator-notes="^Note:">
</section>
<section data-markdown="presentation_homework.md"
data-separator-vertical="^___"
data-separator-notes="^Note:">
</section>
<!-- section data-markdown="presentation_solutions.md"
data-separator-vertical="^___"
data-separator-notes="^Note:">
Expand Down
Binary file added module2/oop2.pdf
Binary file not shown.
148 changes: 148 additions & 0 deletions module2/presentation_homework.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
<!-- .slide: data-background="#111111" -->

# Programowanie obiektowe

## Podsumowanie

<a href="https://coders.school">
<img width="500" data-src="../coders_school_logo.png" alt="Coders School" class="plain">
</a>

___

## Co pamiętasz z dzisiaj?

### Napisz na czacie jak najwięcej haseł
<!-- .element: class="fragment fade-in" -->

1. <!-- .element: class="fragment fade-in" --> dziedziczenie
2. <!-- .element: class="fragment fade-in" --> wielodziedziczenie
3. <!-- .element: class="fragment fade-in" --> funkcje wirtualne
4. <!-- .element: class="fragment fade-in" --> funkcje czysto wirtualne
5. <!-- .element: class="fragment fade-in" --> klasy abstrakcyjne
6. <!-- .element: class="fragment fade-in" --> interfejsy
7. <!-- .element: class="fragment fade-in" --> polimorfizm
8. <!-- .element: class="fragment fade-in" --> pola i metody statyczne

___

### Pre-work

* Dowiedzcie się czym jest problem diamentowy
* Poczytajcie o zasadach SOLID, dotyczących pisania dobrego kodu obiektowego
* Lektura o wzorcach projektowych z przykładami w C++ - [refactoring.guru](https://refactoring.guru/design-patterns)
* 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.

___

## Projekt grupowy

Wykorzystajcie kod napisany podczas zajęć. Możecie też skorzystać z kodu w katalogu [solutions](solutions)

Projekt grupowy - kontynuacja. Możecie zmienić grupę jeśli chcecie ;)

___

## Organizacja prac

* Jak wyglądało wasze daily?
* Czy Code Review nie jest zaniedbane?
* Czy współpraca idzie gładko?
* Zróbcie sobie retrospektywę :)

___

### Punktacja

* 3 pierwsze zadania - 5 punktów
* zadania 4, 5, 6 - 8 punktów
* 20 punktów za dostarczenie wszystkich 6 zadań przed 05.07.2020 (niedziela) do 23:59
* brak punktów bonusowych za dostarczenie tylko części zadań przed 05.07
* 6 punktów za pracę w grupie dla każdej osoby z grupy.

___

## Zadanie 1

Napisz klasę `Store`, która będzie umożliwiała dokonywanie zakupów. Wykorzystaj poniższy enum i funkcje.

```cpp
enum class Response {done, lack_of_money, lack_of_cargo, lack_of_space};

Response buy(Cargo* cargo, size_t amount, Player* player);
Response sell(Cargo* cargo, size_t amount, Player* player);
```

___

## Zadanie 2

W klasach `Alcohol`, `Fruit`, `Item` dopisz brakujące metody oraz ich implementacje.

```cpp
// override from Cargo
size_t getPrice() const override;
std::string getName() const override { return name_; }
size_t getAmount() const override { return amount_; }
size_t getBasePrice() const override { return base_price_; }
Cargo& operator+=(size_t amount) override;
Cargo& operator-=(size_t amount) override;
bool operator==(Cargo& cargo) const override;
```

___

## Zadanie 3

Dopisz do klasy `Ship`, `Cargo` oraz `Stock` metodę `nextDay()`

* Klasa `Ship`: Metoda powinna odejmować po 1 sztuce monety za każdego członka załogi.
* Klasa `Cargo`: Metoda powinna powodować psucie się towarów.
* Klasa `Stock`: Metoda powinna zmieniać ilość towaru w sklepach.

___

## Zadanie 4 (dla ambitnych)

Spróbuj napisać klasę `Time`, która będzie odpowiadać za zarządzanie czasem w grze.

Klasa ta powinna informować inne klasy, takie jak `Cargo`, `Ship`, `Stock` o upłynięciu każdego dnia.

Poczytaj czym jest wzorzec projektowy [`Observer`](https://refactoring.guru/design-patterns/observer).

___

## Zadanie 5 (dla ambitnych)

Napisz zaprzyjaźniony operator wypisywania do strumienia

```cpp
friend std::ostream& operator<<(std::ostream& out, const Store& store);
```

Ma on w przystępny sposób wypisywać towar, jaki znajduje się w danym sklepie.

___

## Zadanie 6 (dla ambitnych)

Napisz klasę `Game`, która zarządzać będzie całą rozgrywką.

Dodaj jej jedną metodę publiczną `startGame()`.

Finalnie plik main powinien wyglądać tak:

```cpp
#include "Game.hpp"

constexpr size_t start_money = 1'000;
constexpr size_t game_days = 100;
constexpr size_t final_goal = 2'000;

int main() {
Game game(start_money, game_days, final_goal);
game.startGame();

return 0;
}
```
60 changes: 50 additions & 10 deletions module2/presentation_inheritance.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@ ___
## Wprowadzenie do dziedziczenia

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

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ć.
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ć.
<!-- .element: class="fragment fade-in" -->

___

Expand Down Expand Up @@ -126,35 +128,46 @@ private:
Keyboard keyboard_;
};
```
<!-- .element: class="fragment fade-in" -->

___

## Klasy bazowe i pochodne

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

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

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

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

___

### Co z metodami klas `Laptop` i `Tablet`, czy można wydzielić kolejną klasę?
### Co z metodami klas `Laptop` i `Tablet`?

#### Czy można wydzielić kolejną klasę?
<!-- .element: class="fragment fade-in" -->

```cpp
void display();
void getUserInput();
```
<!-- .element: class="fragment fade-in" -->

___

## Klasa `Screen` i `TouchScreen`

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

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

<style>
.container {
Expand All @@ -181,6 +194,7 @@ private:
Monitor monitor_;
};
```
<!-- .element: class="fragment fade-in" -->

</div>

Expand All @@ -199,12 +213,14 @@ private:
Monitor monitor_;
};
```
<!-- .element: class="fragment fade-in" -->

</div>

</div>

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

___

Expand All @@ -220,7 +236,10 @@ private:

Monitor monitor_;
};
```
<!-- .element: class="fragment fade-in" -->

```cpp
class TouchScreen : public Screen {
public:
void getUserInput();
Expand All @@ -229,10 +248,11 @@ private:
void displayKeyboard();
};
```
<!-- .element: class="fragment fade-in" -->

___

## Wielodziedziczenie #1
## Wielodziedziczenie

```cpp
class Screen {
Expand Down Expand Up @@ -279,13 +299,25 @@ class Tablet : public Computer,

___

## Wielodziedziczenie #2
## Wielodziedziczenie - disclaimer

Wielodziedziczenie to dziedziczenie z kliku klas bazowych.

Wybór implementacji zależy od programisty.
<!-- .element: class="fragment fade-in" -->

Nie zawsze wielodziedziczenie będzie lepszym rozwiązaniem.
<!-- .element: class="fragment fade-in" -->

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.
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.
<!-- .element: class="fragment fade-in" -->

Najwyżej trzeba będzie refaktoryzować program ;)
<!-- .element: class="fragment fade-in" -->

___

## Wielodziedziczenie - problemy #1
## Dziedziczenie - problemy

```cpp
struct Bird {
Expand All @@ -308,7 +340,7 @@ struct Hummingbird {
___
<!-- .slide: style="font-size: 0.9em" -->

## Wielodziedziczenie - problemy #2
## Dziedziczenie - zasada LSP

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

Expand All @@ -335,4 +367,12 @@ uniknąć podobnych problemów.

___

### Dla ciekawskich

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.

Możecie też poczytać o wszystkich zasadach SOLID.

___

## Q&A
Loading