PowerPoint Presentation

Podobné dokumenty
PowerPoint Presentation

enum

DediĊnosť

Identity Lifecycle Management

PowerPoint Presentation

História

Microsoft PowerPoint - OOP_prednaska_10.pptx

midterm2014_1

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Objektovo orientované programovanie

Metrické konštrukcie elipsy Soňa Kudličková, Alžbeta Mackovová Elipsu, ako regulárnu kužeľosečku, môžeme študovať synteticky (konštrukcie bodov elipsy

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

midterm2019

PowerPoint Presentation

NÁVRH UČEBNÝCH OSNOV PRE 1

Identity Lifecycle Management

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

Konkurentné programovanie

2.5. Dotyčnica krivky, dotykový kužeľ. Nech f je krivka a nech P V (f) (t.j. m P (f) 1). Ak m P (f) = r a l je taká priamka, že I P (f, l) > r, potom

Microsoft Word - Priloha_1.docx

Prístup a Nastavenie pre KOMPAKT HOSTING

SK01-KA O1 Analýza potrieb Zhrnutie BCIME tím Vyhlásenie: "Podpora Európskej komisie pre výrobu tejto publikácie nepredstavuje súhlas

VSDC Free Video Editor stručný návod na používanie Link na sťahovanie softvéru: K prog

Microsoft Word - prirucka_katedry_nova

Výnimky

eKasa

eKasa

User:Andrej Sedlacek

eKasa

Microsoft Word - Argumentation_presentation.doc

Privátna zóna pre prevádzku Obsah Privátna zóna pre prevádzku 1 Obsah 1 Webová stránka 2 Úvodná stránka 2 Registrácia prevádzka/penzión

(07) Rekonštrukcia Mierového námestia kamenná dlažba alebo trávnik? sa na mestskom úrade v Trenčíne uskutočnilo stretnutie zástupcov volnéh

Snímka 1

1

Slide 1

gis5 prifuk

Finančné riaditeľstvo Slovenskej republiky 9/ORP/2019/IM Stiahnutie identifikačných a autentifikačných údajov pri ORP - rola Administrátor/Technik Inf

fm 2012 a predajňa.doc

Úvodná prednáška z RaL

iot business hub whitepaper isdd_em_New.pdf

Preco kocka stací? - o tom, ako sú rozdelené vlastné hodnoty laplasiánu v limite, ked sú velké

III. Diferenciálny počet funkcie viac premenných (Prezentácia k prednáškam, čast B) Matematická analýza IV (ÚMV/MAN2d/10) RNDr. Lenka Halčinová, PhD.

SK MATEMATICKA OLYMPIADA 2010/ ročník MO Riešenia úloh domáceho kola kategórie Z4 1. Doplň do prázdnych políčok čísla od 1 do 7 každé raz tak,

Microsoft PowerPoint - SLIDES_02DTD.ppt

Všeobecná zdravotná poisťovňa

O babirusách

Finančné riaditeľstvo Slovenskej republiky 10/ORP/2019/IM Stiahnutie identifikačných a autentifikačných údajov pri ORP - rola Administrátor Informácia

Microsoft Word - Algoritmy a informatika-priesvitky02.doc

Identity Lifecycle Management

Konkurentné programovanie

IT NEWS

eKasa

Identity Lifecycle Management

Prevádzka

Snímka 1

03_ControlFlow.dvi

Centrum vedecko-technických informácií, Odbor pre hodnotenie vedy, Oddelenie pre hodnotenie publikačnej činnosti Vyhľadávanie a práca so záznamami - C

Microsoft PowerPoint - Prog_p08.ppt

Untitled

Technická dokumentácia Logger modulu Verzia Tabuľka 1. Autori Autor Tomáš Donko Rola

Microsoft Word - skripta3b.doc

Úvod do mobilného operačného systému ANDROID

2015_07_17_zmena_doplnenie_zakona_ERP

Princípy tvorby softvéru Modelovanie domény

Microsoft Word - 6 Výrazy a vzorce.doc

prijimacky 2014 MAT 4rocne ver A.doc

(Microsoft Word Zadanie na s\372\235a\236 KROS DESIGN AWARD .doc)

MO_TČOZ_TLY_2018_2019

Agenda záverečnej práce pedagóg Celá agenda týkajúca sa záverečnej práce je dostupná v obrazovke Záverečná práca (menu Agenda pedagóga -> Záverečné pr

STRUČNÝ NÁVOD KU IP-COACHU

Matej Kendera - PDF, word, lucene, java

NSK Karta PDF

Relačné a logické bázy dát

Balíčkovanie FreeSWITCH-u pre Debian Autor: Zdenko Holeša, InžProjekt 1, KIS FRI ŽU Predkompilované balíčky Predkompilované balíčky existujú pre Debia

UNIVERZITA KOMENSKÉHO V BRATISLAVE FAKULTA MATEMATIKY, FYZIKY A INFORMATIKY Informačný systém pre materské školy Bakalárska práca 2019 Monika Vlčková

Pravidelné úlohy verzia ku dňu SEAL IT Services, s.r.o. Kontakt: SEAL IT Services, s.r.o., Topoľová 4, Bratislava 1, tel.:

Metódy dokazovanie v matematike 1 Základné pojmy Matematika exaktná veda vybudovaná DEDUKTÍVNE ZÁKLADNÉ POJMY základy každej matematickej teórie sú in

Paralelné algoritmy, cast c. 3

Používateľská príručka Obsah Používateľská príručka... 1 Administrácia servera... 2 FTP... 2 Remote Desktop... 3 Administrácia databáze:... 3 Spusteni

Žiadosť o licenčnú zmluvu na podujatie Na adrese v sekcii hlavného menu kliknete na položku Používatelia. Zobrazí sa blokové menu,

Riesenie_zasielkovna

GIS ako nástroj priestorového rozhodovania

Praktické paralelné programovanie v jazykoch C# 4.0 a C++

Architektúra a návrh Zdôvodnenie navrhnutej architektúry Systém si architektonicky môžeme rozdeliť na viacero vrstiev. Najpodstatnejšie je oddelenie z

STRUČNÝ NÁVOD KU IP-COACHU

N desitka.indd

Analýza toku dát Ján Šturc Zima 2010 Kompilátory

Informačný systém pre externú časť a písomnú formu internej časti maturitnej skúšky Informačný systém pre EČ a PFIČ maturitnej skúšky Užívateľská prír

ZBIERKA ZÁKONOV SLOVENSKEJ REPUBLIKY Ročník 2018 Vyhlásené: Časová verzia predpisu účinná od: Obsah dokumentu je právne záväzný

uzatvorená medzi zmluvnými stranami: Príloha č. 1 Zmluvy o Elektronickej službe Business24 Špecifikácia Elektronickej služby Business24 Slovenská spor

INTERNET BANKING Ako zrealizovať hromadný prevod VŠETKO, ČO JE MOŽNÉ with.vub.sk, Bank of

Microsoft Word - 16.kapitola.doc

Microsoft Word - Manažment_tagov_tim24_tema12_2017.docx

bakalarska prezentacia.key

Prepis:

@RoboNovotny UINF/PAZ1c epizóda 7 4/nov/15

prečo nedediť od náhodných tried? delegácia miesto dedičnosti kedy dediť a kedy nie?

Dediť či nedediť? naozaj je vzťah is-a? implementujete interfejs? je rodič explicitne navrhnutý na dedenie? máte dosah na implementáciu rodiča? dedíte od tried v rovnakom balíčku? viď tutoriály + oficiálna dokumentácia

Daj mi množinu, čo si počíta pridávané prvky!

Od koho oddediť? interfejsy? priveľa metód konkrétne triedy? nečakané správanie

Návrh kódu a logika uvažovania oddedíme z HashSet prekryjeme metódu add() pripočítame jednotku zavoláme rodičovskú metódu, ktorá pridá prvok musíme prekryť aj addall() (pridanie kolekcie do množiny) pripočítame toľko, koľko je prvkov v množine zavoláme rodičovskú metódu, ktorá pridá prvky

Návrh kódu a logika uvažovania public class InstrumentedHashSet<E> extends HashSet<E> { private int početpridaní = 0; public boolean add(e e) { početpridaní++; return super.add(e); } } public boolean addall(collection<? extends E> c) { početpridaní += c.size(); return super.addall(c); }

Použitie triedy Set<String> s = new InstrumentedHashSet<String>(); s.addall(arrays.aslist("baldrick", "Edmund", "Queenie")); lenže ak zistíme počet pridaných prvkov, zistíme, že máme výsledok 6 prečo? nik nevie pozrieme do zdrojákov! ešteže ich Oracle zverejňuje... vinník: metóda addall() v java.util.abstractcollection

Návrh kódu a logika uvažovania public boolean addall(collection<? extends E> c) { boolean modified = false; Iterator<? extends E> e = c.iterator(); while (e.hasnext()) { if (add(e.next())) modified = true; } return modified; } Metóda addall() volá metódu add()! Hm! započíta sa to dvakrát raz v prekrytej metóde addall(), ktorá zavolá našu prekrytú metódu add()

Čuduj sa svete, dokumentácia! Z dokumentácie možno odvodiť toto správanie. Čo ak dokumentácia nie je?

Raz funguje, raz nie príklad s HashSetom nefunguje ale príklad so počítajúcim zoznamom by fungoval LinkedList/ArrayList nepoužívajú v addall() metódu add() Dediť od náhodných tried krížom cez balíčky môže viesť k nečakaným problémom!

Riešenie oprava problému č. 1. zrušiť pripočítavanie v metóde addall() lebo sme si prečítali dokumentáciu lenže my sa spoliehame na implementačný detail, ktorý sa môže zmeniť, a potom máme problém public boolean addall(collection<? extends E> c) { početpridaní += c.size(); return super.addall(c); }

Riešenie problému č. 2 prekryť si metódu addall() po svojom prelez kolekciu, pridaj prvok po svojom bez metódy add() lenže časom môžeme zistiť, že kopírujeme kód z metódy rodičovskej triedy Iterator<? extends E> e = c.iterator(); while (e.hasnext()) { if (pridajposvojom(e.next())) modified = true; } return modified;

Riešenie?

DELEGÁCIA AKO HYBRID DEDIČNOSTI A KOMPOZÍCIE

Delegácia = hybrid kompozície a dedičnosti 1. vytvoríme triedu, ktorá implementuje ListCellRenderer 2. trieda bude delegovať volanie na inštanciu DefaultListCellRenderera 3. môže využiť funkcionalitu hotovej triedy a v prípade potreby pozmeniť chovanie

Dedičnosť + kompozícia = delegácia public class MôjListCellRenderer implements ListCellRenderer { private DefaultListCellRenderer delegát; } Component getlistcellrenderercomponent(...) { String zobrazenahodnota = (Kontakt) value.getplnemeno(); return delegát.getlistcellrenderercomponent(..., kontakt,...) }

Delegácia «interface» ListCellRenderer - getlistcellrenderercomponent (JList list:, Object value:, int index MôjListCellRenderer DefaultListCellRenderer - listcellrenderer : DefaultListCellRenderer - getlistcellrenderercomponent (JList list:, Object value:, int index - getlistcellrenderercomponent (JList list:, Object

Delegácia mix dedičnosti + kompozície trieda oddedí od inej triedy / implementuje interfejs schopnosti, ktoré chce zmeniť, zmení schopnosti, ktoré chce znovupoužiť z inej triedy, znovupoužije veľmi robustné, v Jave extrémne ukecané existuje podpora v IDE

AKO DEDIŤ CIVILIZOVANE?

viacero objektov so spoločným správaním, pričom niektoré aspekty správania sa budú líšiť

Služby Služba <<interface>> +spusť() + zastav() každá služba sa vie spustiť a zastaviť, ale spôsoby behu sú diametrálne odlišné AbstraktnáSlužba + AbstraktnáSlužba(String nazov) + getnazov() MonitorVýkonu PočítadloDoPäť

public abstract class AbstraktnáSlužba implements Služba { private String nazov; public AbstraktnáSlužba(String nazov) { this.nazov = nazov; } public void spusti() { System.out.println("START:" + nazov); } public void zastav() { System.out.println("STOP: " + nazov); } public String getnazov() { return this.nazov; } }

public class PočítadloDoPäť extends AbstraktnáSlužba { } public PočítadloDoPäť() { } super("počítadlo do päť"); public void spusti() { } super.spusti(); for(int i = 0; i < 5; i++) { } System.out.println(i); modifikované správanie ostatné metódy sa zdedia

Nie každé is-a je dedičnosť V blogovacom systéme máme tri typy používateľov: jedného admina, autorov článkov a diskutérov. aké majú spoločné správanie? hm... aké majú spoločné vlastnosti? login, heslo, meno, priezvisko..

V blogovacom systéme máme tri typy používateľov: jedného admina, autorov článkov a diskutérov. má zmysel hierarchia dedičnosti? každý admin je používateľ každý autor článkov je používateľ každý diskutér je používateľ Používateľ Admin Autor Diskutér

V blogovacom systéme máme tri typy používateľov: jedného admina, autorov článkov a diskutérov. čomu zodpovedá používateľ? aké má schopnosti? a stav? Kandidát na abstraktnú triedu Používateľ Admin Autor Diskutér

V blogovacom systéme máme tri typy používateľov: jedného admina, autorov článkov a diskutérov. admin má právo byť autorom článkov (potenciálny) admin má právo byť diskutérom (potenciálny) autor článkov má právo byť diskutérom Čo keď chceme anonymného používateľa? Používateľ Diskutér Autor Admin

V reálnom svete... Autor, napíš článok! Diskutér, prispej do témy! Admin, vymaž diskusiu!

V OOP reálny príkaz nemusí zodpovedať metóde Autor, napíš článok! Vytvorí sa nový článok. Asociuje s autorom. Uloží sa do databázy.

Dedičnosť je o správaní, nie o stave!

Nie každé is-a musí byť dedičnosť používateľ môže mať jednu či viac rolí admin, autor, diskutér neodlišujú sa správaním môže ich byť aj viacero Používateľ private Set<Rola> role public boolean márolu(rola rola) Rola implementovaná enumami alebo entitou.

Ani overenie is-a nemusí stačiť! kružnica vs elipsa kružnica má elipsu? elipsa má kružnicu? každá elipsa je kružnicou každá kružnica je elipsou?

Zamyslime sa nad kontraktom dodajme do kontraktu schopnosť naťahovať sa do šírky výška sa musí zachovať Obrázok z vektorového editora. Ťahaním za držadlo môžeme zväčšovať šírku so zachovaním výšky class Elipsa { }... void zmeňpolose(int dĺžka) { }

Zamyslime sa nad kontraktom do kontraktu navyše dajme schopnosť naťahovať sa do výšky šírka sa musí zachovať Obrázok z vektorového editora. Ťahaním za držadlo môžeme zväčšovať výšku so zachovaním šírky class Elipsa { } void zmeňpolose(int dĺžka) { } void zmeňpolosf(int výška) { }

Kružnica vs elipsa class Elipsa { void zmeňpolose(int dĺžka) { } void zmeňpolosf(int dĺžka) { } } class Kružnica extends Elipsa { // zdedia sa metódy pre polosi } class Kružnica extends Elipsa { void zmeňpolose(int dĺžka) { } void zmeňpolosf(int dĺžka) { } } potrebujeme prekryť metódy pre polosi

Prekrytie metód v elipse možnosť 1 metódy neprekryjeme, priamo ich zdedíme lenže tým môžeme z kružnice spraviť elipsu budeme mať objekt typu Kružnica, ktorý nebude kružnicou

Prekrytie metód v elipse možnosť 2 prekryjeme metódy tak, aby dodržala,,kružnicovosť" teda so zmenou veľkosti jednej polosi zmeníme aj veľkosť druhej polosi lenže užívateľ je v šoku! Ťahaním za držadlo sa zväčšuje šírka i výška! Nedodržali sme kontrakt!

Nelogickosť v kóde Elipsa elipsa = new Elipsa(); elipsa.setpolose(2); elipsa.setpolosf(4); System.out.println(elipsa.getPolosE()); System.out.println(elipsa.getPolosF()); Elipsa kružnica = new Kružnica(); kružnica.setpolose(2); kružnica.setpolosf(4); System.out.println(kružnica.getPolosE()); System.out.println(kružnica.getPolosF()); Elipsa sa správa polymorfne, ale nastávajú nečakané vedľajšie efekty! 2 4 2 2

Nedodržanie kontraktu ak v kontrakte Elipsy povieme, že naťahovanie do šírky zachová výšku, musí to platiť aj v podtriedach Kružnica však tento kontrakt nevie dodržať. Dedičnosť nemá zmysel!

Ďalšie problémy kružnica však nepridáva žiadnu špeciálnu schopnosť práve naopak: kružnica je obmedzením elipsy,,kružnica je elipsa, ktorej polosi majú rovnakú dĺžku" elipsa potrebuje viac stavov než kružnica elipsa: dve premenné (polos e, polos f) kružnica: stačí jedna (priemer) Zásada! Oddedená trieda by mala ponúkať správanie rodiča plus niečo navyše.

Problém: vzťah is-a s výhradami! [Každá] kružnica je elipsa s rovnakými polosami. [Každý] anonymný používateľ je používateľ, ktorý nemá login, ani heslo.

Problém: vzťah is-a s výhradami! Každá trieda A je trieda B, ktorá NEVIE... Každá trieda A je trieda B, ale... Každá trieda A je trieda B, s obmedzením, že...

Liskovovej substitučný princíp (1987) Ak pre každý objekt o1 typu T1 existuje objekt o2 typu T2 taký, že pre všetky programy P využívajúce T2 platí, že po nahradení objektu o2 objektom o1 sa správanie P nezmení, potom T1 je podtypom T2 ak v programe nahradíme triedu podtriedami, správanie sa zachová. ak nahradíme inštancie elíps inštanciami kružníc, správanie sa zrejme poruší

Liskovovej substitučný princíp čo znamená, že správanie sa nezmení? v LSP vágny pojem Treba dodržať kontrakt! Kružnica extends Elipsa je korektná v matematickom zmysle, ale v zmysle OOP sa nedá namodelovať majú totiž odlišné správanie!

Kontrakt definuje vlastnosti funkcie metóda je akási matematická funkcia s definičným oborom parametre a ich typy s oborom hodnôt návratová hodnota s definíciou správania, ak príde hodnota mimo definičného oboru interface MatematickeOperacie { double odmocnina(double cislo); }

*-conditions, invarianty precondition výrok, ktorý musí byť pravdivý pred zavolaním metódy postcondition výrok, ktorý musí byť pravdivý po dobehnutí metódy invariant výrok pravdivý vždy vzhľadom k triede nemenná vlastnosť obvykle od stvorenia objektu

Formálnejšie zásady pre Liskovovej princíp preconditions nemožno v podtriede zosilniť v podtriede Kružnica polos e = polos f postconditions nemožno v triede zoslabiť Elipsa#zmeňPolosF(): postpodmienka novápolose == predošlápolose Kružnica#zmeňPolos: podmienka nemusí platiť invarianty musia ostať nezmenené

Zrušíme hierarchiu Kružnica Elipsa. Nebudú mať žiaden vzťah.

Iný príklad narušenia Liskovovej princípu class Účet { } int stav = 3; /* */ boolean uzatvor() { }... return (stav > 3); Precondition: ak sú na účte aspoň 3, uzavrie sa class TermínovanýÚčet extends Účet { boolean uplynulaperióda; boolean uzatvor() { }... return (stav > 3) && uplynulaperióda; Silnejšia precondition ak sú na účte aspoň 3 a zároveň uplynul termín

Základný kritický bod dedičnosti Dedičnosť narúša zapúzdrenie! (Inheritancebreaks encapsulation!) potomok môže meniť interný stav rodičovskej triedy......a tým narúšať invarianty rodiča!

LSP: History constraint (rule) Ak máme stav predka, ktorý nemožno meniť settermi, potomok si nemôže dodať settery, ktoré toto obmedzenie zrušia. class Bod { private int x, y; Bod(int x, int y) { this.x = x; class MeniteľnýBod extends Bod { this.y = y; void setx(int x) { } } void sety(int y) { } } }

Dedičnosť narúša zapúzdrenie Klient uzatvára kontrakt s triedou, ktorý je reprezentovaný verejnými metódami Oddedená trieda je však tiež len klient rodičovskej triedy......má sa riadiť kontraktom

Problém je v meniteľnosti problém spočíva v meniteľnosti inštancií keby sme zabránili zmene atribútov inštancie, problém by sa vyriešil raz vytvorená kružnica bude navždy kružnicou Riešenie: zrušíme settre, atribúty možno nastaviť len v konštruktore.

Zlý príklad! narúša to pravidlo,,is-a",,zásobník nie je vektorom založeným na poli" narúša to LSP zásobník je zoznam, do ktorého možno vkladať len na koniec od JDK6: interface Deque + implementácia LinkedList

Liskovovej princíp je hrôza! ale veď to úplne popiera dedičnosť! prečo som sa to učila, keď je to zbytočne? dedičnosť nie je zlá, len ju treba používať s rozvahou Trieda má jasne stanoviť, kedy a za akých podmienok je vhodné dediť!

Dve protibežné zásady Dedičnosť Trieda zdedí správanie a stav od rodiča Zapúzdrenie Trieda môže meniť stav inej triedy len skrz špecifikované metódy

Dizajn = balansovanie ideálny svet: platí LSP, inštančné premenné sú private, oddedená trieda pristupuje k rodičovskému stavu cez metódy v praxi: LSP sa narúša, lebo komplikuje veci protected premenné a metódy

Uprednostňujte kompozíciu pred dedičnosťou! -- Gang of Four, autori Design Patterns

Otázky?