26 Şubat 2014 Çarşamba

Enterprise Architect Automation Interface

Enterprise Architect Notlarım
Giriş
Enterprise Architect Bir CASE (Computer Aided Software Engineering, Bilgisayar Destekli Yazılım Mühendisliği) aracıdır.

Bu tür araçların, CMMI sürecinin iyileştirilmesinde kullanılması konulu "akademik (!!)" bir çalışmada kullanılmasını görünce, insanın aklına Excel'in "not tutmak" için kullanılması geliyor.

CASE araçları kimileri tarafından modası geçmiş olarak görülse de, ben yazılım kod üretmek için olmasa bile, "Yazılım Ürün Hattı" konusu içinde bulunan Information Model'i betimlemek için faydalı olduklarını düşünüyorum.

Enterprise Architect Automation Interface İçin Ne Lazım ?
Enterprise Architect Automation Interface kullanabilmek içim eaapi.jar ve SSJavaCOM.dll doslayarı lazım. Her şey COM üzerinde inşa edildiği için EA.exe arka planda çalışmalı. Ayrcıa tüm veri yapıları başlangıç indeksi olarak Java'daki gibi 0 sayısı ile başlıyorlar.
Repository Sınıfı Nedir ?
Bu sınıf ile EA Automation arayüzüne erişim sağlanıyor. Aşağıdaki açıklamada entry point olduğu söyleniyor.

The Repository package contains the high level system objects and entry point into the model itself using the Models collection and the other system level collections.

Şekilden de tüm diğer sınıflara erişim için kullanılabileceği görülebilir.

Örnek:
import org.sparx.*;
Repository repository = new Repository ();
repository.open ("c:\\eatest.eap");
Eğer SQLServer'a bağlanmak istersek bu sefer bağlantı dizisini vermek lazım. Kullanılacak diziyi File/Open Project menüsünden görebiliriz. Örnek:
import org.sparx.*;
Repository repository = new Repository ();
String conn = "Model Ismi - DBType=1;Connect=Provider=SQLOLEDB.1;Password=mypass;Persist Security Info=true;User ID=myuser;Initial Catalog=MyModel;Data Source=MyServer\SQLEXPRESS";
repository.open (conn);
Package Sınıfı Nedir?
Bu sınıf ile paketlerin içindeki diagramlar bulunabilir.
Package1
  | -> Package2
           |->Diagram1
şeklinde bir ağaç yapısı varsa, Diagram1'e şöyle erişişir.

Collection<org.sparx.Package> packages = p.GetPackages();
Package package= packages.GetAt (0);
Collection<org.sparx.Diagram> diagrams= package.GetDiagrams();

Diagram Sınıfı Nedir?
Bu sınıf UML ile tasarlanan herhangi bir diagramı temsil ediyor.Yukarıdaki örnekten devam edersek. Diagram1 sınıfının içindeki nesnelere erişmek için aşağıdaki gibi yapılabilir.

Diagram diagram = diagrams.GetAt(0);
Collection<org.sparx.DiagramObject> diagramObjects = diagram.GetDiagramObjects();

Bir diagramı diske emf dosyası olarak kaydetmek için buradaki koda bakılabilir.

Element Sınıfı Nedir?
Bu sınıf ile diyagram içindeki sınıfın bilgisine erişmek mümkün. Aşağıdaki gibi GetElementByID metodu ile yapılabilir.

DiagramObject diagramObject = diagramObjects.GetAt (0);
int elementID = diagramObject.GetElementID (); //56110 verir
Element element = repository.GetElementByID (elementID);
String stereoType = element.GetStereoType ();//struct verir
String name = element.GetName (); //MyStruct verir
Collection<org.sparx.Attribute> attributes = element.GetAttributes();
Element'e direkt erişmek için GUID kullanılabilir. Örnek:
Element myClass = repository.GetElementbyGuid ("{7AC7AB80-DEE5-4CD1-...}");

Burada dikkat edilmesi gereken konu GetAttributes metodunun döndürdüğü Collection sınıfının java.util paketi içindeki Collection olmadığı. Bu sınıfı bir ArrayList'e çevirmek için aşağaki kod kullanılabilir

ArrayList<Attribute> list = new ArrayList <Attribute> ();
Iterator it = attributes.Iterator ();
while (it.hasNext ()){
  list.add (it.next());
}
Attribute Sınıfı Nedir?
Bu sınıf ile class veya struct içindeki alanların bilgisine erişmek mümkün.
Attribute attribute = attributes.GetAt (0);

String name = a.GetName();//m_MyAttributeString type = a.GetType ();//longint attributeID = a.GetElementID () //45789
Attribute'ları sıralama örneği
Collections.sort (list,new Comparator<Attribute> (){
  @Override  public int compare (Attribute left,Attribute right){
    if (left.GetPos () > right.GetPos ()){return 1;}
    if (left.GetPos () < right.GetPos ()){return -1;}
    return 0;
  }
});
Örnekler
EA kurulumunda C:\Program Files (x86)\Sparx Systems\EA\Code\Code Samples\ altında C# ve Java örnek projeleri var.

