Od wymagań do Javy w mgnieniu oka Michał Śmiałek Politechnika Warszawska RE-Challenge, Warszawa, 15.05.2015 Prelegent Czym się zajmowałem (od ok. 1991 r.) Profesor (informatyka) Politechnika Warszawska; UML, Inżynieria Wymagań, Projektowanie, MDD/MDA, Kierownik grupy SMoG (modelowanie oprogramowania) Kierownik zespołu PW w projekcie REMICS (7PR) Koordynator naukowy konsorcjum projektu ReDSeeDS (6PR): główny współautor języka RSL Trener w wielu szkoleniach dla profesjonalistów (> 200 edycji szkoleń) z zakresu inżynierii oprogramowania Konsultant w firmie Infovide-Matrix Kierownik projektów z zakresu budowy oprogramowania Inżynier procesu (pierwszy w Polsce certyfikat trenera RUP) Analityk wymagań oprogramowania i biznesu Projektant oprogramowania i programista ReDSeeDS 2 1
O czym będziemy mówić? Jakie są marzenia kierownika projektu IT? Jak pisać wymagania precyzyjnie? Jak działa narzędzie ReDSeeDS? Jak wygenerować kod z wymagań? ReDSeeDS 3 Marzenie kierownika projektu IT Wykonawcy Wymagania TEXT Czego potrzebujemy Język specyfikowania wymagań Kod Dobra komunikacja Automatyczna translacja ReDSeeDS 4 2
Od biznesu do kodu - tradycyjnie Specyfikacja wymagań w języku naturalnym specyfikacja projektowa wywiedziona z wymagań kod wywiedziony z modeli projektowych Ręczne przekształcenie Biznes Specyfikacja Wymagań TEXT Dokumentacja Projektowa Kod Analityk Projektant Programista ReDSeeDS 5 Od biznesu do kodu - ReDSeeDS Specyfikacja wymagań przy użyciu precyzyjnych wymagań kod wygenerowany z wymagań Automatyczna generacja Biznes Specyfikacja Wymagań RSL Model Projektowy Kod Analityk Agile Programista ReDSeeDS 6 3
Pisanie dobrych opowiadań a pisanie dobrych wymagań Połączenie opowiadania (sekwencji zdarzeń) i opisów środowiska (ludzie, wnętrza, krajobraz ). ReDSeeDS 7 Rozdzielenie opowiadania od środowiska Zdarzenia a sceny ReDSeeDS 8 4
Jak działa ReDSeeDS? Narzędzie do szybkiego tworzenia działających prototypów oprogramowania z przypadków użycia Wykonawcy ReDSeeDS 9 Zasada działania narzędzia? Wymagania Kompilator MOLA Transformati Program on on program MOLA Java formułowanie Edytor RSL kompilacja Maszyna Transformująca MOLA ReDSeeDS wyjście generacja Edytor UML zapis Model RSL wejście Model UML + kod metod eksport Repozytorium modeli ReDSeeDS 10 5
Formułowanie wymagań ReDSeeDS 11 Pisanie historii ReDSeeDS 12 6
Definiowanie dziedziny ReDSeeDS 13 Generowanie kodu w Javie ReDSeeDS 14 7
Przykład RSL do kodu User Add new «invoke» Add new author «trigger» save button «trigger» add new button 1. User selects add new button 2. System shows add new page 1. User selects add new button invoke Add new author 2. System shows add new page 3. User enters invoke 4. User selects save button invoke 5. System validates 3. User enters cond: valid 6a. 4. System User selects saves save button 5. System validates cond: invalid 6b. System shows invalid message «list» list «frame» add new page * 1 «message» invalid message * * author title : Text hard cover : Boolean issue date : Date ReDSeeDS 15 Generowanie interfejsów «interface» IView User Add new 1. User selects add new button 1. User selects add new button 2. System shows add new page 2. invoke SystemAdd shows new author add new page 3. User invoke enters 4. User invoke selects save button 5. System 3. Uservalidates enters 4. cond: User selects valid save button 6a. System saves 5. System validates cond: invalid user-totrigger sys-toconcept sys-to-frame sys-tomessage + setpresenter(ipresenter) :void + showaddnewauthorpage() :void + showaddnewbookpage() :void + showaddnewpublisherpage() :void + showbooklistpage() :void + showinvalidauthormessage() :void + showinvalidbookmessage() :void + showinvalidpublishermessage() :void «interface» IPresenter + SelectsAddNewAuthorButton() :void + SelectsAddNewBookButton() :void + SelectsAddNewPublisherButton() :void + SelectsAddPublisherButton() :void + SelectsDeleteBookButton() :void + SelectsSaveAuthorButton() :void + SelectsShowBookListButton() :void + SelectsSaveBookButton() :void + setmodel(imodel) :void + setview(iview) :void V P 6b. System shows invalid message «interface» IModel + DeletesBook() :void + FetchesBookList() :void + SavesAuthor() :void + SavesBook() :void + SavesPublisher() :void + ValidatesAuthor() :void + ValidatesBook() :void + ValidatesPublisher() :void M ReDSeeDS 16 8
Generowanie kodu dla scenariuszy 1 3 4 2 User IView User Add new 1. User selects add new button 1. User selects add new button 2. Systemshows add new page 2. invoke Systemshows Addnewadd author new page 3. User invoke enters 4. User invoke selects save button 5. 3. System User enters validates 4. User cond: selects save valid button 6a. 5. System saves validates cond: invalid 6b. System shows invalid message invoke 4 1 public class PresenterImpl implements IPresenter { private IModel model; private IView view; public void SelectsAddNewBookButton() { view.showaddnewbookpage(); } public void SelectsSaveBookButton(){ int res = model.validatesbook(); if ( res == 1 /* valid*/) { model.savesbook(); } else if ( res == 2 /* invalid*/) { view.showinvalidbookmessage(); } } public void SelectsAddNewAuthorButton(){ // code for Add new author use case... } 6a 2 5... IModel ReDSeeDS 17 Generowanie UI User Add new 1. User selects add new button 2. Systemshows add new page 1. invoke User selects Add new add author new button 3. 2. User Systemshows enters add new page 4. Userselects invoke save button 5. System invoke validates 3. User enters cond: valid 4. Userselects save button 6a. 5. System System saves validates cond: invalid 6b. System shows invalid message «frame» list page «list» list «trigger» save button «frame» add new page * «message» invalid message * * author Booklist List Page title : Text hard cover : Boolean issue date : Date Book List Title Issue date Hard cover Author Addnew New Book Page Book Book Title Author Issue date Text Field Select author(s) 2013-04-08 Title Author Issue date Hard cover Text Field Select author(s) 2013-04-08 Inv alid message The entered data is invalid OK Hard cover < Back Save Add new author < Back ReDSeeDS 18 9
Generowanie DTO * * author title : Text hard cover : Boolean issue date : Date name: Text birth year: Number XBook - xbookid :int XAuthor - title :String - issuedate :Date - hashardcover :boolean - xauthorid :int - authorsname :String - birthyear :int Auto-generated getters and setters + getauthorlist() :List<XAuthor> + gethashardcover() :boolean + getid() :int + getissuedate() :Date + gettitle() :String + setauthorlist(list<xauthor>) :void + sethashardcover(boolean) :void + setid(int) :void + setissuedate(date) :void -List * -authorlist + getauthorsname() :String + getbirthyear() :int * + getbooklist() :List<XBook> + getid() :int + setauthorsname(string) :void + setbirthyear(int) :void + setbooklist(list<xbook>) :void + setid(int) :void Auto-generated getters and setters + settitle(string) :void ReDSeeDS 19 Dla kogo jest ReDSeeDS? Sformułowanie wymagań Sprecyzowanie wymagań Zaprojektowanie systemu Oszacowanie pracochłonności Przetestowanie systemu Wykonawcy Zaimplementowanie systemu Organizacje zamawiające oprogramowanie Firmy produkujące oprogramowanie Osoby amatorsko tworzące oprogramowanie ReDSeeDS 20 10
www.redseeds.eu Dziękuję za uwagę! 11