Top Banner
CZYM JEST ZŁOŻONOŚĆ? Identyfikacja i rozwiązywanie podstawowych problemów Ciprian Alexandru Pitis
40

Czym jest złożoność ?

Aug 05, 2015

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Czym jest złożoność ?

CZYM JEST ZŁOŻONOŚĆ?Identyfikacja i rozwiązywanie podstawowych problemów

Ciprian Alexandru Pitis

Page 2: Czym jest złożoność ?

O mnie

GOG.comSenior Web Developer

Czym się zajmuję?Rozwijam i utrzymuję kod

W międzyczasie szukam złotego Graala designu aplikacji ;)

Page 3: Czym jest złożoność ?

GOG.com

Historia Start w 2008 pod skrzydłami CD Projekt - zespół 10 osóbObecnie zatrudnionych jest ponad 70 osób

Obecna pozycja

#1 globalnej dystrybucji klasycznych gier na PC i Mac #2 globalnej dystrybucji gier indie na PC i Mac

Partnerzy 220+ twórców i wydawców gier

Klienci Ponad 2.7 miliona unikalnych wejść miesięcznie z całego świata

Gry Ponad 800 tytułów w kataloguPonad 39 milionów gier na kontach użytkowników

Page 4: Czym jest złożoność ?

Agenda

1. Czym jest złożoność?

2. Dlaczego złożoność jest problematyczna?

3. Złożoność a design kodu

4. Złożoność poznawcza

5. Podsumowanie i wnioski

Page 5: Czym jest złożoność ?

Czym jest złożoność?

CZYM JEST ZŁOŻONOŚĆ?

• Trudność w zrozumieniu, wykonaniu i zweryfikowaniu poprawności projektu.

• Im większa liczba możliwych interakcji w procesie, tym więcej rzeczy może pójść nie tak.

Page 6: Czym jest złożoność ?

Dlaczego złożoność jest problematyczna?

CZŁOWIEK TO NIE MASZYNA

• Ludzki umysł nie może ogarnąć nieskończonej ilości informacji.

• Według badań, człowiek może myśleć o maksymalnie 4 rzeczach na raz.

• Zbyt dużo informacji na raz to ryzyko nieświadomej pomyłki.

Page 7: Czym jest złożoność ?

Dlaczego złożoność jest problematyczna?

TOKSYCZNY WPŁYW NA PROJEKT

• Złożoność rodzi złożoność.

• Zamiast myśleć o istocie problemu i sposobie rozwiązania musimy myśleć o stanie obecnym i o tym jak zaadaptować się do nowych warunków.

Page 8: Czym jest złożoność ?

Złożoność a design kodu

PODSTAWOWE METRYKI

Cyclomatic Complexity (CC)

Liczba linearnie niezależnych ścieżek, w kodzie z jednym punktem wyjścia równa jest liczbie punktów decyzyjnychNPath Complexity (NP) Liczba możliwych różnych przebiegów w kodzie

Afferent Coupling (CA) Liczba klas, które polegają na danej implementacji

Efferent Coupling (CE) Liczba klas, na których polega dana klasa

Stability (I) Wartość: CE / (CA + CE), określa ogólną stabilność,0 to całkowita stabilność, 1 to całkowita niestabilność

Page 9: Czym jest złożoność ?

Złożoność a design kodu

function fizzBuzz($n)

{

$output = "";

if ($output % 3 == 0) {

$output .= "Fizz";

}

if ($output % 5 == 0) {

$output .= "Buzz";

}

return $output;

}

Page 10: Czym jest złożoność ?

Złożoność a design kodu

REKOMENDOWANE LIMITY (wg PMD i phpMD)

• CC <= 10

• NPath <= 200

• Powyżej podanych metryk, kod przeważnie zaczyna robić się trudnydo zrefaktorowania i zrozumienia.

http://phpmd.org/rules/index.html#code-size-rules

Page 11: Czym jest złożoność ?

Złożoność a design kodu

TESTY JEDNOSTKOWE

