DESIGN PATTERNS, PRESENTATION

Podobné dokumenty
Facade. Známý jako. Účel. Motivace. Facade, Fasáda

Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

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

KIV/PIA 2013 Jan Tichava

GUIDELINES FOR CONNECTION TO FTP SERVER TO TRANSFER PRINTING DATA

Čipové karty Lekařská informatika

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

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

User manual SŘHV Online WEB interface for CUSTOMERS June 2017 version 14 VÍTKOVICE STEEL, a.s. vitkovicesteel.com

SenseLab. z / from CeMaS. Otevřené sledování senzorů, ovládání zařízení, nahrávání a přehrávání ve Vaší laboratoři

2 Axiomatic Definition of Object 2. 3 UML Unified Modelling Language Classes in UML Tools for System Design in UML 5

Hiearchical MVC (Model-view-controller) vs. PAC (Presentation-abstraction-control)

USING VIDEO IN PRE-SET AND IN-SET TEACHER TRAINING

Distribuované systémy a výpočty

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Postup objednávky Microsoft Action Pack Subscription

JavaServer Faces Zdeněk Troníček

Project Life-Cycle Data Management

Czech Republic. EDUCAnet. Střední odborná škola Pardubice, s.r.o.

Návrhové vzory OMO, LS 2014/2015

Nástroje a frameworky pro automatizovaný vývoj. Jaroslav Žáček jaroslav.zacek@osu.cz

VYUŽITÍ DATA DRIVEN PAGES

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

NOVINKY V JEE EJB 3.1. Zdeněk Troníček Fakulta informačních technologií ČVUT v Praze

Jak importovat profily do Cura (Windows a

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

2011 Jan Janoušek BI-PJP. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Tento materiál byl vytvořen v rámci projektu Operačního programu Vzdělávání pro konkurenceschopnost.

Úvod do CORBY. Svetlozara Arabadzhieva

Potřebujete mít vaše IS ve shodě s legislativou? Bc. Stanislava Birnerová

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Industry Robert BOSCH

Compression of a Dictionary

Introduction to MS Dynamics NAV

Introduction to Navision 4.00 Jaromír Skorkovský, MS., PhD.

Web Frameworks Java Server Faces. Petr Aubrecht CA

Škola: Střední škola obchodní, České Budějovice, Husova 9. Inovace a zkvalitnění výuky prostřednictvím ICT

RMI Remote Method Invocation

Name: Class: Date: RELATIONSHIPS and FAMILY PART A

JAVA Unit testing Java, zimní semestr

Aplikace s grafickým uživatelským rozhraním

WL-5480USB. Quick Setup Guide

TechoLED H A N D B O O K

2. Entity, Architecture, Process

WORKSHEET 1: LINEAR EQUATION 1

Microsoft Lync WEB meeting

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Petr Vlk KPCS CZ. WUG Days října 2016

System Center Operations Manager

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

MVC (Model-View-Controller)

Návrhové vzory pro J2EE. Miroslav Beneš

Abstraktní datové typy: zásobník

X33EJA. JSF aplikace

Správa a sledování SOA systémů v Oracle SOA Suite

DC circuits with a single source

a konverze na úřadech Martin Řehořek

Michal Podzimek

Mobilní malware na platformě Android Přednáška 2. Ing. Milan Oulehla

Technologie, vlastnosti, uplatnění. Martin Suchan

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

OMO Patterny pro UI. Základy UI - HTML, DOM, JavaScript, CSS. Single Page Application

POPIS TUN TAP. Vysvetlivky: Modre - překlad Cervene - nejasnosti Zelene -poznamky. (Chci si ujasnit o kterem bloku z toho schematu se mluvi.

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

VY_32_INOVACE_06_Předpřítomný čas_03. Škola: Základní škola Slušovice, okres Zlín, příspěvková organizace

Anglický text: Lesson 8: Class Inheritance

Innovated Solution: Questions and Answers after the Webinar

Úvod do datového a procesního modelování pomocí CASE Erwin a BPwin

Zabezpečení infrastruktury

Obsah&/&Content& Všeobecné)podmínky)(v)češtině)) Terms)and)Conditions)(in)english)) )

Invitation to ON-ARRIVAL TRAINING COURSE for EVS volunteers

Vánoční sety Christmas sets

Technology Entry form Entry up-to-date? Internal links Faulty internal Possible internal links

