PB161 Programování v jazyce C++ Přednáška 11

Podobné dokumenty
PB161 Programování v jazyce C++ Přednáška 8

PB161 Programování v jazyce C++ Přednáška 2

PB161 Programování v jazyce C++ Přednáška 2

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 9

Dědění, polymorfismus

PB161 Programování v jazyce C++ Přednáška 4

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

PB161 Programování v jazyce C++ Přednáška 4

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 1

8 Třídy, objekty, metody, předávání argumentů metod

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

1. Programování proti rozhraní

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Dědičnost a polymorfismus

IB111 Úvod do programování skrze Python Přednáška 7

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Programování v C++ 2, 4. cvičení

PB161 Programování v jazyce C++ Přednáška 10

Základy objektové orientace I. Únor 2010

Programování v C++ 1, 6. cvičení

PB161 Základy OOP. Tomáš Brukner

IB111 Úvod do programování skrze Python Přednáška 13

Návrhové vzory OMO, LS 2014/2015

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Vyřešené teoretické otázky do OOP ( )

Programování v C++ 1, 5. cvičení

Programování v C++ 2, 8. cvičení

Úvod do programovacích jazyků (Java)

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

typová konverze typová inference

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

PREPROCESOR POKRAČOVÁNÍ

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Mělká a hluboká kopie

Generické programování

Programování v C++ 2, 7. cvičení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektově orientované programování. Úvod

PB161 Programování v jazyce C++ Přednáška 10

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

PB161 Programování v jazyce C++ Přednáška 8

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

UJO Framework. revoluční architektura beans. verze

Programování v jazyce C a C++

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Objektově orientované programování v jazyce Python

, Brno Připravil: David Procházka Návrhové vzory

Abstraktní třídy, polymorfní struktury

Principy OOP při tvorbě aplikací v JEE. Michal Čejchan

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík,2016

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Funkční objekty v C++.

Výčtový typ strana 67

PB přednáška (23. listopadu 2015)

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Abstraktní třída a rozhraní

PB161 Programování v jazyce C++ Přednáška 3

PŘETĚŽOVÁNÍ OPERÁTORŮ

Programování v C++ 3, 3. cvičení

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

konstruktory a destruktory (o)

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

11. Přehled prog. jazyků

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

20. Projekt Domácí mediotéka

Jazyk C# (seminář 6)

Programování II. Polymorfismus

Programování II. Úvod do dědičnosti 2018/19

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB přednáška (21. září 2015)

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Objektově orientované programování v jazyce Python

Softwarové komponenty a Internet

Principy objektového návrhu. Přednáška 8, LS 2013/2014

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Programování v jazyce C a C++

3. Třídy. Základní pojmy objektového programování. Třídy

Jazyk C# (seminář 3)

Funkcionální programování. Kristýna Kaslová

Programování v C++ 1, 1. cvičení

PB161 programování v C++ Výjimky Bezpečné programování

24. listopadu 2013, Brno Připravil: David Procházka

Dynamická alokace paměti

Dynamicky vázané metody. Pozdní vazba, virtuální metody

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Jazyk C++, některá rozšíření oproti C

Transkript:

PB161 Programování v jazyce C++ Přednáška 11 Návrhové principy a vzory Sémantika objektů v C++ a jinde Nikola Beneš 30. listopadu 2015 PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 1 / 32

Organizační poznámky Zápočtový příklad na cvičení tento týden (30. 11. 4. 12.) nanečisto poslední týden (14. 18. 12.) naostro náhradní termín začátkem ledna bude upřesněno podle počtu lidí Zvané přednášky příští týden (7. 12.) Jiří Weiser: C++11 podrobněji poslední týden (14. 12.) Juraj Michálek & Martin Halfar (YSoft): refaktorizace, návrhové antivzory PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 2 / 32

Návrhové principy a vzory PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 3 / 32