• Chronią przed niepożądanymi zmianami.

• Pozwalają na bardziej swobodną refaktoryzację.

Page 12: Czym jest złożoność ?

Złożoność a design kodu

• Kod ma 100% code coverage, 100% path coverage.

• Jesteśmy kryci przed każdą pomyłką?

• .. niestety nie. Ale prawie.

$this->assertEquals(fizzBuzz(2) == "");

$this->assertEquals(fizzBuzz(9) == "Fizz");

$this->assertEquals(fizzBuzz(10) == "Buzz");

$this->assertEquals(fizzBuzz(30) == "FizzBuzz");

Page 13: Czym jest złożoność ?

Złożoność a design kodu

ROZBIJANIE PROBLEMÓW:SEPARATION OF CONCERNS

• Nasze aplikacje rozwiązują jakiś (duży) problem, najczęściej biznesowy.

• Każdy problem można rozbić na więcej pod-problemów.

Page 14: Czym jest złożoność ?

Złożoność a design kodu

OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA

PRZESŁANIE OBIEKTUREQUEST DO KONTROLERAURUCHOMIENIE BUNDLI STWORZENIE OBIEKTU

REQUEST

WYBRANIE ROUTE’A NAPODSTAWIE ŚCIEŻKIŻĄDANIA HTTP

ODESŁANIE ODPOWIEDZI

WYTWORZENIE OBIEKTU TYPU RESPONSE

ODPYTANIE BAZY DANYCHO ŻĄDANE INFORMACJE

GENERACJA WIDOKUDLA UŻYTKOWNIKA

URUCHOMIENIE INNYCHŻĄDANYCH PROCESÓW

ZAPYTANIE DOBAZY DANYCH

GENERACJASZABLONÓW TWIG

ZAPYTANIEDO CACHE

OTRZYMANIE OBIEKTU TYPU RESPONSE

Page 15: Czym jest złożoność ?

Złożoność a design kodu

OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA

URUCHOMIENIE BUNDLI STWORZENIE OBIEKTUREQUEST

WYBRANIE ROUTE’A NAPODSTAWIE ŚCIEŻKIŻĄDANIA HTTP

PRZESŁANIE OBIEKTUREQUEST DO KONTROLERA

WYTWORZENIE OBIEKTU TYPU RESPONSE

ODPYTANIE BAZY DANYCHO ŻĄDANE INFORMACJE

GENERACJA WIDOKUDLA UŻYTKOWNIKA

URUCHOMIENIE INNYCHŻĄDANYCH PROCESÓW

ZAPYTANIE DOBAZY DANYCH

GENERACJASZABLONÓW TWIG

ZAPYTANIEDO CACHE

Page 16: Czym jest złożoność ?

Złożoność a design kodu

OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA

URUCHOMIENIE BUNDLI STWORZENIE OBIEKTUREQUEST

WYBRANIE ROUTE’A NAPODSTAWIE ŚCIEŻKIŻĄDANIA HTTP

PRZESŁANIE OBIEKTUREQUEST DO KONTROLERA

WYTWORZENIE OBIEKTU TYPU RESPONSE

URUCHOMIENIE INNYCHŻĄDANYCH PROCESÓW

GENERACJA WIDOKUDLA UŻYTKOWNIKA

GENERACJASZABLONÓW TWIG

ODPYTANIE BAZY DANYCHO ŻĄDANE INFORMACJE

ZAPYTANIE DOBAZY DANYCH

ZAPYTANIEDO CACHE

Page 17: Czym jest złożoność ?

Złożoność a design kodu

OBSŁUŻENIE ŻĄDANIA HTTP KLIENTA

PRZESŁANIE OBIEKTUREQUEST DO KONTROLERAURUCHOMIENIE BUNDLI STWORZENIE OBIEKTU

REQUEST

WYBRANIE ROUTE’A NAPODSTAWIE ŚCIEŻKIŻĄDANIA HTTP

WYTWORZENIE OBIEKTU TYPU RESPONSE