EA Plugin
EA için plug-in yazmayı gösteren güzel bir yazı burada.

Diğer EA Notlarım

Projeyi Import ve Export Yeteneği
EA'ya girilen herhangi bir paket, Project Browser ağacına sağ tıklanarak, XML olarak kaydedilebiliyor. Daha sonra paketi silip, tekrar import edebilmek mümkün.

Model Transformation
Burada Computation Independent Model'den Project Independent Model'e (PIM) ve daha sonra Platform Specific Model'e geçiş anlatılıyor.

Kaynak Kodu Import Yeteneği
Pakete sağ tıklanınca çıkan "Code Engineering" menüsünden "Input Source Directory" seçilir. Açılan penceredeki bazı seçenekler şu anlama geliyor.

Package Structure
Create Package per Directory : C++ projelerinde namespace yerine dizin yapısı bazen daha önemli olabiliyor. Dizin yapısını EA'da paket yapısını yansıtmak istersek kullanılır.

Create Package per Namespace : Java, C# gibi namespace'e dayalı projelerde aynı namespace içinde ancak farkı dizinlerdeki kodları aynı EA paket içine toplar.

Import işlemi sonucunda çıkan class diagram çok büyükse "Diagram/Zoom/Fit to Window" menüsünden harita görünümü elde edilebilir ve sınıflar düzenlenir.

Tersine Mühendislik Sonucunda Model Ne Yansır?

class, enum ve typedef'lerin modellenmesi
Araç C++ kodunu global space içinde bulunan class,enum ve typedef'leri başarıyla modelliyor. Her türe stereotype veriyor.

typedef'lerin UML ile modellediğini ilk defa bu araçta gördüm. Sağ üst köşede typedef'in gerçekte hangi tip olduğu olduğu da yazıyor.

Association'ların modellenmesi

