14 Şubat 2016 Pazar

UML ile "Sequence" Diyagramları

Sequence" Diyagramları

Bu makalemizde UML’in en önemli diyagramlarından biri olan "Sequence" diyagramlarını inceleyeceğiz. "Sequence" kelime anlamı olarak "birbirini takip eden, ardışıl olan, peşi sıra" anlamlarına gelmektedir. UML diyagramı olarak ise nesnelerin peşi sıra etkileşimde bulunmalarını ve nesnelerin zaman boyutunda birbirleri ile ilişkiye girmeleri anlamında kullanılmaktadır. Bu yazı boyunca bu diyagramlardan kelime kargaşası yaratmama adına "Sequence" diyagramları şeklinde bahsedeceğim. Bir önceki UML makalesinde incelemiş olduğumuz Durum diyagramlarının aksine "sequence" diyagramları nesnelerin birbirleriyle haberleşmesini zaman boyutunda ele almaktadır. Dikkat ederseniz şu ana kadar incelemiş olduğumuz, nesne,durum ve use case diyagramlarında nesnelerin ilişkileri zamandan bağımsız olarak ele alınmıştı. İlk olarak zaman kavramını "sequence" diyagramlarında ele almış olacağız. 

Hatırlarsanız Durum Diyagramları yazısında nesnelerin ömürleri boyunca alabilecekleri durumları incelemiştik. Ancak nesnelerin birbirleri ile haberleşmesini ve durumlarını bu haberleşme mantığına göre değiştirebilmelerini incelememiştik. İşte bu yazıda göreceğimiz "sequence" diyagramları vasıtası ile nesnelerin birbirleri ile haberleşmesini zamana bağlı olarak ele alacağız. Bir diyagramın zaman bağlı olmasından kastımız, nesnelerin gerçekleştirdikleri aktivitelerin peşisıra gerçekleşmesi ve bu peşisıralığın belirlenen zaman dilimleri içerisinde maydana gelmesidir. İlerleyen kısımlarda daha detaylı olarak inceleyeceğimiz için isterseniz bir "sequence" diyagramında olabilecek nesneleri tek tek ele alalım :

Bir "sequence" diyagramı temel olarak nesnelerden(objects), mesajlardan (messages) ve zaman eksenlerinden(timeline) oluşmaktadır. Aşağıda bu üç UML bileşenide ayrıntılı bir şekilde açıklanmıştır. 

Nesneler (Objects)

Nesneler diğer UML diyagramlarında da belirttiğimiz gibi belirli görevleri gerçekleştirmek için tanımlanan yapı bloklarıdır. Nesneler, tasarım ve modellemenin en küçük yapı taşı olduğu için hemen hemen her tür diyagramda nesneleri görmekteyiz. "sequence" diyagramında nesneler aşağıdaki şekilde görüleceği üzere diktörtgen ve bu diktörtgen içinde nesne ismi olacak şekilde temsil edilir. Önemli noktalardan birisi ise nesne isminin :NesneIsmiformatında olmasıdır. "sequence" diyagramlarında nesneler genellikle diyagramın fiziksel olarak en üstünden ve soldan sağa olacak biçimde sıralanır. Yani nesnelerin "sequence" diyagramlarındaki orjini sol üst köşedir. Ve yayılım biçimi soldan sağadır. Bu bir kural olmamakla beraber kullanılan en yaygın biçimi bu şekildedir. Bizde bu yazının sonunda vereceğimiz örnektte bu şekilde kullanacağız. 


Şekil 1 : Nesne

Her bir nesnenin altından çıkan ve kesik kesik olan çizgi nesnenin zaman çizgisini(timeline) belirtmektedir. "Sequence" diyagramlarındaki zaman olgusu bu çizgilerle belirtilmektedir. Kesik çizginin en altı teorik olarak sonraki zamanı göstermektedir. Zaman çizgisi üzerinde bulunan ince ve uzun diktörgenler ise o nesnenin o zaman içerisinde meydana getirdiğiaktivitedir(activation). Yine teorik olarak diktörgenin uzunluğu aktivitenin ne kadar zaman aldığı ile doğru orantılıdır. Yani uzun süren bir aktivite daha uzun dikdörtgenle gösterilir. (Çoğu zaman bu kurala uyulmamaktadır.)