Lukáš Brodský Praha Osnova. Objektový přístup Verze 4, 5, 6 / 7 Developer7 -funkčnost, nové vlastnosti HW

Technologie Java Enterprise Edition. Přemek Brada, KIV ZČU

Proč Angular JS framework?

Od Czech POINTu k vnitřní integraci

Tvorba informačních systémů

IBM Connections pro firmy s Lotus Notes/Domino. Petr Kunc

Radiova meteoricka detekc nı stanice RMDS01A

III/ 2- Inovace a zkvalitnění výuky prostřednictvím ICT

Tabulka 1 Stav členské základny SK Praga Vysočany k roku 2015 Tabulka 2 Výše členských příspěvků v SK Praga Vysočany Tabulka 3 Přehled finanční

PROČ UŽ SE NEOBEJDETE BEZ ANALÝZY DAT

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

2N Voice Alarm Station

EU peníze středním školám digitální učební materiál

Návrhové vzory pro J2EE

Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49

Litosil - application

AIC ČESKÁ REPUBLIKA CZECH REPUBLIC

UPM3 Hybrid Návod na ovládání Čerpadlo UPM3 Hybrid 2-5 Instruction Manual UPM3 Hybrid Circulation Pump 6-9

Komponentově orientované webové frameworky. Jiří Stránský twitter.com/jistr

Programování v Javě I. Leden 2008

FIRE INVESTIGATION. Střední průmyslová škola Hranice. Mgr. Radka Vorlová. 19_Fire investigation CZ.1.07/1.5.00/

Vláknové programování část V

WYSIWYG EDITOR PRO XML FORM

Karta předmětu prezenční studium

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Nástroje pro průběžnou integraci a testování

Transkript:

DESIGN PATTERNS, PRESENTATION DESIGN PATTERNS, PRESENTATION LAYER OF EAA, 1

DESIGN PATTERNS Gang of Four (GOF) Java EE Core EAA 2

DESIGN PATTERNS Design and implementation without flaws! We specifically look into Façade, Observer & Model-View-Controller More in optional course A7B36ASS Summer http://bilakniha.cvut.cz/cs/predmet1469406.html 3

FAÇADE CZECH 4

FACADE Známý jako Facade, Fasáda Účel sjednocené high-level rozhraní pro subsystém zjednodušuje použití subsystému zapouzdření skrytí návrhu před uživateli Motivace zjednodušit komunikaci mezi subsystémy zredukovat závislosti mezi subsystémy neznemožnit používání low-level interfaců pro použití na míru 5

FACADE - MOTIVACE 6

FACADE MOTIVACE DVD přehrávač projektor Puštění filmu: zatáhnutí žaluzií zapnutí projektoru zapnutí DVD přehrávače zapnutí ozvučení žaluzie Ukončení přehrávání: vypnout DVD přehrávač vypnout ozvučení vypnout projektor vytáhnout žaluzie HI-FI soustava 7

FACADE MOTIVACE Řešení: Univerzální ovladač s funkcemi: Přehrát film Ukončit film Přehrát hudbu Vypnout hudbu zatáhnout žaluzie zapnout projektor zapnout DVD přehrávač zapnout ozvučení vypnout DVD přehrávač vypnout ozvučení vypnout projektor vytáhnout žaluzie 8

FACADE - MOTIVACE Příklad Compiler třídy Scanner, Parser, ProgramNodeBuilder,.. Facade poskytuje rozhraní pro práci s kompilátorem na high-level úrovni 9

FACADE MOTIVACE Příklad transparentnost třídy subsystému o Facade nevědí svoboda volby- neskrývá třídy subsystému (Parser, Scanner) 10

FACADE - POUŽITÍ Použití když je subsystém složitý na běžné použití když existuje mnoho závislostí vně subsystému při vytváření vstupních bodů vrstveného systému Struktura 11

FACADE POUŽITÍ Účastníci Facade (kompilátor) zná třídy uvnitř subsystému deleguje požadavky třídy subsystému (Scanner, Parser,...) nevědí o existenci Facade implementují funkčnost Souvislosti klient se subsystémem komunikuje přes Facade Facade předává požadavky dál může obsahovat vlastní logiku překlad požadavků na třídy subsystému klienti nemusí používat subsystém přímo 12

FACADE - DŮSLEDKY Výhody použití redukuje počet objektů, se kterými klienti komunikují snadnější použití subsystému zmenšuje počet závislostí mezi klienty a subsystémem odstraňuje komplexní a kruhové závislosti méně kompilačních závislostí neskrývá třídy subsytému klient si může vybrat jednoduchost nebo použití na míru umožňuje rozšířit stávající funkcionalitu kombinací subsystémů a jejich metod monitorování systému přístupy, využívání jednotlivých metod Kdy se vyplatí facade do systému implementovat cena za vytvoření fasády menší než je nastudování podsystému uživateli 13

FACADE PŘÍKLAD class Scanner { public: virtual Token& Scan(); }; Třída subsystému Třída subsystému class Parser { public: virtual void Parse(Scanner&,ProgramNodeBuilder&); }; Třída subsystému class ProgramNodeBuilder { public: ProgramNodeBuilder(); virtual ProgramNode* NewVariable( ); virtual ProgramNode* NewAssignment( ); virtual ProgramNode* NewReturnStatement( ); virtual ProgramNode* NewCondition( ) const; ProgramNode* GetRootNode(); }; 14

FACADE PŘÍKLAD class ProgramNode { public: FACADE // program node - PŘÍKLAD manipulation virtual void GetSourcePosition(int& line, int& index); // child manipulation virtual void Add(ProgramNode*); virtual void Remove(ProgramNode*); Třída subsystému virtual void Traverse(CodeGenerator&); protected: ProgramNode(); }; class CodeGenerator { public: virtual void Visit(StatementNode*); virtual void Visit(ExpressionNode*); protected: CodeGenerator(BytecodeStream&); protected: BytecodeStream& _output; }; Třída subsystému 15

void ExpressionNode::Traverse (CodeGenerator& cg) { cg.visit(this); FACADE - PŘÍKLAD } ListIterator i(_children); for (i.first();!i.isdone(); i.next()) { } FACADE PŘÍKLAD i.currentitem()->traverse(cg); Facade class Compiler { public: Compiler(); virtual void Compile(istream&,BytecodeStream&); }; void Compiler::Compile ( istream& input, BytecodeStream& output ) { Scanner scanner(input); ProgramNodeBuilder builder; // Návrhový vzor Builder Parser parser; parser.parse(scanner, builder); RISCCodeGenerator generator(output); // potomek CodeGenerator ProgramNode* parsetree = builder.getrootnode(); parsetree->traverse(generator); } 16

FACADE IMPLEMENTACE Konfigurace fasády Facade jako abstraktní třída konkrétní implementace subsystému je jejím potomkem klienti komunikují se subsystémem přes rozhraní abstraktní třídy Ideálně propojit s Dependency Injection Facade jako jedna konfigurovatelná třída výměna komponent subsystému Viditelnost komponent subsystému Zakomponování kontroly přístupu 17

FACADE REÁLNÉ POUŽITÍ 18

FACADE PŘÍKLAD Services public class HotelBookerImpl implements HotelBooker { public FACADE List<Hotel> - PŘÍKLAD gethotelnamesfor(date from, Date to) { //returns hotels available in the particular date range } } public class FlightBookerImpl implements FlightBooker { public List<Flight> getflightsfor(date from, Date to) { //returns flights available in the particular date range } } Facade public class ServiceFacade { private HotelBooker hotelbooker; private FlightBooker flightbooker; // Dependency Injection } public void getflightsandhotels(date from, Data to) { List<Flight> flights = flightbooker.getflightsfor(from, to); List<Hotel> hotels = hotelbooker.gethotelsfor(from, to); //process and return } 19

FACADE PŘÍKLAD Client public class Client { public static void main(string[] args) { ServiceFacade facade = new ServiceFacade (); facade.getflightsandhotels(from, to); } } Facade 20

FACADE REÁLNÉ POUŽITÍ V mobilních aplikacích Session Facade v Java EE Fasáda pro webové služby 21

FACADE REÁLNÉ POUŽITÍ JOptionPane ve Swingu vytváří různé typy základních dialogových oken a zobrazuje je zjednodušuje používání této rozsáhlé knihovny 22

FACADE REÁLNÉ POUŽITÍ V byznys světě 23

OBSERVER 24

OBSERVER Smysl Zavádí možnost sledování změn u objektu tak, že když objekt změní stav, ostatní objekty na tuto změnu zareagují, přičemž nedojde k přímé vazbě (coupling) od sledovaného objektu k těmto objektům. Potřeba sledování změn objektu a notifikace Událostní řízení řeší observer Obdoba systému událostí (Java) vlastními prostředky 25

OBSERVER - MOTIVACE Při změně dat očekávají oznámení od subjektu, že se mají aktualizovat Udržuje svůj stav a informuje všechny zájemce o jeho změnách 26

OBSERVER - STRUKTURA Účastníci Subject Observer Interface pro udržování seznamu zájemců o upozornění a posílání oznámení Jednoduchý interface pro přijímání upozornění ConcreteSubject Má vlastní funkčnost a stav, rozesílá oznámení o jeho změnách ConcreteObserver Implementuje Observer interface a tak udržuje svůj stav konzistentní se stavem ConcreteSubject

OBSERVER - INTERAKCE 28

29

OBSERVER - PŘÍKLAD class Class Model Subject + Attach(Observer) + Detach(Observer) : Observer + Notify() : Observer for all o in observers { o->update(this) } -observers 1..* Observer + Update(Subject*) ClockTimer DigitalClock AnalogClock + GetHour() + GetMinute() + GetSecond() + Tick() Notify() -subject - _subject: ClockTimer* + Update(Subject*) if (thechangedsubject == _subject) { Draw() } - _subject: ClockTimer* + Update(Subject*) if (thechangedsubject == _subject) { Draw() } +subject 30

PŘÍKLAD - ABSTRAKTNÍ TŘÍDY public abstract class Observer { public update(); }; public abstract class Subject { private List<Observer> observers; public void attach(observer o) { observers.add(o); } public void detach(observer o) { observers.remove(o); } public void notify(); for (Observer o : observers) { o.update() } }; abstraktní třídy, definují rozhraní 31

PŘÍKLAD konkrétní třída, uchovává čas, upozorňuje každou sekundu public class ClockTimer extends Subject { public ClockTimer() {..}; public int gethour(); public int getminute(); public int getsecond(); public void tick() { // aktualizovat vnitřní stav udržující čas //... super.notify(); } }; Public class DigitalClock extends Observer { }; private ClockTimer subject; public DigitalClock(ClockTimer t); public void update(); // překrývá operaci třídy Observer public void draw(); // překrývá operaci třídy Widget // definuje, jak vykreslit digitální hodiny public void close(); konkrétní třída, zobrazuje čas jako digitální hodiny 32

PŘÍKLAD DigitalClock(ClockTimer s) { this.subject = s; this.subject.attach(this); } Public class DigitalClock extends Observer { }; private ClockTimer subject; public DigitalClock(ClockTimer t); public void update(); public void draw(); public void close(); public void close() { subject.detach(this); } public void update () { draw(); } public void draw() { // načíst hodnoty ze subjektu int hour = subject.gethour(); int minute = subject.getminute(); // etc. } // nakreslit digitální hodiny 33

PŘÍKLAD Public class AnalogClock extends Observer { public AnalogClock(ClockTimer); public void update(); // překrývá operaci třídy Observer public void draw(); // překrývá operaci třídy Widget // definuje, jak vykreslit digitální hodiny public void close(); }; jako DigitalClock, ale zobrazuje analogové hodiny public void draw() { // načíst hodnoty ze subjektu } int hour = subject.gethour(); int minute = subject.getminute(); int seconds = subject.getseconds() // etc. // nakreslit digitální hodiny 34

KDY POUŽÍT Správné rozdělení systému do vrstev Odstínění přímého volání sledujícího objektu od sledovaného Více možných pohledů na jeden model chceme je udržovat konzistentní Objekt, který má informovat nezávislé objekty publish-subscribe 35

NEZÁVISLOST MEZI SUBJECT A OBSERVERS UMOŽŇUJE Volně zaměňovat jednotlivé observery nebo subjecty Přidávat observers bez změny subject nebo ostatních observers Subject a observers můžou patřit do různých vrstev abstrakce Komunikaci low-level subject s high-level observers Broadcast komunikaci Přidávání a odebírání observers za běhu 36

JAVA EE 7 Facade @Stateless public class MemberRegistration { @Inject private Logger log; Event } @Inject private EntityManager em; @Inject private Event<Member> membereventsrc; public void register(member member) throws Exception { log.info("registering " + member.getname()); em.persist(member); membereventsrc.fire(member); } Fire Notify 37

JAVA EE 7 Controller @RequestScoped public class MemberListProducer { @Inject private MemberRepository memberrepository; private List<Member> members; // @Named provides access the return value via the EL variable name // "members" in the UI (e.g. Facelets or JSP view) @Produces @Named public List<Member> getmembers() { return members; } User Interface binding } public void onmemberlistchanged(@observes(notifyobserver = Reception.IF_EXISTS) final Member member) { retrieveallmembersorderedbyname(); } @PostConstruct public void retrieveallmembersorderedbyname() { members = memberrepository.findallorderedbyname(); } Observe 38

JAVA EE 7 Controller @RequestScoped public class MemberListProducer { @Inject private MemberRepository memberrepository; private List<Member> members; // @Named provides access the return value via the EL variable name // "members" in the UI (e.g. Facelets or JSP view) @Produces @Named public List<Member> getmembers() { return members; } User Interface binding } public void onmemberlistchanged(@observes(notifyobserver = Reception.IF_EXISTS) final Member member) { members.add(member); } @PostConstruct public void retrieveallmembersorderedbyname() { members = memberrepository.findallorderedbyname(); } Observe 39

PRESENTATION LAYER 40

PRESENTATION LAYER Presents knowledge captured by below layers Definition: User interface (UI) provides the visual part of a computer application or a system, which can be seen by human user, it provides mechanisms to control the system through commands, to submit data to the system or receive them and influences how information is displayed on the screen. The UI graphical design aims to make user interaction simple and efficient regards a particular task. 41

PRESENTATION LAYER Usability is the ease of use and learnability of a software application 42

PRESENTATION LAYER Examples: JavaServer Faces (JSF) web-based Swing standalone apps Component tree Composite Design Pattern Component Button Container Checkbox Choice Panel Window List TextComponent Dialog Frame TextArea TextField 43

PRESENTATION LAYER Examples: JavaServer Faces (JSF) web-based Domain specific language to describe UI (DSL) Transformation to HTML Interpretation by Web Browser Component-based Weak type safety Swing standalone apps General Purpose Language (GPL) Interpretation by JVM Component-based 44

PRESENTATION LAYER Examples: JavaServer Faces web-based Response <ht ml >.. <body>.. <input type= text../>.. <select..> <option../> <option../> </select..>.. </ body> </ ht ml > Static text JSF Tree Generated Static text JSF Page <ht ml >.. <body>.. <h:inputtext../>.. <h:selectmanycheckbox..> <f:selectitem../> <f:selectitem../> </h:selectmanycheckbox..>.. </ body> </ ht ml > 45

PRESENTATION LAYER Examples: Swing public static void main(string[] args) { String firstname = JOptionPane.showInputDialog("First Name"); String lastname = JOptionPane.showInputDialog("Family Name"); fullmame = "You are " + first_name + " " + family_name; JOptionPane.showMessageDialog( null, fullmame); 46

JAVASERVER FACES JavaServer Faces (JSF) is a MVC web framework that simplifies the construction of user interfaces (UI) for server-based applications by using reusable UI components in a page. JSF provides facility to connect UI widgets with data sources and to server-side event handlers. The JSF specification defines a set of standard UI components and provides an Application Programming Interface (API) for developing components. JSF enables the reuse and extension of the existing standard UI components. 47

JAVASERVER FACES 2 core elements Managed Bean Controller JSF Page @ManagedBean(name = "helloworld", eager = true) public class HelloWorld { public HelloWorld() { System.out.println("HelloWorld started!"); } public String getmessage() { return "Hello World!"; } } <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>jsf Tutorial!</title> </head> <body> #{helloworld.message} </body> </html> 48

CONTROLLER - BEAN @Model //same as @RequestScoped and @Named public class MemberController { @Inject private FacesContext facescontext; @Inject private MemberRegistration memberregistration; @Produces @Named private Member newmember; @RequestScoped public class MemberListProducer { @Produces @Named public List<Member> getmembers() { return members; } public void register() throws Exception { try { memberregistration.register(newmember); FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_INFO, "Registered", "Registration successful"); facescontext.addmessage(null, m); initnewmember(); } catch (Exception e) { String errormessage = getrooterrormessage(e); FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errormessage, "Registration unsuccessful"); facescontext.addmessage(null, m); } } 49

JSF PAGE Header Body <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" template="/web-inf/templates/default.xhtml"> <ui:define name="content">.. </ui:define> </ui:composition> <h:datatable var="_member" value="#{members} rendered="#{not empty members} > <h:column> <f:facet name="header">id</f:facet> #{_member.id} </h:column>... <ui:define name="content"> <h:column> <h:form id="reg"> <a href="#{request.contextpath} <h:outputlabel for="name" value="name: /> /rest/members/#{_member.id}"> <h:inputtext id="name /rest/members/#{_member.id}</a> value="#{newmember.name}" /> </h:column> <h:message for="name /> </h:datatable>... </ui:define> <h:commandbutton id="register action="#{membercontroller.register} value="register" styleclass="register" /> <h:messages globalonly="true" /> </h:form> 50

JSF PAGE Header Body <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" template="/web-inf/templates/default.xhtml"> <ui:define name="content">.. </ui:define> </ui:composition> <h:datatable var="_member" value="#{members} rendered="#{not empty members} > <h:column> <f:facet name="header">id</f:facet> #{_member.id} </h:column>... <ui:define name="content"> <h:column> <h:form id="reg"> <a href="#{request.contextpath} <h:outputlabel for="name" value="name: /> /rest/members/#{_member.id}"> <h:inputtext id="name /rest/members/#{_member.id}</a> value="#{newmember.name}" /> </h:column> <h:message for="name /> </h:datatable>... </ui:define> <h:commandbutton id="register action="#{membercontroller.register} value="register" styleclass="register" /> <h:messages globalonly="true" /> </h:form> 51

JSF PAGE Header Body - components <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" template="/web-inf/templates/default.xhtml"> <ui:define name="content">.. </ui:define> </ui:composition> <h:datatable var="_member" value="#{members} rendered="#{not empty members} > <h:column> <f:facet name="header">id</f:facet> #{_member.id} </h:column>... <ui:define name="content"> <h:column> <h:form id="reg"> <a href="#{request.contextpath} <h:outputlabel for="name" value="name: /> /rest/members/#{_member.id}"> <h:inputtext id="name /rest/members/#{_member.id}</a> value="#{newmember.name}" /> </h:column> <h:message for="name /> </h:datatable>... </ui:define> <h:commandbutton id="register action="#{membercontroller.register} value="register" styleclass="register" /> <h:messages globalonly="true" /> </h:form> 52

JSF PAGE Header Body - components <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" template="/web-inf/templates/default.xhtml"> <ui:define name="content">.. </ui:define> </ui:composition> http://www.jsftoolbox.com/documentation/help/12- TagReference/core/index.jsf http://www.jsftoolbox.com/documentation/help/12- TagReference/html/index.jsf <ui:define name="content"> <h:form id="reg"> <h:outputlabel for="name" value="name: /> <h:inputtext id="name value="#{newmember.name}" /> <h:message for="name />... <h:commandbutton id="register action="#{membercontroller.register} value="register" styleclass="register" /> <h:messages globalonly="true" /> </h:form> 53

JSF PAGE Header Body - binding <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" template="/web-inf/templates/default.xhtml"> <ui:define name="content">.. </ui:define> </ui:composition> <h:datatable var="_member" value="#{members} rendered="#{not empty members} > <h:column> <f:facet name="header">id</f:facet> #{_member.id} </h:column>... <ui:define name="content"> <h:column> <h:form id="reg"> <a href="#{request.contextpath} <h:outputlabel for="name" value="name: /> /rest/members/#{_member.id}"> <h:inputtext id="name /rest/members/#{_member.id}</a> value="#{newmember.name}" /> </h:column> <h:message for="name /> </h:datatable>... </ui:define> <h:commandbutton id="register action="#{membercontroller.register} value="register" styleclass="register" /> <h:messages globalonly="true" /> </h:form> 54

CONTROLLER - BEAN @Model // same as @RequestScoped and @Named public class MemberController { @Inject private FacesContext facescontext; @Inject private MemberRegistration memberregistration; @Produces @Named private Member newmember; @RequestScoped public class MemberListProducer { @Produces @Named public List<Member> getmembers() { return members; } public void register() throws Exception { try { memberregistration.register(newmember); FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_INFO, "Registered", "Registration successful"); facescontext.addmessage(null, m); initnewmember(); } catch (Exception e) { String errormessage = getrooterrormessage(e); FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errormessage, "Registration unsuccessful"); facescontext.addmessage(null, m); } } 55

MODEL-VIEW CONTROLLER (MVC) 56

INTENT Separate out User Interfaces its logic and from data 3 main components Model View Controller 57

INTENT Separates out User Interfaces its logic and from data/knowledge 3 main components Model Represents knowledge View Visual representation of model Controller Link between User and the system Provides User with input relevant views, menu, commands Takes input from user Extended version hierarchical MVC 58

COMPONENTS Model Captures system data Knowledge Passive / Active model Input Output Model 59

COMPONENTS Model Captures system data Knowledge Where are business rules? Input Output Model Where are services? 60

COMPONENTS Model Captures system data Knowledge Where are business rules? Input Output Model Multiple views can exist on the same model 61

COMPONENTS Model Captures system data Knowledge Where are business rules? Observer Pattern Model 62

COMPONENTS View Visualization of model View1 Input Output View2 Model (Active) 63

COMPONENTS View Visualization of model Input Output View1 RacerCarService <<uses>> View2 PersonDAO <<uses>> Person 64

COMPONENTS View Visualization of model View1 Input Output View2 Model (Active) 65

COMPONENTS View Visualization of model View1 Input Output View2 Model (Active) 66

COMPONENTS View Visualization of model View1 Input Output Add View2 Model (Active) 67

COMPONENTS View Visualization of model???? View1 Input Output Add View2 Model (Active) 68

COMPONENTS View Visualization of model GRASP?? View1 Input Output Add View2 Model (Active) 69

COMPONENTS View Visualization of model Controller View1 Input Output Add View2 Model (Active) 70

COMPONENTS Controller Interaction / mediation Controller View1 Input Output Add View2 Model (Active) 71

COMPONENTS Controller Interaction / mediation Controller View1 Not valid Input Output Add View2 Model (Active) 72

COMPONENTS Controller Interaction / mediation Controller View1 Valid Input Output Add View2 Model (Active) 73

COMPONENTS Model Notification mechanism Observer Design Pattern Controller Add View1 Input Change notification Output View2 Model (Active) 74

COMPONENTS Model Notification mechanism Notify of changes Controller View1 Observable Input Notification Output Add View2 Model (Active) Observable 75

COMPONENTS Model Notification mechanism Observe and redraw Controller Add View1 Observable Input Notification Output View2 Model (Active) Observable 76

77

COMPONENTS Active model vs Passive model 78

LARGE SYSTEM 79

ALTERNATIVES FOR VIEW Many other design patterns for view handling Hierarchical MVC Presentation Abstraction Control (PAC) Model View Presenter Model View ViewModel Small variants Page Controller Front Controller Template View 80

STATIC ANALYSIS OF THE CODE 81

STATIC CODE ANALYSIS Java, C++, C#, etc. are GPL with strong type safety! Finding errors by the type safety Easy to refactor PHP, Ruby, Python, etc. Weak type safety Error-prone Tests needed for refactoring! int x = 5; x = x + 1; String b = Java rocks! ; println(x + b); $x = 5; $x = $x + 1; $b = PHP rocks! ; echo $x + $b; 82

STATIC CODE ANALYSIS Java, C++, C#, etc. are GPL with strong type safety! Finding errors by the type safety Easy to refactor PHP, Ruby, Python, etc. Weak type safety Error-prone Tests needed for refactoring! int x = Five ; x = x + 1; String b = Java rocks! ; println(x + b); $x = Five ; $x = $x + 1; $b = PHP rocks! ; echo $x + $b; Compile Error Runtime Error 83

STATIC CODE ANALYSIS Analysis of computer software Performed without actually executing programs Highlighting possible coding errors Formal methods to mathematically prove properties of a program Software metrics and reverse engineering can be described as forms of static analysis. Verification of properties of software used in safety-critical computer systems and locating potentially vulnerable code Nuclear power plant, Aviation, Medical software Code audit 84

STATIC CODE ANALYSIS PMD PMD is a source code analyzer. It finds common programming flaws like unused variables, empty catch blocks, unnecessary object creation, and so forth. It supports Java, JavaScript, XML, XSL. Additionally it includes the copy-paste-detector. Finds duplicated code in Java, C, C++, C#, PHP, Ruby, Fortran, JavaScript. 85

STATIC CODE ANALYSIS FindBugs Uses static analysis to look for bugs in Java code. Based on the concept of bug patterns. A bug pattern is a code idiom that is often an error. Difficult language features Misunderstood API methods Misunderstood invariants when code is modified during maintenance Garden variety mistakes: typos, use of the wrong boolean operator 86

SOFTWARE TESTING investigation conducted to provide investor with information about the quality of the product Classification: Static vs Dynamic Code audit vs Program Execution White vs Black box We know vs We do not know what is inside Alpha vs Beta SW Constructions vs Transition to deployment Functionality vs Perfomance vs Security vs Reliability Validation vs Verification 87

SOFTWARE TESTING Rule 40/20/40 Planning/Implementation/Testing Scale Unit Testing independent Component testing Integration tests System test 88

SOFTWARE TESTING Other categories Regressive testing Alpha Development testing Beta It scales and provides all advertised functionality Acceptance Verifies it meets customers expectations 89

SOFTWARE TESTING Other categories Stress test JMeter, Selenium User Interface testing Selenuim, TestComplete Performance, Usability, Compatibility, Error handling, load, volume, security, installation, maintenance, accessibility.. 90

JUNIT - HTTP://JUNIT.SOURCEFORGE.NET/ JUnit is a simple framework to write repeatable tests. For graphical feedback, most IDE's support JUnit 4. Implementace Annotate a method with @org.junit.test To check a value, import org.junit.assert.* statically call asserttrue() and pass true if the test succeeds @Test public void simpleadd() { Money m12chf= new Money(12, "CHF"); Money m14chf= new Money(14, "CHF"); Money expected= new Money(26, "CHF"); Money result= m12chf.add(m14chf); asserttrue(expected.equals(result)); } Tomas Cerny, Software Engineering, FEE, CTU in Prague, 91

JUNIT What if you have two or more tests that operate on the same or similar sets of objects? Test Fixture Before or After public class MoneyTest { private Money f12chf; private Money f14chf; private Money f28usd; @Before public void setup() { f12chf= new Money(12, "CHF"); f14chf= new Money(14, "CHF"); f28usd= new Money(28, "USD"); } } Tomas Cerny, Software Engineering, FEE, CTU in Prague, 92

JUNIT Run test Console org.junit.runner.junitcore.runclasses(testclass1.class,...); Command line java org.junit.runner.junitcore TestClass1 [...other test classes...] TestRunner public static junit.framework.test suite() { return new JUnit4TestAdapter(Example.class); } Expected Exceptions @Test(expected= IndexOutOfBoundsException.class) public void empty() { new ArrayList<Object>().get(0); } Tomas Cerny, Software Engineering, FEE, CTU in Prague, 93

JUNIT Run test Do not expect test order execution If you must then use @FixMethodOrder(MethodSorters.NAME_ASCENDING) Tomas Cerny, Software Engineering, FEE, CTU in Prague, 94

JUNIT Feed with Parameters @RunWith(Parameterized.class) public class FibonacciTest { Many loops Different data @Parameters(name = "{index}: fib({0})={1}") public static Iterable<Object[]> data() { return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } }); } private int input; private int expected; } public FibonacciTest(int input, int expected) { this.input = input; this.expected = expected; } @Test public void test() { assertequals(expected, Fibonacci.compute(input)); } Tomas Cerny, Software Engineering, FEE, CTU in Prague, 95

DEPLOYMENT, MAINTENANCE AND REPORTS The games just begin Get ready to be available next 48 hours in the row! 96

DEPLOYMENT, MAINTENANCE AND REPORTS The games just begin Get ready to be available next 48 hours in the row! 97

DEPLOYMENT, MAINTENANCE AND REPORTS At any time you must know what is happening Program Log Logger Access log Who is there doing what System monitoring CPU load, Memory, Harddrive use, Backups Error reporting Where? JIRA? Email? 98

DEPLOYMENT, MAINTENANCE AND REPORTS Automated monitoring systems Verify CPU/Load/Mem/Disk and issues Notify by email or SMS Zabbix Nagios many others. 99

DEPLOYMENT, MAINTENANCE AND REPORTS Get user experience Register your app at Google Analytics to see how it performs HTML5 allows you to see the statistics 100

DEPLOYMENT, MAINTENANCE AND REPORTS Get user experience Register your app at Google Analytics to see how it performs HTML5 allows you to see the statistics 101

EVIL THINGS TO HAPPEN System crash! Memory leak Resource leak New closing loop Cannot survive the load Heap analysis Profiler Reports from web server 102

MAINTENANCE The king is dead, long live the king! Success of the long live depends on the design, scalability, ability to fix bugs and many many other factors!! Prevent bugs, leaks, flaw design Use Design Patterns! A7B36ASS STM Architektura SW systémů http://www.fel.cvut.cz/education/bk/predmety/14/69/p1469406.html 103