~~SLIDESHOW~~
====== LogTalk_UMLgraph ======
=== Generowanie diagramów klas UML w języku Prolog ===
Zrealizował: [[msasko@gmail.com|Mariusz Sasko]] (4RI)
===== Cele Projektu: =====
*Analyze, describe, prepare a short tutorial as S5 for UMLgraph.
*Provide a simple Prolog API for genarating, and visualizing UML diagrams from Prolog, write a Prolog parser
*Research on existing approaches to representing UML in/with Prolog
*Analyze, describe, prepare a short tutorial as S5 for LogTalk.
*Check first has anyone made some progress in the integration of these two!
*Provide menas for generating visualizations of UML diagrams from Prolog for LogTalk
===== Podstawy UMLGraph. =====
* UMLgraph został napisany przez greckiego profesora uniwersytetu Ateńskiego o imieniu Diomidis Spinellis.
* Pierwsze publiczne wydanie UMLgraph to wersja 1.15 wydana w 2002-07-26. Od tej pory projekt przeszedł różne modyfikacje i zostały dodane nowe funkcjonalności. Aktualna wersja 5.2 została wydana 2008-12-03, a obecnie trwają prace nad wersją 5.3.
* UMLgraph jest wydawany na bardzo liberalnej licencji [[http://pl.wikipedia.org/wiki/Licencja_BSD| BSD(Berkeley Software Distribution License)]], której podstawą jest wolny dostęp do kodu źródłowego, możliwość jego modyfikacji i ulepszania, a także rozprowadzanie programu w nowej zmodyfikowanej postaci, po to aby mogła korzystać z nich cała społeczność.
===== Instalacja i wymagania UMLGraph! =====
Musimy najpierw posiadać następujące pakiety w systemie:
* Java Jdk 6
* GraphViz
Aby korzystać z UMLGraph należy odpowiednio zmodyfikować skrypt: ///ścieżka/UMLGraph/bin/umlgraph//
===== Cechy UMLGraph. =====
* Jak sama nazwa wskazuje UMLgraph jest narzędziem umożliwiającym rysowanie diagramów UML (Unified Modeling Language), służących do modelowania obiektów w analizie obiektowej. Opis diagramu UML jest czysto tekstowym opisem reprezentacji, który UMLgraph analizuje i przedstawia w odpowiedniej formie graficznej.
* Narzędzie stworzone specjalnie dla języka Java. UMLgraph potrafi analizować składnię i semantykę tego języka i na podstawie analizy tworzyć diagramy UML.
* Nie wymaga on pełnych definicji metod czy nawet klas. Definiujemy to co chcemy aby znalazło się na diagramie.
* Pozwala on między innymi na ingerowanie w to jak chcemy aby dany element był przedstawiony na diagramie za pomocą dodanych w komentarzach komend JavaDoc, przed definicją klasy, której mają dotyczyć.
* UMLGraph generuje diagramy w formatach: gif, ps, png, svg.
===== UMLGraph pozwala modelować (1):=====
* klasy (używając tagu: **@opt shape** nazwa )
* funkcje (wyspecyfikowane jako metody w klasie)
* atrybuty (wyspecyfikowane jako pola w klasie)
* stereotypy (używając tagu: **@stereotype** nazwa )
* wartości oznaczone (używając tagu: **@tagvalue** nazwa wartość )
===== UMLGraph pozwala modelować (2):=====
* relację implementowania (używając deklaracji z języka Java: **implements** )
* relację dziedziczenia (używając deklaracji z języka Java: **extends** albo tagu: **@extends** )
* relację assocjacji (używając tagu: **@assoc** )
* relację skierowanej assocjacji (używając tagu: **@navassoc** )
* relację agregacji (używając tagu: **@has** )
* relację kompozycji (używając tagu: **@composed ** )
* relację zależności (używając tagu: **@depend ** )
===== Opcje:=====
* **@opt ... ** - służy do formatowania. Posiada liczne opcje z którymi można go stosować. Dokładny opis wszystkich możliwości znajduje się pod linkiem: [[http://www.umlgraph.org/doc/cd-opt.html| Tag @opt]].
* **@note ... ** - powoduje dodanie dodatkowej etykiety,
* **@view @match** - są to znaczniki używane do nadania pewnych opcji klasom których nazwy spełniają np. wyrażenie regularne. Widoki są dziedziczone od innych klas i posiadają ich cechy.
* **@hidden** - dany obiekt nie będzie przedstawiony na diagramie, służy do definiowania parametrów w całym pliku|
===== Przykład:=====
/**
* @opt shape class
* @opt edgecolor "yellow"
* @opt nodefontname "Times"
* @opt nodefillcolor "#a0a0a0"
* @opt nodefontsize 14
* @hidden
*/
class UMLOptions{}
/**
* @opt nodefontname "Helvetica-Bold"
* @opt nodefontcolor "white"
* @note opis ...
* ... kontynuacja opisu ...
* @note inny opis ....
*/
class klasa{}
===== Przykład:=====
{{:pl:miw:2009:miw09_logtalk_umlgraph:pp.png|}}
**Ciekawe miejsca:**
* Pierwsza klasa nie jest pokazana na diagramie. Dzieje się to za sprawą znacznika **@hidden**.
* **klasa{}** posiada cechy wyszczególnione dla **UMLOptions{}**. Jest to sposób na ustawianie wartości domyślnych dla wszystkich obiektów w pliku, a także elementów takie jak np. tło diagramu. Cechy zostają odziedziczone przez kolejne obiekty.
===== Początki języka LogTalk =====
* Język napisany przez Paulo Moura.
* Pierwsza wersja LogTalk 1.0 została wydana w 1995 roku.
* W 1998 roku, przyszła na świat wersja 2.0, która do tej pory jest wersją aktualną i nie jest ona kompatybilna z LogTolk 1.0.
* Najnowsza wersja 2.35.1 została wydana dosłownie przed kilkoma dniami, bo 1 marca 2009 roku.
* Informacje dotyczące rozwoju tego projektu są systematycznie publikowane na stronie http://logtalk.org/news.html. Ponadto jest prowadzony blog o tym języku, gdzie można również szukać informacji dotyczących tego projektu: http://blog.logtalk.org.
===== Cechy LogTalk! =====
* LogTalk jest rozszerzeniem dla języka Prolog, który wzbogaca go o dodatkowe możliwości.
* LogTalk jest próbą integracji programowania logicznego z programowaniem obiektowym.
* Pozwala na enkapsulowanie bazy wiedzy, napisanej w deklaratywny sposób, wewnątrz obiektu. Dzięki temu jest ona dostępna jedynie tam gdzie jest potrzebna, a kod programu staje się łatwiejszy w utrzymaniu i bardziej efektywny.
* Od strony programisty definiowanie obiektu jest podobne do tworzenia kilku przestrzeni nazw z osobnymi bazami wiedzy w każdym obiekcie.
=====O jakie cechy LogTalk wzbogaca Prolog?=====
* Integracja programowania logicznego z programowaniem obiektowym.
* Wielokrotne używanie napisanego kodu.
* Wsparcie zarówno dla programowania opartego na klasach jak i prototypach.
* Utrzymywanie hierarchii obiektów.
* Separacja interfejsów od definicji klas.
* Możliwość ukrywania składników klas. Występują cztery typy praw dostępu do komponentów obiektu: pakietowy, private, protected, i public.
* Dziedziczenie.
* Wsparcie dla aplikacji wielowątkowych.
* Polimorfizm. Wsparcie dla wczesnego jak i późnego wiązania.
=====Elementy języka. =====
* obiekty - prototypy, klasy i instancje. Obiekty tworzymy za pomocą dyrektyw: **object/1-5** oraz **end_object/0**, pomiędzy którymi umieszczamy definicję obiektu.
* protokoły - odpowiedniki interfejsów. Definicje protokołów są enkapsulowane pomiędzy dwiema dyrektywami: **protocol/1-2** i **end_protocol/0**.
* kategorie - nie posiadają odpowiedników. Są to kontenery zawierające pewne funkcjonalności. Kategorie są tworzone dzięki dyrektywom **category/1-3** oraz **end_category/0**.
* predykaty - odpowiedniki funkcji.
=====Relacje między obiektami.=====
LogTalk pozwala na tworzenie obiektów, które nie są związane z innymi żadną relacją, jak i tworzyć hierarchie obiektów oparte na prototypach albo klasach. Można ponadto używać zarówno pojedynczego jak i wielokrotnego dziedziczenia.
* **objectName** - nazwa obiektu, argument obowiązkowy.
* **implements(protocolName)** - protokół implementowany przez dany obiekt.
* **imports(categoryName)** - kategoria importowana przez dany obiekt.
* **extends(parentName)** - rodzic po którym następuje dziedziczenie.
* **instantiates(className)** - obiekt jest instancją klasy className.
* **specializes(superclassName)** - obiekt jest podklasą a superclassName superklasą.
===== Deklarowanie Predykatów. =====
* Wszystkie Predykaty do których chcemy mieć dostęp z innych obiektów muszą być zadeklarowane.
* Deklaracja musi zawierać przynajmniej nazwę predykatu oraz liczbę argumentów.
* Muszą one poprzedzać definicję albo wywołanie w celu zapewnienia poprawnego przebiegu kompilacji.
Zakres widoczności:
* **public** - predykat można wołać z dowolnego obiektu.
* **protected** - mogą być wołane jedynie z potomka lub w obiekcie w którym są zdefiniowane.
* **private** - dostęp do predykatów ma jedynie obiekt w którym jest zdefiniowany.
* **local** - jak predykaty prywatne mogą być jedynie wołane z obiektu, ale są niewidoczne dla mechanizmu obsługi błedów.
===== Przykład. =====
Predykaty dla obiektów w LogTalk są definiowane tak samo jak w Prologu. Dodawane są jedynie dodatkowe znaczniki.
:- object(list).
:- public(append/3).
:- public(member/2).
append([], L, L).
append([H| T], L, [H| T2]) :-
append(T, L, T2).
member(H, [H| _]).
member(H, [_| T]) :-
member(H, T).
:- end_object.
===== Uzyskiwanie informacji o obiektach. =====
* | ?- instantiates_class(InstanceName, ClassName). - Sprawdza czy zachodzi relacja //instantiates//.
* | ?- specializes_class(ClassName, SuperclassName). - Sprawdza czy zachodzi relacja //specializes//.
* | ?- extends_object(ObjectName, ParentName). - Sprawdza czy zachodzi relacja //extends//.
* | ?- imports_category(ObjectName, CategoryName). - Sprawdza czy zachodzi relacja //imports//.
* | ?- implements_protocol(ObjectName, ProtocolName). - Sprawdza czy zachodzi relacja //implements//.
* | ?- object_property(ObjectName, PropertyName). - Sprawdza czy ObjectName posiada właściwość PropertyName.
===== Uzyskiwanie informacji o protokołach. =====
* | ?- extends_protocol(ProtocolName1, ProtocolName2). - Sprawdza czy zachodzi relacja //extends//.
* | ?- implements_protocol(ObjectOrCategoryName, ProtocolName). - Sprawdza czy zachodzi relacja //implements//.
* | ?- protocol_property(ProtocolName, PropertyName). - Sprawdza czy ProtocolName posiada właściwość PropertyName.
===== Uzyskiwanie informacji o kategoriach. =====
* | ?- extends_category(CategoryName1, CategoryName2). - Sprawdza czy zachodzi relacja //extends//.
* | ?- imports_category(ObjectName, CategoryName). - Sprawdza czy zachodzi relacja //imports//.
* | ?- implements_category(ObjectName, CategoryName). - Sprawdza czy zachodzi relacja //implements//.
* | ?- category_property(CategoryName, PropertyName). - Sprawdza czy CategoryName posiada właściwość PropertyName.
===== Instalacja i uruchamianie programów LogTalk. =====
- Odpowiednie pakiety w zależności od tego na jakim systemie operacyjnym pracujemy pobieramy ze strony: http://logtalk.org/download.html
- Uruchomienie LogTalk to po prostu uzgodnienie dwóch plików:
:-consult('/usr/share/logtalk/configs/swi').
:-consult('/usr/share/logtalk/compiler/logtalk').
Kompilowanie plików LogTalk:
logtalk_compile([source_file1, source_file2, ...]).
logtalk_load([source_file1, source_file2, ...]).
===== Zaproponowane rozwiązanie.=====
Obiekt javaobject - zawiera następujące publiczne predykaty:
* //object_drow/1// - zapisuje obiekty, za pomocą skłądni Java.
* //category_drow/1// - zapisuje kategorie, za pomocą skłądni Java.
* //predicate_drow/1// - zapisuje predykaty, za pomocą skłądni Java.
Obiekt javacomment - zawiera następujące publiczne predykaty:
* //setComment/1// - przyjmuje listę stringów. Stosuje się go do umieszczenia dodatkowych definicji opisującymi tworzone diagramy.
* //setAsUMLMainComment/0// - ustawia zasięg komentarza dla całego diagramu.
===== Zaproponowane rozwiązanie.=====
Obiekt javaobject - zawiera następujące publiczne predykaty:
* //object_drow/1// - zapisuje obiekty, za pomocą skłądni Java.
* //category_drow/1// - zapisuje kategorie, za pomocą skłądni Java.
* //predicate_drow/1// - zapisuje predykaty, za pomocą skłądni Java.
Obiekt javacomment - zawiera następujące publiczne predykaty:
* //setComment/1// - przyjmuje listę stringów. Stosuje się go do umieszczenia dodatkowych definicji opisującymi tworzone diagramy.
* //setAsUMLMainComment/0// - ustawia zasięg komentarza dla całego diagramu.
===== Zaproponowane rozwiązanie.=====
Obiekt mainobject - zawiera następujące publiczne predykaty:
* //mainFunction/0// - ten predykat należny zdefiniować samemu. Zawiera on definicję diagramu. Opisujemy tutaj elementy, które chcemy rysować na diagramie za pomocą //javaobject//, dodając komentarze opisujące diagram za pomocą //javacomment//.
Plik drow.pl:
* //drow/0// - predykat ładuje wybrany plik LogTalk i zapisuje go do pliku.
Obiekty w pliku drowobject.lgt.
* plik służy do zademonstrowania przykładu działania prezentowanego rozwiązania.
===== Zaproponowane rozwiązanie.=====
Skrypt umlgraph gdzie:
* ${1} oznacza nazwę kompilowanego pliku prologa.
* ${2} oznacza nazwę wywoływanego predykatu.
* ${3} oznacza format w jakim zostanie zapisany diagram.
Za pomocą poniższej komendy dostajemy plik .java i diagram drow.png
./umlgraph drow drow png
===== Diagram drow.png =====
{{:pl:miw:2009:miw09_logtalk_umlgraph:drow.png|}}
===== Ograniczenia i problemy.=====
* Ograniczenia UmlGraph - interpretuje tylko Javę
* Problem z inną semantyką LogTalk i JAVA - brak kategorii w Javie
* Brak typów w LogTalk - konieczność dodania sztucznych typów.
* Brak możliwości dostępu do predykatów prywatnych - nie można ich pokazać na diagramie.
===== Materiały =====
* [[http://www.umlgraph.org/ | UMLgraph - główna strona projektu ]]
* [[http://www.umlgraph.org/doc/index.html| Tworzenie diagramów UML za pomocą UMLgraph - tutorial ]]
* [[http://www.umlgraph.org/download.html| UMLgraph - download]]
----
* [[http://logtalk.org/ | LogTalk - główna strona projektu ]]
* [[http://blog.logtalk.org// | LogTalk - blog ]]
* [[http://logtalk.org/manuals/userman/index.html|User Manual]]