Návrhové principy v OOP Jak správně navrhnout hierarchii v OOP? co umístit do jedné třídy? jaký vztah mezi třídami? Jak se pozná špatný návrh? malé změny vyžadují velké úpravy změny způsobí nečekané problémy velká provázanost (s konkrétní aplikací, s jiným kódem) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 4 / 32

Návrhové principy v OOP (pokr.) Základní návrhové principy pro OOP SRP The Single Responsiblity Principle OCP The Open/Closed Principle LSP The Liskov Substitution Principle ISP The Interface Segregation Principle DIP The Dependency Inversion Principle https: //en.wikipedia.org/wiki/solid_(object-oriented_design) (odkazy v části References) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 5 / 32

Principy SOLID The Single Responsiblity Principle Třída by měla mít jediný důvod ke změně. obecnější princip: každý se stará o jednu věc Důsledky porušení změna jedné z funkcionalit vyžaduje rekompilaci úprava kódu poruší více funkcionalit PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 6 / 32

Principy SOLID Příklad porušení SRP [ukázka] třída Rectangle zároveň vykresluje čtverec a počítá jeho obsah někteří uživatelé potřebují obě tyto funkcionality, někteří jen jednu http://www.objectmentor.com/resources/articles/srp.pdf Lepší řešení rozdělit funkcionalitu Rectangle do dvou tříd o počítání obsahu se postará GeometricRectangle PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 7 / 32

Principy SOLID The Open/Closed Principle Třídy by mělo být možné rozšiřovat, ale bez jejich modifikace. nejen třídy (moduly, jiné entity) open for extension: možnost přidávat chování closed for modification: možnost použití jiným kódem dosahuje se použitím dědičnosti a abstrakce Související nepoužívat globální proměnné soukromé atributy objektů používat dynamic_cast opatrně Důsledek porušení: kaskáda změn v kódu PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 8 / 32

Principy SOLID The Liskov Substitution Principle (už jsme viděli) Potomek může zastoupit předka. funkce očekávající objekt typu předka musí fungovat s objekty typu potomka, aniž by o tom věděly úzce souvisí s OCP Důsledek porušení: neočekávané chování (špatné předpoklady) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 9 / 32

Principy SOLID Příklad porušení LSP mějme třídu Rectangle a třídu Square, která z ní dědí obě mají metody setwidth a setheight (a odpovídající get) void f(rectangle & r) { r.setwidth(5); r.setheight(6); assert(r.getwidth() * r.getheight() == 30); } kde je problém? PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 10 / 32

Principy SOLID Příklad porušení LSP mějme třídu Rectangle a třídu Square, která z ní dědí obě mají metody setwidth a setheight (a odpovídající get) void f(rectangle & r) { r.setwidth(5); r.setheight(6); assert(r.getwidth() * r.getheight() == 30); } kde je problém? čtverec je pravoúhelník, ale objekt typu Square není objektem typu Rectangle (mají jiné chování ) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 10 / 32

Principy SOLID The Interface Segregation Principle Vytvářejte specifická rozhraní pro specifické klienty. více malých rozhraní je lepší než jedno obrovské klienti by neměli být nuceni záviset na rozhraních, které nepoužívají souvisí s SRP Jak dosáhnout? rozhraní s mnoha metodami: kdo je používá? opravdu používají všichni všechny metody? rozdělit metody do samostatných rozhraní použití vícenásobné dědičnosti PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 11 / 32

Principy SOLID The Dependency Inversion Principle obecné třídy by neměly záviset na specializovaných třídách; všichni by měli záviset na abstrakcích abstrakce by neměly záviset na detailech, ale naopak souvisí s OCP a LSP použití rozhraní (čistě abstraktních tříd) Důsledky porušení: přidání podpory nového typu vede ke změně v obecné třídě obecná třída použitelná jen pro co byla implementována PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 12 / 32

Principy SOLID Příklad porušení: Řešení: třída Worker s metodou work() a třída Manager, která ji používá závislost Manager Worker co když budeme chtít přidat novou třídu SuperWorker? vytvoření abstrakce (rozhraní) IWorker závislosti Manager IWorker, Worker IWorker, PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 13 / 32

