Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:2009:miw09_logtalk_umlgraph:prezentacja [2009/06/06 02:25] jsi08 |
pl:miw:2009:miw09_logtalk_umlgraph:prezentacja [2019/06/27 15:50] (aktualna) |
===== Cechy LogTalk! ===== | ===== 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. | * 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. | * 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. |
* Wsparcie dla aplikacji wielowątkowych. | * Wsparcie dla aplikacji wielowątkowych. |
* Polimorfizm. Wsparcie dla wczesnego jak i późnego wiązania. | * 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. |
| |
| <code prolog> |
| :- 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. |
| </code> |
| |
| ===== 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: |
| |
| <code prolog> |
| :-consult('/usr/share/logtalk/configs/swi'). |
| :-consult('/usr/share/logtalk/compiler/logtalk'). |
| </code> |
| |
| Kompilowanie plików LogTalk: |
| <code prolog> |
| logtalk_compile([source_file1, source_file2, ...]). |
| logtalk_load([source_file1, source_file2, ...]). |
| </code> |
| |
| ===== 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 |
| |
| <code prolog> |
| ./umlgraph drow drow png |
| </code> |
| |
| |
| ===== 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]] |