URUCHOMIENIE INNYCHŻĄDANYCH PROCESÓW

GENERACJA WIDOKUDLA UŻYTKOWNIKA

GENERACJASZABLONÓW TWIG

ODPYTANIE BAZY DANYCHO ŻĄDANE INFORMACJE

ZAPYTANIE DOBAZY DANYCH

ZAPYTANIEDO CACHE

ODESŁANIE ODPOWIEDZI

OTRZYMANIE OBIEKTU TYPU RESPONSE

Page 18: Czym jest złożoność ?

Złożoność a design kodu

DOBRE OBIEKTY TO MAŁE OBIEKTY

• Uniwersalna zasada: „preferuj gęstszą sieć mniejszych obiektów od rzadszej

sieci większych obiektów” - Nigel Thorne

• Single Responsibility Principle

• Design By Contract (Liskov Substitute Principle)

• Dependency Inversion Principle

• Interface Segregation Principle

• Tell, don’t ask

http://stackoverflow.com/questions/243274/best-practice-with-unit-testing-abstract-classes

Page 19: Czym jest złożoność ?

Złożoność a design kodu

SINGLE RESPONSIBILITY PRINCIPLE

• Każdy obiekt powinien mieć jedną odpowiedzialność.

• “Odpowiedzialność to powód do modyfikacji” - Robert C. Martin

Page 20: Czym jest złożoność ?

Złożoność a design kodu

class AppKernel { … }

class Controller { … }

class TwigEngine implements EngineInterface { … }

Page 21: Czym jest złożoność ?

Złożoność a design kodu

DESIGN BY CONTRACT

• Wprowadzenie jasnego kontraktu umożliwia jawne przekazanie informacji.

• Te informacje to m.in to, czego dana klasa oczekuje, co i w jakim wypadku zwraca, a także wyjątki które może zwrócić i co one oznaczają.

• Brak typów wartościowych (int, string…) oraz zwracanych wartości w PHP niestety to utrudniają, ale annotacje PHPDoc (@param, @return, @throws) i dobre IDE pomagają w utrzymaniu dyscypliny.

Page 22: Czym jest złożoność ?

Złożoność a design kodu

interface UserRepository {

public function findOne(UserId $userId);

}

class MysqlUserRepository {

private $connection;

public function __construct(Connection $connection) {

$this->connection = $connection;

}

public function findOne(UserId $userId) {

return $this->connection->query("SELECT * from users WHERE id = :uid", [$userId->value()]);

}

}

class InMemoryUserRepository { […] }

Page 23: Czym jest złożoność ?

Złożoność a design kodu

DEPENDENCY INVERSION PRINCIPLE

• Nie powinno być „hierarchii klasowej”. Zamiast tego, wszystko powinno być zależne od abstrakcyjnych interfejsów.

• Abstrakcja nie powinna polegać na implementacji (to ma być złączone z poniższym).

• Implementacja powinna polegać na abstrakcji.

Page 24: Czym jest złożoność ?

Złożoność a design kodu

class BlogController {

public function __construct(BlogPagesRepository $repository ) { … }

}

interface BlogPagesRepository { … }

class MysqlBlogPagesRepository implements BlogPagesRepository { … }

class MongoDbPagesRepository implements BlogPagesRepository { … }

Page 25: Czym jest złożoność ?

Złożoność a design kodu

INTERFACE SEGREGATION PRINCIPLE

• Klient nie powinien zależeć od metod, którego nie potrzebuje.

• Ułatwia tworzenie implementacji do granularnych interfejsów.

Page 26: Czym jest złożoność ?

Złożoność a design kodu

interface VisitorInterface {

public function getIP();

}

interface UserInterface {

public function getId();

}

class HttpUser implements VisitorInterface, UserInterface { … }

class Crawler implements VisitorInterface { … }

class CliUser implements UserInterface { … }

Page 27: Czym jest złożoność ?

Złożoność a design kodu

TELL, DON’T ASK

• Mów obiektom co mają robić, nie pytaj ich o stan.