Keep It Simple, Stupid! Princip KISS jednoduché, postačující řešení může být lepší než komplikované a rafinované snazší pochopení (dalšími vývojáři, námi samotnými) menší riziko chyby kompromis mezi aktuálními a budoucími požadavky příliš mnoho budoucích požadavků návrh komplikuje omezení na aktuální požadavky vadí budoucí rozšiřitelnosti průběžný vývoj, refaktorizace (nebát se!) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 14 / 32

Návrhové vzory Motivace opakující se programátorské problémy opakující se způsoby řešení vhodné kosntrukce pro řešení: návrhové vzory kniha Design Patterns: Elements of Reusable Object-Oriented Software (23 vzorů) autoři Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (tzv. Gang of Four, GoF) existují i jiné návrhové vzory kde začít? https://en.wikipedia.org/wiki/software_design_pattern PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 15 / 32

Návrhové vzory Co je návrhový vzor? (jednoduchý) způsob, jak řešit skupiny podobných problémů opakovatelný, (víceméně) nezávislý na konkrétní aplikaci či jazyce Pozitiva Kritika řeší běžné problémy mohou zlepšovat kód a jeho udržovatelnost zbytečně složité na jednoduché problémy nadužívání může vést ke komplikovanějšímu kódu často řeší jen nedokonalost používaného jazyka PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 16 / 32

Sémantika objektů v C++ a v jiných jazycích PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 17 / 32

Sémantika objektů v C++ a v jiných jazycích aneb Jak se předávají objekty funkcím? PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 17 / 32

Sémantika objektů v C++ a v jiných jazycích aneb Jak se předávají objekty funkcím? aneb Co znamená =? PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 17 / 32

Sémantika objektů v C++ a v jiných jazycích aneb Jak se předávají objekty funkcím? aneb Co znamená =? aneb Proč není const jako final? PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 17 / 32

Sémantika objektů v C++ a v jiných jazycích aneb Jak se předávají objekty funkcím? aneb Co znamená =? aneb Proč není const jako final? Kolik jazyků umíš, tolikrát jsi programátorem. PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 17 / 32

Předávání parametrů funkcím (volání) Volání hodnotou (call by value) funkce dostane kopii parametru změny parametru ve funkci se navenek neprojeví podporuje velká řada jazyků, minimálně pro primitivní typy ve funkcionálním programování: striktní vyhodnocování PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 18 / 32

Předávání parametrů funkcím (volání) Volání hodnotou (call by value) funkce dostane kopii parametru změny parametru ve funkci se navenek neprojeví podporuje velká řada jazyků, minimálně pro primitivní typy ve funkcionálním programování: striktní vyhodnocování Volání odkazem (call by reference) parametr ve funkci je alias předaného parametru jakékoli změna parametru ve funkci se projeví navenek PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 18 / 32

Předávání parametrů funkcím (volání) Volání hodnotou (call by value) funkce dostane kopii parametru změny parametru ve funkci se navenek neprojeví podporuje velká řada jazyků, minimálně pro primitivní typy ve funkcionálním programování: striktní vyhodnocování Volání odkazem (call by reference) parametr ve funkci je alias předaného parametru jakékoli změna parametru ve funkci se projeví navenek Volání sdílením (call by sharing) něco mezi voláním hodnotou a odkazem nazýváno mnohdy různě (zdroj hádek) Java (pro objekty), Python, Ruby, PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 18 / 32

Předávání parametrů funkcím (volání) Volání hodnotou (call by value) funkce dostane kopii parametru změny parametru ve funkci se navenek neprojeví podporuje velká řada jazyků, minimálně pro primitivní typy ve funkcionálním programování: striktní vyhodnocování Volání odkazem (call by reference) parametr ve funkci je alias předaného parametru jakékoli změna parametru ve funkci se projeví navenek Volání sdílením (call by sharing) něco mezi voláním hodnotou a odkazem nazýváno mnohdy různě (zdroj hádek) Java (pro objekty), Python, Ruby, A jiné (volání jménem, vstupem/výstupem, ) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 18 / 32