class A {} class B {A* m_pA;} şeklindeki iki sınıf "association" olarak modelleniyor. Association yerine Aggregation veya Composition (Aggregation'a göre daha sıkı bir bağı temsil eder) denilseydi belki daha iyi olurdu. Ancak genel bir kelime olan "association" kullanılmış. Association düz bir çizgi ile gösteriliyor. Eğer direction değeri verilmişse ucunda ok vardır. Association ile her nesnenin kendi yaşam döngüsü olduğu ve bir nesnenin diğerinin sahibi olmadığı farz edilir.

Association çizgisine çift tıklayınca

General Sekmesinde 
Source : B Target : A Direction : Source -> Destination

Target Role Sekmesinde 
B Role : m_pA (çizgide gösterilen etiket) yazıldığını görebiliriz.


Attribute'ların Modellenmesi

Array
Araç array gibi attribute'ları Attributes penceresindeki Details sekmesinde bulunan Container Type alanında gösteriyor. C++ kodu için bu alana örneğin [4] yazıyor.

static, const vs
Araç static, const gibi modifier'ları Attributes penceresindeki General sekmesinde "static" ve "const" checkboxlarında gösteriyor. Ayrıca varsa "Initial" alanınıda dolduruyor

Attribute'ların Gruplanması veya Sıralanması
Araç eğer arzu edilirse attributeları gruplayıp her grubu kendi içinde sıralayabiliyor. Ben bu şekilde çalışmasını sevmiyorum çünkü koddan farklı bir şey gösterilmesi hoşuma gitmiyor. Bu yüzden Tools / Options altındaki "Group Operations by Stereotype", "Group Attributes by Stereotype", "Sort Features Alphabetically" seçeneklerini kapatıyorum.

Aggregate İlişkisi
Bu ilişkiyi kurmak için "Compose" düğmesine tıklanarak hedef sınıfı kaynak sınıfı birleştirmek gerekiyor.

Kaynak Kod Üretme Yeteneği
Burada Model Interpretation ve Code Generation arasında karşılaştırma yapılan bir yazı var.

Pakete sağ tıklanınca çıkan "Code Engineering" menüsünden "Generate Source Code" seçilir. "Auto Generate Files" seçeneği kullanılmazsa, her element için üretilecek dosya ismi istenir. EA element ile dosya ismini bir şekilde eşleştirip hatırlıyor. "Override Code" seçeneği kullanılırsa diskteki mevcut dosyanın üzerine yazılır.

Code Template
Kaynak kodu üretirken EA Code Template'ları kullanır. Hazır şablonlardaki  macroları şu şekilde okuyabiliriz.

%macro% : Aynı Windows bat dosyasında olduğu gibi macronun değerini verir.


Diyagram Düzenleme
Layout
Tersine mühendislik sonucunda yaratılan diagram çok düzensiz görünebilir. "Diagram/Layout Diagram" menüsünden diagram otomatik olarak daha düzenli hale getirilebilir.

Hizalama
Birden fazla nesne seçilip sağ tıklanarak "Align Centers / Align Horizontally" veya Vertically seçenekleri ile yatay dikey hizalama yapılabilir.

Arama
Açtığımız bir diagramı Project Browser içinde bulmak istersek "Diagram/ Find in Project Browser" menüsü kullanılabilir.

Aynı şekilde isim ile modelde  arama yapmak için "Model Search Window" simgesi kullanılabilir veya "Edit/Model Search" menüsü de aynı işlevi görür.


Class Attribute Düzenleme
Mevcut bir attribute "Copy" düğmesi ile kopyalanabiliyor.

Aynı Anda Birçok Kişinin Çalışması
Model üzerinde aynı kullanıcı ismiyle giriş yaparak, birden çok kişi çalışabilir. Bu durumda EA modelin değiştiğini anlıyor ve tekrar yüklenmesi gerektiği konusunda uyarı veriyor.

Eğer bir başka kişi tarafından modelin değiştirilmesi engellenmek istenirse, pakete sağ tıklayıp "Lock" seçeneği kullanılarak, kişi veya grup haricindekilerin paket/diyagramı değiştirmesi engellenebilir.

Eğer modeli kendimiz yenilemek istersek File/Reload Current Project menüsünü kullanabiliriz.

UML Patterns
Resources Penceresinde UML / Patterns GoF dizininde kullanıma hazır tasarım örüntüleri var. Örüntüye sağ tıklayıp "Add" seçeneği ile Class Diagrama eklemek mümkün.

UML Stereotype'ları
Enterprise Architect ile UML stereotype yaratmak istersek aşağıdaki adımları izleyebiliriz. UML stereotype'ları Resources penceresinde görünürler. Bu pencereyi açmak için View/Other Tools/Resources menüsü seçilmelidir.

1. Yeni bir paket açmak
Yeni bir paket aç ve paket "stereotype" tipi olarak combobox'tan "profile" seç. Paketi yaratmanın daha kolay bir yolu ise ToolBox'tan Profile Araçları altındaki "Profile" simgesini bir diyagram üzerine süreklemek ve bırak. EA otomatik olarak yeni bir paket yaratılması gerektiğini algılıyor.

2. Bir metaclass eklemek
Profile Araçları altındaki "Metaclass" simgesini bir diyagram üzerine süreklemek ve bırak. Metaclass'ı yaratırken EA element tipi seçmemizi istiyor. Element tipi olarak "Class" veya "Attribute" seçilebilir.


UML Note
"Note" kutusunu bir başka elemana bağlamak için "Note Link" kullanılır.

EA ve Data Flow Diyagramı
UML'de data flow diyagramı bulunmuyor. Bunun yerine activity diyagramı kullanılıyor. Ancak EA data flow diyagramı çizilebiliyor. Data flow diyagramı sistemin bileşenleri arasında akan mesaj tiplerini göstermek için çok güzel bir araç. Ayrıca sistemin dış aktörlerle etkileşimini gösteren System Context Diagram çizmek içinde de kullanılabilir.


UML Notlarım
UML'de kullanılan bazı kelimelerin Türkçeleri aşağıda. Bir kısmını buradan aldım.

Aggregation : İçerme. (İçerme olduğu için parçalar birbirlerinden ayrılabilirler)
Composition : Oluşum, Bileşim (Bileşim olduğu için birbirinden ayrılamaz parçaları kasteder)
Association : Bağıntı
Generelization : Genelleme

Class Diagram
UML bir sınıfın property ve operation'ları yerine feature kelimesini kullanıyor.

Association
İki sınıf arasındaki bağıntı ilişkisi. Düz çizgi ile gösterilir. Bağıntının adı ve çokluğu (multiplicity) olabilir. İki sınıf birbirini kullanırsa bu ilişki ile gösterilir.

Parça Bütün İlişkileri
Composition ve Aggregation ile gösterilir. İlişkinin bir ucu içi boş veya dolu elmas şeklindedir.

Realization
Bir arayüzün gerçekleştirilmesi. Kesikli çizgi ve ok ile gösterilir. Örnek:
Generalization
Sınıflar arası kalıtım. Düz çizgi ve ok ile gösterilir. Örnek:


UML Sequence Diyagramı
Bu diyagramlarda yapılan  ve bence faydası olmayan bir kullanım şekli var. O da metod çağrılarında kullanılan tüm parametrelerin diyagramda gösterilmesi. Sadece metod ismi bence yeterli olmalı. Aşağıdaki örnekte sadece metod isimlerinin kullanımı görülebilir.


UML 2.0'dan itibaren Bu diyagram türü için Interaction Frame eklenmiş. Bu eklenti döngü veya seçime bağlı (optional) işleri çerçeve içine alıp gruplamaya yarıyor.

Deployment View
Deployment Diagram
Deployment Diagram'da Node'lar kendi başına çalışan cihaz, bilgisayarları temsil eder. Node'ların içinde Package, bunların içinde ise Component'ler bulunabilir.

Model Driven Architecture ve Model Driven Development
Bunlar son zamanlarda öne çıkan kavramlar. Bir ara konuyla ilgili yazmak istiyorum.



Hiç yorum yok:

Yorum Gönder