Mesajlar (Messages)

Mesajlar bir nesnenin zaman çizgisinden diğer bir nesnenin zaman çizgisine doğru çizilen simgelerden oluşmaktadır. Nesnelerin birbirleri ile haberleşmesi, birbirlerine komut göndermesi kalın çizilmiş oklarla gösterilmektedir. Bir nesne kendisine mesaj gönderebileceği (recursion - öz yineleme-) gibi başka nesneyede mesaj gönderebilir. Dahası nesne olmayan farklı bir UML bileşenide nesnelere mesaj gönderebilir. Örneğin use case diyagramlarında kullandığımız aktör bileşeni aşağıdaki gibi "sequence" diyagramındaki bir nesneye mesaj gönderebilir. 


Şekil 2 : Mesaj Örneği

"Sequence" diyagramlarında 3 çeşit mesaj tipi kullanılmaktadır. Aşağıda bu 3 mesaj tipi grafiksel gösterimleriyle birlikte açıklanmıştır.

Mesaj Tipleri : 

1 - Basit(Simple) Mesaj Tipi : Bu mesaj tipi basit anlamda bir nesnenin, akış kontrolünü diğer bir nesneye verdiği durumlarda kullanılır. Sık kullanılan bir mesaj tipi değildir. Gösterimi aşağıdaki gibidir :


Şekil 3 : Basit Mesaj

2 - Senkron (Synchronous) Mesaj Tipi : Bir nesnenin mesajı gönderdikten sonra, zaman çizgisinde devam edebilmesi için karşı nesneden cevap beklenmesi gereken durumlarda kullanılır. Varsayılan mesaj tipi olduğundan sıklıkla bu mesaj tipi kullanılmaktadır. Gösterimi UML diyagramlarında aşağıdaki gibidir.


Şekil 4 : Senkron Mesaj

3 - Asenkron (Asynchronous) Mesaj Tipi : Senkron mesajların aksine bir nesnenin mesajı gönderdikten sonra, zaman çizgisinde devam edebilmesi için karşı nesneden cevap beklenmesi gerekmiyorsa kullanılır. Sıklıkla asenkron işlemesi gereken komut zincirlerinde kullanılmaktadır.


Şekil 5 : Asenkron Mesaj

Zaman (Time)

"Sequence" diyagramlarının son ve en önemli bileşeni zaman olgusunun sembolize edildiği zaman çizgisidir. (time line) Daha önce de denildiği gibi zaman çizgisi nesneden dikey olarak aşağı doğru kesik bir çizgi şeklinde ilerler. Nesneye en yakın olan aktiviteler daha erken gerçekleşir anlamındadır. Aşağıdaki örnekte iki nesnenin zaman çizgileri aynı diyagram üzerinde gösterilmiş ve farklı zamanlarda gerçekleşen aktivitelere örnek verilmiştir. 


Şekil 6 : Basit bir "sequence" Diyagramı

Yukarıdaki basit diyagramda senkron mesajlar 1-2-3-4 sırasında gerçekleşmektedir. Her mesaj gönderiminden sonra dikkat ederseniz aktivite kutuları çizilmiştir. Ayrıca 3. mesajda ise öz yinelemeli (recursion - kendi kendine mesaj) mesajlara örnek verilmiştir.

Gerçek "Sequence" Diyagramları Nasıl Çizilir ? 