Hádka o předávání parametrů Volá Python hodnotou nebo odkazem? def f(s): s.append(3) t = [1, 2] f(t) print t # [1, 2, 3] AHA! Python volá odkazem! PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 19 / 32

Hádka o předávání parametrů Volá Python hodnotou nebo odkazem? def f(s): s.append(3) t = [1, 2] f(t) print t # [1, 2, 3] AHA! Python volá odkazem! def f(s): s = [3] t = [1, 2] f(t) print t # [1, 2] AHA! Python volá hodnotou! PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 19 / 32

Hádka o předávání parametrů Volá Python hodnotou nebo odkazem? def f(s): s.append(3) t = [1, 2] f(t) print t # [1, 2, 3] AHA! Python volá odkazem! def f(s): s = [3] t = [1, 2] f(t) print t # [1, 2] AHA! Python volá hodnotou! Skutečnost? Python volá sdílením (call by sharing). PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 19 / 32

Hodnotová sémantika na nejnižší úrovni (assembler) je každé volání hodnotou Hodnotová sémantika v jazyce C void f(int x) { x += 7; } int main() { int a = 3; f(a); return a; // 3 } PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 20 / 32

Hodnotová sémantika Jazyk C a struktury typedef struct { int x, y; } MyObject; int f(myobject a) { MyObject b = { 7, 10 }; a = b; a.x += 11; return a.x + b.x; } int main() { MyObject o = { 0, 0 }; int z = f(o); return z + o.x; } PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 21 / 32

Hodnotová sémantika C nemá jinou sémantiku, ale může ji emulovat Ukazatele v C jejich hodnota je adresa v paměti emulace volání odkazem: void f(int *x) { *x += 7; } int main() { int a = 3; f(&a); return a; // 10; pozor na rozdíl mezi *x = a x = PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 22 / 32

Ukazatele v C a const dvě možnosti: ukazatel to, na co se ukazuje int main() { int x, y, z; int *px = &x; const int *py = &y; int *const pz = &z; *px = 0; px = &y; *py = 0; // CHYBA! py = &x; *pz = 0; pz = &x; // CHYBA! } PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 23 / 32

Odkazová (referenční) sémantika C++ a reference (připomenutí) reference nemůžou být nullptr reference nemůžou být přesměrovány int & rx je něco jako int * const px (s tím rozdílem, že místo rx si dosadíme *px) // C++: reference void f( int &x ) { x += 7; } // C (nebo C++): ukazatel void f( int *const px ) { *px += 7; } PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 24 / 32

Odkazová (referenční) sémantika C++ a reference (připomenutí) reference nemůžou být nullptr reference nemůžou být přesměrovány int & rx je něco jako int * const px (s tím rozdílem, že místo rx si dosadíme *px) // C++: reference void f( int &x ) { x += 7; } // C (nebo C++): ukazatel void f( int *const px ) { *px += 7; } const int & rx je něco jako const int * const px PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 24 / 32

Odkazová (referenční) sémantika Jazyk C++ a objekty (volání hodnotou) class MyObject { int x, y; public: MyObject(int, int); int getx() const; int gety() const; void setx(int); void sety(int); }; přiřazení je kopírování int f(myobject a) { MyObject b( 7, 10 ); a = b; a.setx( a.getx() + 11 ); return a.getx() + b.getx(); } int main() { MyObject o( 0, 0 ); int z = f(o); return z + o.getx(); } PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 25 / 32

Odkazová (referenční) sémantika Jazyk C++ a objekty (volání odkazem) class MyObject { int x, y; public: MyObject(int, int); int getx() const; int gety() const; void setx(int); void sety(int); }; int f(myobject & a) { MyObject b( 7, 10 ); a = b; a.setx( a.getx() + 11 ); return a.getx() + b.getx(); } int main() { MyObject o( 0, 0 ); int z = f(o); return z + o.getx(); } přiřazení je stále kopírování (reference se nedají přesměrovat) PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 26 / 32

Sémantika volání sdílením (call by sharing) Volání sdílením Java, Python, Ruby, Scheme, OCaml v Javě nazýváno volání hodnotou reference v Ruby nazýváno volání referencí poprvé popsáno 1974 Barbarou Liskov objekty jsou reference (odkazy) reference se mohou přesměrovat přiřazení je přesměrování, ne kopírování Podobnost s voláním odkazem objekty předané funkcím mohou funkce modifikovat (pomocí metod, příp. přetížených operátorů např. Python) ale přiřazení (přesměrování) objekt nemění Dá se emulovat/implementovat pomocí ukazatelů PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 27 / 32

Porovnání sémantik // C++ hodnotou // Java: sdílením void f(myobject a) { void f(myobject a) { MyObject b( 10, 12 ); MyObject b = new MyObject( 10, 12 ); a.setx( 100 ); a.setx( 100 ); a = b; a = b; a.sety( 50 ); a.sety( 50 ); b.setx( 20 ); b.setx( 20 ); } } // C++ odkazem // C++: emulace sdílení ukazatelem void f(myobject & a) { void f(myobject * a) { MyObject b( 10, 12 ); MyObject * b = new MyObject( 10, 12 ); a.setx( 100 ); a->setx( 100 ); a = b; a = b; a.sety( 50 ); a->sety( 50 ); b.setx( 20 ); b->setx( 20 ); } } PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 28 / 32

const vs. final Konstantní hodnoty (primitivní typy) Javovské final int x je v C++ const int x Konstantní reference Javovské final MyObject o je jakoby MyObject * const o v C++ není to const MyObject * o final zakazuje měnit (přesměrovat) referenci, nezakazuje měnit odkazovaný objekt PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 29 / 32

Výhody a nevýhody hodnotové sémantiky objektů Výhody rychlost objekty se mohou alokovat na zásobníku objekty mohou obsahovat jiné objekty (ne jen odkazy na ně) Nevýhody velikost objektu musí být známa při kompilaci kódu, který jej používá důsledek: nutnost překompilovat vše i při změně soukromých částí obtížnější pro pochopení, kopírování je zdroj chyb PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 30 / 32

Ještě jednou zpět k Pythonu Python umí přetěžovat operátory + v Pythonu řetězí seznamy def f(s): s += [7, 9] t = [1, 2] f(t) print t def f(s): s = s + [7, 9] t = [1, 2] f(t) print t PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 31 / 32

Ještě jednou zpět k Pythonu Python umí přetěžovat operátory + v Pythonu řetězí seznamy def f(s): s += [7, 9] t = [1, 2] f(t) print t def f(s): s = s + [7, 9] t = [1, 2] f(t) print t výsledky nebudou stejné PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 31 / 32

Ještě jednou zpět k Pythonu Python umí přetěžovat operátory + v Pythonu řetězí seznamy def f(s): s += [7, 9] t = [1, 2] f(t) print t def f(s): s = s + [7, 9] t = [1, 2] f(t) print t výsledky nebudou stejné kombinace volání sdílením a přetěžování operátorů může být neintuitivní PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 31 / 32

Shrnutí Návrhové principy je dobré o nich vědět a snažit se je dodržovat Návrhové vzory užitečná řešení častých problémů dobrý nástroj, ale nepřehánějte to s nimi Sémantiky objektů v různých jazycích existují různé sémantiky mají své výhody a nevýhody souvisí se způsobem volání funkcí syntakticky podobné jazyky mohou mít velmi různou sémantiku zdroj častých nedorozumění a překvapení Není žádný jeden dokonalý programovací jazyk. PB161 přednáška 11: návrhové principy a vzory, sémantika objektů 30. listopadu 2015 32 / 32