Uml projenin başlangıç aşamasında , projenin gelişiminde ve projemiz bittikten sonra bize çok yardımcı olan grafiksel bir dildir ve retional yazılım şirketi tarafından geliştirilmiştir ve bu yazılım şirketi bugun yıllık 700 milyon $ kazancıyla dünyanın en zengin yazılım şirketleri arasındadır.
Uml bize evrensel olarak kabul görmüş standart bir modelleme tekniği sunar,Uml 1997 yılında Object Management Group tarafından standart hale getirilmiştir.Uml in içerisinde çok çeşitli diagram türleri var.Bunlardan bugun en populer olanları use-case ve class diagramlarıdır.
Şimdi düşünün ki içinde binlerce satırlık kodlar bulunan bir projeniz var ve bu projenizini gidişatını, neler yaptıgınızı takım arkadaşınıza veya herhangi birine anlatmak istiyorsunuz .Pek mümkün gözükmüyor değil mi ? biz her ne kadar uzun uzun anlatsakta karşımızdakinin bi anda bunları kavraması zor olacaktır hele hele o projeyi devralıp üzerine kod yazmaya başlayacaksa büyük zorluklar yaşanabilecektir.Ama uml bilen bir insana hazırlağınız dökümanı verdiğinizde diagram üzerinden herşeyi görmesi ve anlaması çok zor olmayacaktır çoğu zaman kendi kodlarımıza dönüp baktıgımızda bile ne yapmışım burda ben diye uzun uzun düşündüğümüzü hatırlarsak yazdıgımız kodu bize anlatması açısındanda çok faydalı olacaktır.Ayrıca projenin başında hazırlanıp çizildiği taktirde developer için bir yol haritası olacak ve projenin çok daha hızlı bir şekilde tamamlanmasını sağlayacaktır.
Bir projenin geliştirilme aşamalarını kabaca analiz => dizayn => kodlama => uygulama .... şeklinde sıralayabiliriz.Gördüğümüz gibi kodlama ilk sırada değil 3.sırada.Eğer kodlamayı ilk plana alırsanız projenizin bitiş tarihinin uzuyacagından ve büyük olasılıkla başarısızlıkla sonuçlanacağından emin olabilirsiniz.Peki başarı nedir ? emin olun ki bir projeyi tamamlamak ve kodlarının çalışıyor olması başarı değildir.Yazdığınız program ne kadar uzun ömürlu olacak , kodlarınız yeniden kullanılabilirliğe ne kadar açık ? İlerde programın içinde bir bug olduğu ortaya çıkarsa bu sorunu çözmek ne kadar zor veya kolay olacak ? Projeniz ne kadar esnek yani başka teknolojiler ile ne kadar uyumlu ? daha sayıyımmı : )
Yani ortaya çıkan sonuç şu ki , projenin başında analiz ve dizayn için ne kadar zaman harcarsanız o kadar zamandan ve maliyetten kazanırsınız.Aşağıdaki şekilden diagramların genel yapısını görebilirsiniz ;

bu kadar ön bilgi verdikten ve faydalarına değindikten sonra incelemeye başlayalım bakalım neymiş bu Uml'in içinde önemli bir yeri olan class diagramları..
Öncelikli olarak sınıfımızı yani tipimizi nasıl tanımlıycaz buna bakalım; Bakmadan önce ufak bi tavsiye olarak UML diagramları çizmek için Microsoft'un Visio ürününü kullanmanızı tavsiye ederim.Bunun dışında tasarladıgımız class'larin class diagramını bize gösteren , ve diagram üzerinde yaptıgımız değişiklikleri koda yansıtan bir yapı zaten visual studio ide sinin içinde bizim için hazır geliyor.Ayrıca projemize class diagram ekleyip projemizin iskeletini bu diagram üzerindede beliryebiliriz.Bununla uğraşmanızı ve kullanmanızı öneririm.Mesela daha önce yazdıgım bir class'a sağ tıklayıp view class diagram dediğimizde neyle karşılaştıgımıza bir bakalım ;

her bir tipin en tepesinde siyah koyu harflerle önce isimleri yazılmış.Soyut temel sınıfın italic bir biçimde yazılmış olması onun abstract bir sınıf olduğunu gösteriyor ve bu sınıftan aşağıya doğru çıkan 2 tane ok bu sınıfların soyutTemel sınıftan miras aldıklarını açıkça gösteriyor.Her sınıfın içinde field ve methodlar var.Soyut temel sınıfın içerisinde ki kimlik methodunun italic olarak yazılmış olmasından da bu methodun da abstract olarak tanımlanmış oldugunu yani kendisinden türeyen sınıflarda implement edilmesi gerektiğini anlıyoruz ki diğer sınıflara baktıgımızdada aynı isimde methodların olması bunu doğruluyor.Türeyen sınıflara baktıgımızda altlarında hemen ok işareti ile hangi sınıflardan türedikleri açıkca yazılmış.Hemen alttaki araç üzerindede methodların ve field ların access modifier larını görebiliyoruz, hangi tipte tanımlandıklarını geri dönüş değerlerini , varsa summary'lerini , method parametrelerini ve parametrelerin tiplerini herşei görebiliyoruz ve işin en eğlenceli tarafı buradan yaptıgımız her türlü değişiklik ve eklenti koda yansıyor.Ayrıca export diagram as image diyerek diagramı istediğimiz formatta (jpg,png vs.) alabiliyoruz.
tabiyki uml'i incelemeye bu noktada başlamıycağız ama visual studio nun bu güzel özelliğini görüp ufaktan ısınalım istedim :)
Uml'de tipleri tanımlarken yukarıdaki örnektede gördüğümüz gibi method ve field'larimizi (nitelik) belirtiyoruz.bir field belirtirken kullanmamız gereken notasyon aşağıdaki gibi ;
<visibility> <name> : <type> <multiplity> = <default>
burada visibilty dediğimiz şey tabiyiki public , private , protected gibi erişim belirleyicileri.uml de public + , private - , protected ise # işareti ile belirtilir. nitelikteki çoğulluk dizi olduğunu belirtir.varsayılan değer ise niteliğe verilen ilk değerdir.
niteliğin hemen altında methodlar tanımlanır.methodlar bildiğimiz gibi geriye değer dönmeyebilir ve aynı zamanda parametre almıyorsa olabilir,bunun yanında parametreli olabilir.bunları uml'de görmek hiç zor değildir.
Method()
Method(parametreli)
Method() : geri dönüş değeri
Gördüğümüz gibi geri dönüş değeri methodun yanına iki nokta konulup yazılıyor.Mesela şuanda visio ile çizdiğim insan tipine bakarsak ;

