poniedziałek, 18 marca 2013

Data type - typy własne

Tworząc model klas w języku UML mamy możliwość określenia typów atrybutów. W artykule Typy danych atrybutów opisałem, jakie są możliwe do wyboru primitive types w zależności od wybranego języka programowania.
W wielu przypadkach typy proste nie są wystarczające. Kod aplikacji z reguły będzie zawierać typy złożone, charakterystyczne dla danego rozwiązania.




Aby zdefiniować takie typy możemy skorzystać ze specjalnego typu klasy, o stereotypie <<Data Type>>. DataType wstawiamy wybierając z toolboxa dla diagramu klas pozycję zaznaczoną poniżej.
EA toolbox - class - data type
W ten sposób możemy utworzyć własne typy proste, na przykład Waga:
prosty typ danych - waga
Lub typy ustrukturyzowane, na przykład Adres, które składają się z wielu atrybutów, z których każdy może mieć przypisany typ prosty.
ustrukturyzowany typ danych - adres

W przypadku, gdy definiujemy wiele typów danych, warto wydzielić je do osobnego pakietu o nazwie Data type lub Typy danych. Zebranie ich w jednym miejscu pozwala na łatwiejsze zarządzanie nimi.

A jak należy użyć tych typów?

W oknie Attributes dla wybranej klasy należy wybrać z listy rozwijalnej typ atrybutu (pole Type) Select Type... Otworzy się wówczas dodatkowe okno Select Classifier. W oknie tym należy wyszukać i zaznaczyć odpowiedni Data Type.

W powyższym przykładzie stworzono klasę o nazwie List. Klasa ta posiada między innymi atrybuty, takie jak wagaListu (o typie Waga), adresNadawcy i adresOdbiorcy (o typie Adres).


Dostępny jest również do zastosowania jeszcze jeden typ danych, o nazwie Enumeration. Może on zawierać listę zdefiniowanych przez użytkownika wartości.
Enumeration służy do zdefiniowania listy stałych lub rzadko zmiennych możliwych znaczeń. W odniesieniu do projektowanego rozwiązania, można je w pewnym uproszczeniu traktować jako wartości słownikowe.
Przykładem może być typ danych Status.
Klasa List po dodaniu nowego atrybutu o nazwie status wygląda następująco:


2 komentarze:

  1. Do tego już doszedłem wcześniej. Ale podpowiedz proszę jak zamodelować subset takiego enuma ?
    Przyjmijmy, że nasz enum "Status" rozszerzymy o literał "w doręczeniu".

    Teraz definiuję w klasie Listonosz atrybut statusListu : Status - ale chciałbym równocześnie zaznaczyć, że w tej klasie możemy pracować tylko na listerałach "w doręczeniu" i doręczony.
    Gdzie określić taki subset ?

    OdpowiedzUsuń
  2. Informacja o tym, że w określonym przypadku statusListu może przyjmować wartości tylko z podzbioru (subset) to Constraint.
    Constraint można dodać do diagramu i przypiąć na przykład do relacji pomiędzy klasą a enumeration. Constraint wizualnie jest podobny do zwykłej notatki i może być zapisany językiem naturalnym lub OCL.
    Dodam tylko, że nie wiem, czy jest dobrym pomysłem przypisywanie atrybutu statusListu do klasy Listonosz. Zakładm jednak, że podany przykład powstał na bazie przykładu z artykułu.

    OdpowiedzUsuń