Gerçek projelerde "sequence" diyagramlarını çıkarmak sanıldığı kadar zor bir işlem değildir. Yeterki karşılaştığımız sorunun ve tasarım probleminin farkında olalım. Proje modülleri için çıkaracağımız "sequence" diyagramları, bakış açımıza, proje ekibinin iletişim biçimine veya modülün herkes tarafından bilinirliğine göre değişebilmektedir. Söz gelimi akış biçimi kolayca anlaşabilecek sistemler de basit bir "sequence" diyagramı yeterli olabilecekken henüz yeni geliştirilen bir sistem için her ayrıntıyı "sequence" diyagramları üzerinde göstermek gerekebilecektir. "Sequence" diyagramları bu ayrım gözetilerek genellikle iki biçimde incelenmektedir : Instance (örnek) ve generic (genel) "sequence" diyagramları. Instance olarak adlandırılan diyagramlarda genellikle basit bir şema çizlir, ayrıntılar gözardı edilir ve "best case" denilen en iyi olasılıklar ele alınır. Örneğin bir ATM makinasının akışını modelleyen diyagramda sadece kullanıcı aktivitelerinin, paranın kullanıcıya verilmesinin ele alınmasıaynı zamanda hesapta paranın olmaması, ATM makinasında paranın olmaması gibi durumları ele alınmaması bu tarz diyagramlara örnek olabilir. Generic diyagramlarda ise model daha karışık ve her yönüyle ele alınır. Öyleki döngü ve koşul yapıları dahi "sequence" diyagramında gösterilir. Koşul ve döngü ifadeleri aynı nesne üzerinde farklı aktivite kutuları ile gösterilmektedir. Aşağıda her iki yaklaşımla çizilmiş iki "sequence" diyagramını bulabilirsiniz.

Instance "Sequence" Diyagramına Örnek : 

Üç nesneli bir ATM makinasının çalışmasını modelleyen "sequence" diyagramını örnek verelim. Sistemimizde ilgilendiğimiz üç nesne bulunmaktadır. 

Tuş Takımı ve Para Alma Modülü: Kullanıcnın ATM makinası ile haberleştiği arayüzler (Nesne 1)
Hesap Kontrol Modülü : Kullanıcı doğrulama ve bakiye kontrol gibi mantıkların işletildiği birim (Nesne 2)
Para İletme Bölümü : Kullanıcının yani talebinin arayüz yani Nesne1 yardımıyla kullanıcıya sunulması. (Nesne 3)

Diyagramımızı çizmeden önce iş kurallarımızı maddeler halinde yazalım : 

1 - Kullanıcı şifresini yazar.
2 - Ardından çekmek istediği tutarı nesne 1 yardımıyla yazar. (tuş takımı)
3 - Çekmek istenilen tutar nesne 2 tarafından kontrol edilir.
4 - Eğer bakiye uygun ise Nesne 3 e mesaj gönderilerek bu modüle para aktarımı sağlanır. Not : Bu örnekte bakiyenin uygun olacağı varsayılacaktır. (yukarıda anlatılan best case durumu)
5 - Nesne 3, Nesne 1 i yani arayüzü uyararak paranın alınması sağlanır. 

Örneğe ilişkin "sequence" diyagramı ise aşağıdaki gibi çizilebilir. Diakkat ederseniz sadece kullanıcının girdiği tutar’ın bakiyeden küçük olduğu "best case" dediğimiz en ideal durum modellenmiştir. Diğer durumlar bu modelde bulunmamaktadır.


Şekil 7 : Örneğe ilişkin instance "sequence" diyagramı 

Generic "Sequence" Diyagramına Örnek : 

Generic "sequence" diyagramında birden fazla senaryo aynı anda ele alınmaktadır. Söz gelimi aşağıdaki örnekte kullanıcının girdiği tutar bakiyeden büyük ise iki senaryo daha eklenmektedir. Bu durumda ya ödenebilen maksimum miktar ödenmekte yada işlem iptal edilmektedir. Bunun gibi bir çok senaryo diyagrama eklenebilir. Tabi eklenen her senaryo diyagramı iyice karıştıracaktır. Bu yüzden diyagramlarımızı oluştururken bütün senaryoları içerebilecek durumları çıkarmaya çalışma ile birlikte maksimum okunabirliği de gözönünde bulundurmak gerekir. Zira çıkaracağımız diyagramlar geliştiricilerin işini zorlaştırma yerine kolaylaştırmalıdır. Zaten temel amacımız da bu olmalı. 


Şekil 8 : Örneğe ilişkin generic "sequence" diyagramı 

Yukarıdaki örnekte dikkat ederseniz kolaylık olması açısından aynı nesne birden fazla zaman çizgisine sahip olabilmektedir. (Bkz : Nesne 1 zaman çizgisi)
Share: