Automatyczne generowanie kodu. Marek.Berkan@e-point.pl. 4Developers, 26 marca 2010

Podobne dokumenty
Automatyczne generowanie kodu

Gdzie jest moja tabela?

Podejście obiektowe do relacyjnych baz danych Hibernate.

Podstawowe wykorzystanie Hibernate

Metody dostępu do danych

Budowa aplikacji webowej w oparciu o Maven2 oraz przykłady testów jednostkowych. Wykonał Marcin Gadamer

- wewnątrz elementów prostych występuje tylko jeden typ danych, wewnątrz złoŝonych nie moŝemy dokładnie określić liczby wystąpień elementu

Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

Przykład połączenie z bazą danych

(Dz. U. z dnia 17 listopada 2006 r.)

Hibernate mapowanie baz danych

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

Programowanie obiektowe

Tworzenie aplikacji bazodanowych w delphi dla dużych baz danych FRAMEWORK IMPET

Baza danych sql. 1. Wprowadzenie

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

Tworzenie raportów XML Publisher przy użyciu Data Templates

Dokumentacja kompilacji źródeł aplikacji 1.0

Integracja Obieg Dokumentów - GiS Spis treści

Katalog książek cz. 2

Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki. Paweł Parys. Nr albumu: Aukcjomat

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Pakiety podprogramów Dynamiczny SQL

NHibernate Hibernate dla platformy.net. Hibernate posiada także dużą społeczność, zatem nietrudno uzyskać jakieś wsparcie w przypadku problemów.

Załącznik nr 14 Struktura logiczna korekty informacji podsumowującej o dokonanych wewnątrzwspólnotowych dostawach/nabyciach towarów (VAT-UEK)

Encje w Drupalu. Tworzenie własnych encji i ich wpływ na poprawę wydajności

Wprowadzenie do Doctrine ORM

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Instrukcja integratora - obsługa dużych plików w epuap2

Programowanie współbieżne i rozproszone

Metody dostępu do danych

Języki i metody programowania Java. Wykład 2 (część 2)

Java a średni (?) projekt informatyczny

Strumieniowe bazy danych. Piotr i Paweł

To sposób w jaki użytkownik wchodzi w interakcje z systemem. Środowisko graficzne używa kombinacji graficznych elementów(przyciski, okna, menu) i

1 Wprowadzenie do J2EE

AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Elektroniki i Informatyki

Zaawansowane aplikacje WWW - laboratorium

Bazy danych. Plan wykładu. Diagramy ER. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych. Podstawy modeli relacyjnych

Założenia do ćwiczeń: SQL Server UWM Express Edition: \SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń.

Relacyjne bazy danych a XML

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

OpenLaszlo. OpenLaszlo

Projektowani Systemów Inf.

SCHEMAT DOKUMENTU POTWIERDZENIA GENEROWANEGO PRZEZ ZUS

Java jako język programowania

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Generowanie raportów

JAX-RS czyli REST w Javie. Adam Kędziora

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Wdrożenie do projektu

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Wielojęzykowość w aplikacjach J2EE. Tomasz.Skutnik@e-point.pl

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

P o d s t a w y j ę z y k a S Q L

Tworzenie projektu bazy danych z kreatorem odnośników - Filmoteka. Projekt tabel dla bazy Filmoteka

Krzysztof Kadowski. PL-E3579, PL-EA0312,

HermesEX. Dokumentacja serwisowa v

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Procesy biznesowe w praktyce. Przykłady użycia z wykorzystaniem jbpm 4.4

Web frameworks do budowy aplikacji zgodnych z J2EE

Javadoc. Piotr Dąbrowiecki Sławomir Pawlewicz Alan Pilawa Joanna Sobczyk Alina Strachocka

Wprowadzenie do baz danych

Hibernate. Od Nowicjusza do Profesjonalisty. Dave Minter Jeff Linwood

Microsoft Access materiały pomocnicze do ćwiczeń cz. 1

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Java Enterprise Edition spotkanie nr 1. Sprawy organizacyjne, wprowadzenie

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

OSGi Agata Hejmej

Laboratorium Technologii Informacyjnych. Projektowanie Baz Danych

Wywoływanie metod zdalnych

Język XML Schema. UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz. UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz

Domain-specific Languages. Języki dziedzinowe. Adam Robaszyński-Janiec

Plan. Wprowadzenie. Co to jest APEX? Wprowadzenie. Administracja obszarem roboczym

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

NHibernate. Narzędzie mapowania obiektowo - relacyjnego

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

Plan. Raport. Tworzenie raportu z kreatora (1/3)

LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika

Systemy GIS Tworzenie zapytań w bazach danych

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Bazodanowe usługi sieciowe w technologii ASP.NET. dr inż. Tomasz Tatoń

Programowanie w języku Java. Wykład 13: Java Platform, Enterprise Edition (Java EE)

METODY REPREZENTACJI INFORMACJI

Analiza i projektowanie aplikacji Java

Aplikacje WWW - laboratorium

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Instrukcja obsługi DHL KONWERTER 1.6

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Programowanie obiektowe

Transkrypt:

4Developers, 26 marca 2010

Zakres wykładu O czym zamierzam opowiedzieć: Przyspieszenie tworzenia aplikacji Ułatwienie utrzymania aplikacji Budowanie kontraktów pomiędzy developerami a innymi uczestnikami projektu Wsparcie kontraktów współpracy z systemami zewnętrznymi O czym nie będę mówił: Generatory aplikacji na podstawie bazy danych Edytory aplikacji WYSIWYG/CASE Czarodzieje (ang. wizards)/szablony z IDE

Wstęp - dla kogo to jest? Duża ilość powtarzalnego kodu Duża ilość osób w zespole Systemy przewidziane do wieloletniego rozwoju

Przykład: kod pobierający dane z bazy tradycyjnie 1 String query = "SELECT..., adres,... FROM klient WHERE id = 1"; 2 3 [...] 4 5 String adres = rs.getstring("adres"); Refaktoring: pole adres ma zostać zastąpione dwoma: adres linia 1 i adres linia 2 Metoda: cierpliwy search and replace Brak wsparcia ze strony środowiska programistycznego

Kod pobierający dane z bazy tradycyjnie - zagrożenia Niekompletność zmian 1 q = "SELECT..., adr" + 2 "es,... FROM klient WHERE id = 1"; 3 4 [...] 5 6 String adres = rs.getstring("adres"); Nadmiarowość zmian Odroczony czas spostrzeżenia błędu do momentu uruchomienia Nie wszystkie części aplikacji są tak samo testowane

Przykład: pobieranie danych z bazy wygenerowanym O/R mappingiem 1 Klient k = klientdao.getbypk(1); 2 String adres = k.getadres(); DAO (ang. Data Access Object) - obiekty dostępu do bazy danych POJO (ang. Plain Old Java Object) - reprezentują rekordy

Pobieranie danych z bazy wygenerowanym O/R mappingiem - zyski 1 Błędy sygnalizowane natychmiast przez kompilator oraz IDE 2 Kompletność refaktoringów 3 Ergonomia pracy

Czego użyć do generacji kodu? Wybór gotowej biblioteki: popularna (użytkownicy, wsparcie, forum, listy dyskusyjne) dostosowane do systemu budowania aplikacji na bieżąco poprawiana i rozwijana Samodzielna implementacja: dostosowana do potrzeb wymaga zasobów na implementacje i utrzymanie

Podstawowe zasady dotyczące implementacji 1 Wygenerowanego kodu nie umieszczamy w repozytorium 2 Wygenerowanego kodu nie edytujemy ręcznie

Obszary zastosowań Model bazy danych Model wymiany danych przez WebService Pliki konfiguracyjne Klucze plików lokalizacyjnych

Baza danych (O/R-mapping) Większość aplikacji biznesowych korzysta z bazy danych Dużo tabel i kolumn - ręczne tworzenie kodu jest czasochłonne Baza danych rozwijanej aplikacji podlega częstym zmianom Podział ról: projektant bazy i developer Krytyczna i podatna na drobne błędy

O/R Mapping - Hibernate http://www.hibernate.org/ 1 Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 2 3 Klient k = (Klient) session.get(klient.class, 1); 4 String adres = k.getadres(); 5 6 String q = " FROM " + Klient.class.getName() + " AS klient " + 7 " WHERE klient.adres = :adres AND klient.aktywny = : aktywny "; 8 List<Klient> result = (List<Klient>)session.createQuery(q). 9 setstring("adres", "Marszalkowska"). 10 setboolean("aktywny", true).list(); Plusy: Popularność, doskonałe wsparcie Minusy: Niedoskonałości biblioteki generującej kod Brak stałych do nazw tabel i kolumn

O/R Mapping - Torque http://db.apache.org/torque/ 1 Klient k = KlientPeer.retrieveByPK(1); 2 String adres = k.getadres(); 3 4 Criteria crit = new Criteria(); 5 crit.add(klientpeer.adres, "Marszalkowska").and(KlientPeer.AKTYWNY, true); 6 List<Klient> result = KlientPeer.doSelect(crit); Plusy: Generowanie stałych do nazw tabel i kolumn Minusy: Stary projekt Słabe wsparcie

XML - JAXB (ang. Java Architecture for XML Binding) http://jaxb.dev.java.net/ 1 <xsd:element name="klienci" type="t:klienci_type" /> 2 3 <xsd:complextype name="klienci_type"> 4 <xsd:sequence> 5 <xsd:element name="klient" type="t:klient_type" 6 minoccurs="0" maxoccurs="unbounded" /> 7 </xsd:sequence> 8 </xsd:complextype> 9 10 <xsd:complextype name="klient_type"> 11 <xsd:attribute name="id" type="t:positive_integer" use="required" /> 12 <xsd:attribute name="imie" type="t:text255" use="required" /> 13 <xsd:attribute name="nazwisko" type="t:text255" use="required" /> 14 <xsd:attribute name="status" type="t:statusklienta" use="required" /> 15 <xsd:attribute name="adres" type="t:text255" use="required" /> 16 <xsd:attribute name="birthdate" type="t:dateyyyymmdd" use="required" /> 17 </xsd:complextype>

XML - JAXB - wygenerowany kod 1 KlientType klient1 = factory.createklienttype(); 2 [...] 3 klient1.setstatus(statusklientaenum.t); 4 klient1.setadres("marszałkowska"); 5 6 KlientType klient2 = factory.createklienttype(); 7 [...] 8 klient2.setstatus(statusklientaenum.n); 9 klient2.setadres("al. Niepodległości"); 10 11 Klienci klienci = factory.createklienci(); 12 klienci.getklient().add(klient1); 13 klienci.getklient().add(klient2); 14 15 FileOutputStream out = new FileOutputStream(new File("/tmp/klienci.xml")); 16 marshaller.marshal(klienci, out);

XML - JAXB - wygenerowany plik XML 1 <?xml version="1.0" encoding="utf-8" standalone="yes"?> 2 <klienci> 3 <klient adres="marszałkowska" birthdate="20090730" id="1" 4 imie="marek" nazwisko="abacki" status="t"/> 5 <klient adres="al. Niepodległości" birthdate="20090730" id="2" 6 imie="krzysztof" nazwisko="babacki" status="n"/> 7 </klienci> Plusy: Zgodność pliku wynikowego ze schematem (m.in. formaty) Generowanie stałych do nazw typów i atrybutów Stałe z dozwolonej przestrzeni

Pliki konfiguracyjne - definicja Część przykładowego pliku konfiguracyjnego z Apache Struts struts-config.xml: 1 <form-bean name="klientform" type="org.apache.struts.action.dynaactionform"> 2 <form-property name="imie" type="java.lang.string" /> 3 <form-property name="nazwisko" type="java.lang.string" /> 4 <form-property name="adres" type="java.lang.string" /> 5 <form-property name="aktywny" type="java.lang.boolean" /> 6 </form-bean> Wygenerowany interfejs ze stałymi klientformc.java: 1 package struts; 2 3 public interface klientformc { 4 String FORM_NAME = "klientform"; 5 String imie = "imie"; 6 String nazwisko = "nazwisko"; 7 String adres = "adres"; 8 String aktywny = "aktywny"; 9 }

Pliki konfiguracyjne - kod Standardowy sposób odwołań do pól formularza: 1 Klient klient = new Klient(); 2 klient.setimie(form.getstring("imie")); 3 klient.setnazwisko(form.getstring("nazwisko")); 4 klient.setadres(form.getstring("adres")); 5 klient.setaktywny((boolean)form.get("aktywny")); Odwołanie do pól formularza z użyciem wygenerowanych stałych: 1 import struts.klientformc; 2 [...] 3 4 Klient klient = new Klient(); 5 klient.setimie(form.getstring(klientformc.imie)); 6 klient.setnazwisko(form.getstring(klientformc.nazwisko)); 7 klient.setadres(form.getstring(klientformc.adres)); 8 klient.setaktywny((boolean)form.get(klientformc.aktywny));

Pliki lokalizacyjne - klucze Część przykładowego pliku lokalizacyjnego validations.properties: 1 klient_form.adres.required=pole "Adres" jest wymagane 2 klient_form.adres.maxlength=pole "Adres" nie może zawierać więcej niż {0} znaków. Wygenerowany interfejs ze stałymi validationsc.java: 1 package i18n; 2 3 public interface validationsc { 4 String BUNDLE_NAME = "validations"; 5 String klient_form_adres_required = "klient_form.adres.required"; 6 String klient_form_adres_maxlength = "klient_form.adres.maxlength"; 7 }

Pliki lokalizacyjne - kod Standardowy sposób odwołań do kluczy lokalizacyjnych: 1 String adres = form.getstring("adres"); 2 if("".equals(adres.trim())) { 3 errors.add("validations", "klient_form.adres.required"); 4 } 5 if(adres.trim().length() > 255) { 6 errors.add("validations", "klient_form.adres.maxlength", 255); 7 } Odwołanie do kluczy lokalizacyjnych z użyciem wygenerowanych stałych: 1 import i18n.validationsc; 2 [...] 3 4 String adres = form.getstring(klientformc.adres); 5 if("".equals(adres.trim())) { 6 errors.add(validationsc.bundle_name, validationsc.klient_form_adres_required); 7 } 8 if(adres.trim().length() > 255) { 9 errors.add(validationsc.bundle_name, validationsc.klient_form_adres_maxlength, 255); 10 }

Podsumowanie - korzyści Nie trzeba ręcznie pisać oczywistego i powtarzalnego kodu Spójność kodu i powtarzalność wzorców Błędy znajdowane na etapie kompilacji Wykorzystanie auto-uzupełniania w IDE Łatwiejsze refaktoringi Łatwiejsze znajdowanie wielu odniesień do tego samego elementu (czytanie kodu)

Podsumowanie - utrudnienia Uzależnienie od dodatkowych bibliotek zewnętrznych Trudniejsze wprowadzenie nowego developera do projektu Bardziej skomplikowany proces budowania aplikacji Konieczność tworzenia własnych generatorów do specyficznych elementów

Czy są jakieś pytania? Zapraszam do dyskusji