• Stawiaj warunki tam, gdzie są one zasadne dla danego problemu.

Page 28: Czym jest złożoność ?

Złożoność a design kodu

// BasketController.php

if($customer->getCountOfItemsInBasket() < 3) {

$customer->addToBasket($item);

}

ŹLE (IMPLEMENTACJA KLASY CUSTOMER WYCIEKA DO KONTROLERA):

Page 29: Czym jest złożoność ?

Złożoność a design kodu

//BasketController.php

$customer->addToBasket($item);

//Customer.php

public function addToBasket($item) {

if($this->getCountOfItemsInBasket() < 3) {

[…]

}

}

DOBRZE:

Page 30: Czym jest złożoność ?

Złożoność a design kodu

KORZYŚCI ZE STOSOWANIA

• Odizolowanie problemów od siebie = Większa elastyczność

• Mniejsze problemy = Mniejsza złożoność

Page 31: Czym jest złożoność ?

Złożoność a design kodu

SCOPE

• Każdy kod posiada jakiś scope, w którym ma zadeklarowane swoje wartości.

• Wszystkie dane w scopie powinny być mu jawnie przekazane poprzez parametry.

Page 32: Czym jest złożoność ?

Złożoność a design kodu

PROBLEMY ZE SCOPE’EM

• Global variable: global $var;

• Mutability: setFoo($foo) - Dla obiektów które nie przenoszą danych

• Zależność od implementacji

Page 33: Czym jest złożoność ?

Złożoność a design kodu

POMOCNE NARZĘDZIA

phpMD Na podstawie reguł alarmuje Nas, gdy dana klasa/metoda może okazać się problematyczna w utrzymaniu

PHP Code Sniffer Sprawdza zgodność z standardami PSR

PHP Code Analyzer Wykonuje analizę statyczną kodu, inferencję typów , wykrywa proste błędy

Solidne IDE Wspomaga pisanie i formatowanie kodu, minimalizuje ryzyko wystąpienia pomyłki mechanicznej ( syntax error, zły typ, zła klasa, zła metoda.. etc. )

Page 34: Czym jest złożoność ?

Złożoność poznawcza kodu

ZŁOŻONOŚĆ KOGNITYWNA

• Jawność tego, co dzieje się w kodzie dla osoby czytającej

• Często pomijana (ze względu na swoją „nietechniczność”), ale jest nie mniej ważna od złożoności samego kodu

Page 35: Czym jest złożoność ?

Złożoność poznawcza kodu

ODBIÓR JEST WSZYSTKIM

• Czytelność kodu (Coding Style)

• Język wykorzystywany w aplikacji

• Domain Driven Design, Ubiquitous Language - metodologia, która minimalizuje narzut w odbiorze

Page 36: Czym jest złożoność ?

Podsumowanie i wnioski

WNIOSKI

• Zdanie sobie sprawę z tego, co dokładnie sprawia, że kod ciężej utrzymać to pół sukcesu.

• Pisanie łatwego kodu jest trudne - przepisanie trudnego kodu może byćjeszcze trudniejsze.

• Sprawdzone rozwiązania z zakresu projektowania aplikacji pomagają w ograniczeniu złożoności aplikacji do koniecznego minimum.

• Czytelność i nazewnictwo są tak samo ważne co sam kod.

Page 37: Czym jest złożoność ?

Podsumowanie i wnioski

CO ZYSKUJE DEVELOPER I PRODUCT OWNER?

• Czas

• Elastyczność w adaptacji do nowych wymogów biznesowych

• Elastyczność w tworzeniu technicznych implementacji

• Podatność na zmiany, odporność na uszkodzenia produktu

Page 38: Czym jest złożoność ?

PYTANIA?

Page 39: Czym jest złożoność ?

SZUKAMY WEBDEVÓWWięcej informacji u mnie lub na stronie GOG.com/work

Page 40: Czym jest złożoność ?

DZIĘKUJĘ ZA UWAGĘ…i zapraszam potem do dyskusji przy pizzy ;)