burada içeri yazan şey parametrenin yönü yani (in) varsayılan olanıda bu , bunun dışında out ve inout da olabiliyor.method notasyonu belirtirsekte ;
<visibility> <method name> ( <parameter list> ) : <return type>
yukarıdaki örnekte geri dönüş değeri yok, int olarak parametre tipi belirtilmiş.mesela methodumuz geriye int dönebilirdi.Koşmak methodu geriye int ne döndürebilir ki diyorsanız kalori olabilir mesela
- Koş ( in Hız : int ) : int
Şimdi ise uml de en sevdiğim kısımdan ilişkilerden (Assocation) bahsedelim biraz.Sınıflar birbirlerine nitelik ve method bazında referanslarda bulunabilirler ve birbirleriyle ilişkili olabilirler.Örneğin insan sınıfımız dışında bilgisayar diye bir sınıfımız olabilir bu sınıf insan sınıfının içinde birden fazla kullanılabilir ( bilgisayar sınıfından bir dizi yaratılarak) ;
Örneğin kodunuda yazarsak ;

peki bu durumu diagram üzerinde nasıl gösteririz ?

insan sınıfı birden fazla bilgisayarı içerebilir, burada bire çok bir ilişki var.çok kısmındaki kısım eğer belli ise mesela insan ve kol diye iki sınıf olsa idi , bir insanın 2 kolu olacağı için 1 e 2 ilişki olacaktı ve bir arabada 4 adet lastik olması durumda 1'e 4 ilişki olabilmesi gibi.Veya kalp diye bir sınıfımız olsa idi , bir insanın sadece 1 tane kalbi olabileceği için buradada 1'e 1 ilişki söz konusu olacaktı.Hadi bu sınıflarıda diagrama dahil edelim..

aslına bakarsanız class lar arasındaki çok fazla ilişki olması iyi birşey değildir , bu tipler arasındaki bağımlılığın oluştugunu gösterir.
Class lar arasındaki ilişkilerde bazende 0 yada çok durumu vardır,örneğin gözlük diye bir class'ımız olsun,insan sınıfı hiç gözlük kullanmayabilir yada çok sayıda gözlükde kullanabilir diyebiliriz.

Şimdide inheritance (kalıtım) 'in class diagramı üzerinde nasıl gösterileceğinden bahsedelim ;

şekildede gösterildiği gibi kalıtım işi boş üçgen işareti ile gösteriliyor.Hiyerarşik olarak sınıflar yukarıdan aşağı doğru sıralanıyor.Burada bildiğiniz gibi insan sınıfı bütün sınıfların ortak özellikleri içerisinde barındıran bir base class.
Şimdi sıra geldi interface'lere.interface tipler arasındaki bir sözleşmedir.interface i impelement eden class'lar interface de "sadece tanımlanmış" methodları ve field lari kullanmak zorundadır ve aşağıdaki şekildede gösterildiği gibi kesik çizgilerle ifade edilir ;

ve en son olarakta aggregation kavramından bahsetmek istiyorum.Bazen birden fazla sınıf bir araya gelir ve başka bir sınıfı oluşturur.Mesela bilgisayar diye bir sınıfımız oldugunu düşünelim ve bunun yanında ram , ekran kartı , işlemci sınıflarınında bulundugunu düşünelim.burada bilgisayar sınıfı ile diğer 3 sınıf arasında çok sıkı bir ilişki vardır hatta bu 3 sınıf olmadan bilgisayar sınıfı olamaz bile diyebiliriz.Bu şekilde çok sıkı ilişkilerin oldugu durum "COMPOSITE ASSOCATION" terimi ile ifade edilir.

ama bunun dışında bilgisayarı tamamlayan kulaklık , mause gibi class'larda olabilir.Ancak burada kulaklık ve mause bilgisayardan ayrı olarak tasarlanabilir ve daha sonradan bilgisayara entegre edilebilir yani her parça anlamlıdır ama birleşince bir bütün oluştururlar işte böyle durumlara aggregation denir.Yukarıda çizilen şekilden tek farkı, uçtaki şeklin işinin siyah deyil beyaz olmasıdır.