Ať se postará někdo jiný, najmeme si programátory z Číny. Čuníkům vstup zakázán.

Slides:



Advertisements
Podobné prezentace
Pro začátek něco lehčího
Advertisements

(instance konkrétní třídy)
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Funkce Připomeňme si program pro výpočet faktoriálu:
Špička v každém směru IT 3 Produktivita práce s Eclipse.
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
„Programátor by měl být v prvé řadě líný.“. PIFovo Web API (API = Application Programming Interface)
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Počítače a programování 1. Obsah přednášky Výjimky - základní typy výjimek Způsoby zpracování výjimek.
C# pro začátečníky Mgr. Jaromír Osčádal
Programování v C++ Cvičení.
Čtvrté cvičení Objektové programování Objektový model v Javě
Ensemble pro rychlejší tvorbu Caché aplikací Využijte infrastrukturu Ensemble pro své aplikace.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
Hana Kotinová Struktura a cíl práce Metody předzpracování dat Systémy předzpracování dat Historie vývoje DPT Jak program pracuje Budoucnost.
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
TNPW1 Technologie pro publikování na webu Cvičení č. 3 Nadpisy Martin Adámek.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Dependency injection Jiří Matula Neruším? Ráda bych vám pomohla
C# - Exceptions (výjimky)
Objektové orientované programování Objektově orientované problémy v PHP Lukáš Masopust 2008.
Objektové programování
C# - funkce a procedury Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
Dependency injection Předávání závislostí Petr Kalivoda
6. cvičení Polymorfismus
Alg91 Textové soubory Na rozdíl od jiných typů souborů jsou textové soubory určené pro gramotné lidské oko. Textový soubor je posloupnost znaků členěná.
Číslo šablony: III/2 VY_32_INOVACE_P4_3.8 Tematická oblast: Aplikační software pro práci s informacemi II. Databáze – základy SQL Typ: DUM - kombinovaný.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Šesté cvičení Výjimky Balíky.
123.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
POSLOUPNOST úkol 1_41. ZADÁNÍ Sestavte program, který doplní tabulku nepřímé úměrnosti pro hodnoty proměnné x = 1, …, n. Nepřímá úměrnost je zadána uživatelem.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
ADO.NET – object Connection Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Vzdálená správa Tomáš Kalný.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
Jak psát „Čistý kód“ A hlavně se v něm pak neztratit Jan Pospíšil Senior Technology
NÁZEV ŠKOLY:SOŠ Net Office, spol. s r.o. Orlová Lutyně
SOLID principy v OOP návrhu
Výukový materiál zpracován v rámci projektu
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Výukový materiál zpracován v rámci projektu
Výukový materiál zpracován v rámci projektu
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Bridge.
C# přehled vlastností.
Přednáška 9 Triggery.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Dfdfdf.
SIPVZ – úvodní modul P ICT a změny ve výuce (2 h) metodické poznámky.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Transkript prezentace:

Ať se postará někdo jiný, najmeme si programátory z Číny. Čuníkům vstup zakázán

Co budeme dneska dělat? Zopakujeme si základní principy DI. Dozvíme se, jak může DI usnadnit programování. Ukážeme si, jak psát přehlednější a čitelnější kód. Předvedeme si, jak se zbavit skrytých závislostí v kódu a statického volání. Vše si demonstrujeme na příkladu z praxe, který si společně zkritizujeme a opravíme. V čem je to dobré? Minimálně se vyznáte ve vlastním kódu, i když se na něj podíváte třeba za půl roku.

Dependency Injection Jak poznám, že je třída závislá na jiné třídě? Co je to skrytá závislost? V čem nám DI pomáhá? Jaké znáte typy DI? Dependency Injection ≠ čistý kód DI + ≠ jen k němu vede

Dependency Injection Vychází z návrhového vzoru Inversion of Control. Odebírá třídám odpovědnost za vytváření objektů, na kterých jsou závislé. Řízení je delegováno na nadřazený objekt.

Klasický přístup public class Computer() { private OsuNetwork network; public Computer() { this.network = new OsuNetwork(); } Připojení k síti je služba, ne součást počítače. Vzniká připojení k síti uvnitř počítače?

Použití DI public class Computer() { private OsuNetwork network; // Constructor Injection public Computer(OsuNetwork network) { this.network = network; } // Setter Injection public void setOsuNetwork(OsuNetwork network) { this.network = network; } Kde seženu připojení k síti? „Ať se postará někdo jiný.“ Výrobce počítače se nemusí starat o připojení k síti, to řeší uživatel počítače (třídy počítač)

Použití DI a rozhraní public class Computer() { private Network network; // Constructor Injection public Computer(Network network) { this.network = network; } // Setter Injection public void setNetwork(Network network) { this.network = network; }

Dependency Injection Závislost na jiných objektech jasně deklarujeme v konstruktoru třídy nebo v jejich metodách. Použití operátoru new uvnitř třídy je skrytá závislost. Použití statického volání uvnitř třídy je skrytá závislost. Výjimku tvoří primitivní typy a nativní třídy jazyka. new Class() Class.getInstance()

Homer a závislosti

Příklad na cvičení Příklad ke cvičení je ke stažení na následující adrese

Příklad na cvičení public class Application { public Application() { Article article = new Article(); article.setHeadline("Nadpis článku"); article.setText("Text článku"); article.save(); } Kam se článek uloží? Do souboru nebo do databáze? Jakou databázi používám? Jaké jsou parametry připojení?

Já myslel/a, že to víš … Když něco potřebuju, tak si o to řeknu! Třída Article nemá žádné viditelné závislosti, ale opravdu je nemá? Co se stane, když smažeme všechny ostatní třídy? article->save(); // ERROR: Class MysqlStorage not found // ERROR: Class DatabaseConfig not found Kdo by to čekal?

Statické peklo v akci public class Article { private String headline; private String text; public void save() { MysqlStorage storage = MysqlStorage.getConnection(); storage.executeQuery("INSERT INTO articles…“); } Jaký návrhový vzor jsme použili? Nápověda: Class.getInstance(); Jedná se o porušení DI? Jaké je řešení?

Řešení? public class Article { private String headline; private String text; public void save(MysqlStorage storage) { storage.executeQuery("INSERT INTO articles…“); } Bude to fungovat? Co ještě musíme upravit?

Zase o krok dále… Třída MysqlStorage je singleton. Převedeme ji na klasickou třídu s veřejným konstruktorem. public MysqlStorage() { DatabaseConfig config = new DatabaseConfig(); this.server = config.getServer(); // some code } Je to v pořádku? Jsou všechny závislosti nahlášeny?

Je to v pořádku? public MysqlStorage(DatabaseConfig config) { this.server = config.getServer(); // some code }

K zamyšlení … public class Article { private String headline; private String text; public void save(MysqlStorage storage) { storage.executeQuery("INSERT INTO articles…“); } Je správné, aby třída Article věděla o struktuře DB? Co když budeme chtít uložit článek do souboru?

Upravte kód public class Article { private String headline; private String text; public void save(Storage storage) { storage.save(this); } Nesmíte zasáhnout do třídy MysqlStorage ani FileStorage

Jak zajistit společné rozhraní? public class FileStorage { public void save(Article article) { System.out.println("Article was saved to file"); } public class MysqlStorage { public void executeQuery(String query) { System.out.println("Record was saved to database (" + query + ")"); }

Použijeme adapter Návrhový vzor adaptér použijeme, pokud potřebujeme, aby třída měla jiné rozhraní než to, které právě má. Adaptér slouží jako prostředník mezi prostředím, které požaduje nějaké rozhraní, a třídou, jejíž rozhraní neodpovídá požadovanému. Umožňuje tedy spolupráci třídám, které by spolu jinak nespolupracovaly.

Je to lepší? public Application() { Article article = new Article(); article.setHeadline("Nadpis článku"); article.setText("Text článku"); DatabaseConfig config = new DatabaseConfig(); MysqlStorage mysqlStorage = new MysqlStorage(config); DatabaseStorage databaseStorage = new DatabaseStorage(mysqlStorage); article.save(databaseStorage); }

Sestavení závislostí pomocí containeru Application DI container

@Inject – ohlášení DI containeru, že má obsloužit – označení třídy jako

S použitím DI public Application(Article article, Storage storage) { article.setHeadline("Nadpis článku"); article.setText("Text článku"); article.save(storage); }

Úkol Vytvořte jinou třídu, která má závislost na rozhraní Storage. Přihlašte se k závislosti a sledujte v konzoli, kolikrát se vytvoří připojení k DB. Jak použít singleton spolu s DI?

A jak to dopadlo public DatabaseStorage(MysqlStorage storage) { this.storage = storage; } Hurá, singleton se vrátil! Win: databázové připojení se vytvoří jen jednou. Win: žádné skryté závislosti.

Rekapitulace: proč zvolit DI? Jasné vazby mezi objekty, pravdivý a předvídatelnější kód, přehlednější, lépe upravitelný, žádné statické volání, znovu použitelnost kódu, mnohem lepší testovatelnost.

Zvládli jsme to!