Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

Bir sistemi tasarlarken direkt olarak sınıfları tasarlamaya geçmek içinden çıkılamayan bir karmaşıklığa yol açar. Zaten bir sistem yazılırken tüm sınıflar aynı yere yazılmaz. Bu sınıflar mantıksal olarak paketlere ayrılır ayrıca mantıksal parçalar birbirlerinden soyutlanarak yazılım sistemi tasarlanır. Bu amaca yönelik geliştirilmiş diyagramlardan biri de paket diyagramlarıdır. Bu diyagramlar ile mantıksal parçalar ve onların altındaki alt parçalar ile sistemin parçaları arasındaki etkileşim ortaya konmaya çalışılır.

Paket Diyagramları Nasıl Çizilir?
  • Her paket sol üst köşesinde küçük bir dikdörtgen olan bir dikdörtgen şeklinde çizilir.
  • Palet adları bu dikdörtgenler içerisine yazılır.
  • Paketler arasındaki bağımlılıklar kesikli ok ile bağımlı olan paketten bağlı olunun pakete doğru gösterilir.
  • Paketler mantıksal olarak daha üst paketler içerisinde yer alabilir.





Communication diyagramları, Sequence diyagramları gibi sistemin dinamik yapısını ortaya koymaya yarar. Sistemdeki nesnelerin arasındaki iletişimi ortaya koyar. Ancak Sequence diyagramlarından ayrıldığı temel nokta Communication diyagramlarında bir zaman çizelgesi olmamasıdır.

Communication Diyagramlar Nasıl Çizilir?
  • Çoğu UML diyagramında standart haline gelmiş olduğu gibi Communication diyagramlarda da nesneler dikdörtgen şeklinde çizilir.
  • Nesneler arasındaki iletişim yani yazılımsal anlamda metot çağırımları çağıran metottan çağırılan metoda doğru bir ok ile gösterilir. Bu ok üzerine metot bilgisi eklenir.
  • Bu diyagramda zaman çizelgesi olmadığından, dinamik yapıyı takip edebilmek için nesneler arasındaki iletişimlere numaralar verilir. Genel akıştan ayrılarak alt bir akış oluşuyorsa o zaman o akışın başladığı numara alt dallarına ayrılır. Örneğin 2 numaraları etkileşimde o nesne kendi içerisinde farklı işlemler yapacak ise bu işlemler 2.1, 2.2 gibi numaralandırılır.





Class diyagramlar sistemin statik yapısını ortaya koymaya yarar. Class diyagramlarda sınıflar ve nesneler arasındaki bağlantı ve sistemin yapısı ortaya konur. Sequence diyagramlarda ise sınıfların ve nesnelerin dinamik çalışma yapısı ortaya konmaya çalışılır. Sınıflar ve nesnelerin zaman çizelgesindeki etkileşimleri tasarlanır.

Sequence Diyagramlar Nasıl Çizilir?
  • Sınıf ve nesne gösterimleri class diyagramlarda olduğu gibi dikdörtgen şeklinde çizilir.
  • Sistemdeki her olay ayrı bir diyagram olarak çizilir ve bu olay içerisindeki kullanılan tüm sınıflar yatay bir düzlemde çizilir.
  • Zaman çizelgesi dikey olarak kesikli bir çizgi olarak çizilir.
  • Nesnelerin sistemde aktif olduğu yani kullanıldığı zamanları göstermek için ilgili sınıfın zaman çizgisi üzerine dikdörtgen çizilir.
  • Nesneler arasındaki etkileşim yani yazılım anlamında metot çağırımları, çağıran metottan çağırılan metoda doğru çizilen bir ok ile gösterilir.
  • Nesnelerin yaratılması veya yok edilmesi stereotype'lar ile gösterilir.
  • Metotların dönüş değerleri çağırılan metottan çağıran metoda doğru kesikli bir ok ile gösterilir. Bu gösterim opsiyoneldir. 
  • Sekron metot çağırımları içi dolu bir ok ile gösterilirken, asenkron metot çağırımları normal bir ok ile gösterilir.



Bu diyagramlar sistemin farklı zamanlardaki durumunu ortaya koymak için tasarlanırlar. Örneğin kullandığımız ATM'lerin sisteminin durumu bizim yaptığımız işlemlere değişir. Sürekli aynı durumda olmayan bir sistemdir ve sistemin bu durumlarını tasarlamak için durum diyagramları kullanılır.

Durum Diyagramları Nasıl Çizilir? (State Diagram Nasıl Çizilir?)
  • Sistemin başlangıç durumu içi dolu yuvarlak şeklinde çizilir.
  • Sistemin sonlanma durumu içi boş yuvarlağın içinde daha küçük içi dolu bir yuvarlak olacak şekilde çizilir.
  • Sistemin durumları kenarları yuvarlatılmış dikdörtgenler şeklinde çizilir.
  • Tetikleyici olaylar sistemin durumları arasına düz bir çizgi şeklinde çizilir. Bu olaylar ile sistemin durumu değişir. Olaylar ile ilgili açıklayıcı bilgi veya kodlamadaki metot karşılıkları çizgi üzerine yazılabilir.
  • Karar ifadeleri baklava şeklinde dikdörtgen olarak çizilir.




Nesne yönelimli programlamada nesnelerin bağımlılıkları olmaktadır. Bu bağımlılıklar birden fazla nedenden dolayı olabilir. Örneğin bir nesne diğer bir nesnenin bir metodunu kullanıyor olabilir. Metodunun kullanıldığı sınıfta bir değişiklik yapıldığında metodu kullanan sınıfta bu değişiklikten etkilenecektir. Bu gibi durumlarda dependency vardır denir. Bu ilişkinin olmasının nedeni değişebildiği için ilişkinin gösteriminde stereotype'lar kullanılır.
Dependency ilişkinin çiziminde iki sınıf arasına bir kesikli çizgi çekilir ve bağımlı olunan yapının olduğu tarafa bir ok çizilir. Çizginin ortasına ilişki nedenine uygun stereotype yazılır.





Nesne yönelimli programlamada kodlarda değişiklik yapılabilmesini kolaylaştıran, çoklu kalıtımı sağlayan ve bir çok faydası bulunan interface yapısı kullanılır. Interface yapısında oluşturulan interface'leri sınıflar implement ederler. Bu ilişki türüne Realization denir.
Interface ile class arasına kesikli bir çizgi çizilerek bu çizginin interface tarafına içi boş bir ok çizilir.



Nesne yönelimli programlamanın temel unsurlarından biri kalıtım(inheritance)'dır. Kalıtım yolu ile bir sınıfa ait özellikler bir başka sınıfa sadece küçük bir belirtim ile dahil edilir. Kalıtım yolu ile iki sınıf arasında kurulan ilişkiye Generalization denir.
Generalization ilişkinin çiziminde iki sınıf arasına bir düz çizgi çekilir ve kalıtım yapılan sınıfın olduğu tarafa içi boş bir ok çizilir.




Kodlama açısından Association ilişki ile aynı olan bu ilişki türü mantıksal olarak Association ilişkiden ayrılır. Bu ilişki türünde Association ilişkide olduğu gibi bir sınıf içerisinde başka bir sınıfın referansı tutulur. Ancak bu ilişkide referansı tutan sınıf ile referans edilen sınıf arasında bir parça bütün ilişkisi vardır. 
Bu iki ilişki türünde parçalar bütünü oluşturur. Yani referansı tutan sınıf bir bütündür ve referansı tuttuğu sınıflar onun parçalarını oluşturur. Aggregation ilişki ile Composition ilişki arasındaki fark ise Composition ilişkide parçalar oluşturdukları bütüne özeldir. Yani parça dahil olduğu bütünden ayrılıp bir başka bütüne dahil edilemez. Aggregation ilişkide ise parçalar bütünü oluşturur ancak o bütüne özel değildir bir başka bütün ile de kullanılabilir. Bir ilişkide parça bütün ilişki varsa ve Aggregation mı yoksa Composition ilişki mi kurulacak karar verilemiyorsa aşağıdaki üç soru sorularak cevap verilir.
  • Bütün nesne yok edildiğinde parça da yok ediliyorsa
  • Parça bir yere taşındığında bütün de onunla taşınması gerekiyorsa
  • Parça kolaylıkla başka bir bütüne dahil edilemiyorsa
bu ilişki Composition ilişkidir denir. Aksi halde Aggregation ilişkidir denir.

Aggregation ilişki çizimde bütünü oluşturan kısmın bulunduğu tarafa içi boş baklava şeklinde bir dikdörtgen çizilir.
Composition ilişki çizimde bütünü oluşturan kısmın bulunduğu tarafa içi dolu baklava şeklinde bir dikdörtgen çizilir.



Yukarıdaki örnekte Player sınıfı Organ sınıfının referansını tutar. Burada bir Composition ilişki vardır çünkü parça olmadan bütünün olması söz konusu değildir. Team sınıfı ise Player sınıfının referansını tutar. Burada bir Aggregation ilişki vardır çünkü oyuncu olmadan da bir takım var olabilir ve bir oyuncu kolaylıkla başka bir takıma dahil edilebilir.



Nesneler arasında var olabilecek en temel ilişki türüdür. Bir nesnenin içerisinde bir başka nesnenin referansını tutması ile oluşur. Örneğin;

public class Insan{

     private Araba araba;
}

public Class Araba{
    
}

Bu örnekte Insan adındaki sınıf içerisinde Araba adındaki sınıfın referansını tutmaktadır. Bu ilişki tek taraflı olmak zorunda değildir yani Insan sınıfı Araba sınıfının referansını tutarken Araba sınıfı da Insan sınıfının bir referansını tutabilir.

Navigability
UML diyaramlarda bu ilişki iki nesne veya sınıf arasında düz bir çizgi ve referansı tutan nesneden çıkan bir ok şeklinde belirtilir. İlişki iki yönlü ise ok ile belirtim yapılmaz.



Nitelikli Association 
Eğer iki nesne veya sınıf arasında çoka çok ilişki varsa veritabanlarında yapıldığı gibi araya ekstra bir yapı konulur. Nesneye yönelimli programlamada bu bir sınıf olur. 



Örneğin yukarıdaki örnekte müşteri birden fazla kitapçıdan alışveriş yapabilir ve bir kitapçının da birden fazla müşterisi olabilir. Bu durumda araya ekstra bir sınıf koyarak örneğin sipariş sınıfını koyarak bu ilişki tanımlanır.


Bu diyagramlar sistemin static yapısınız ortaya koymak amacıyla tasarlanırlar. Bu diyaramlar ile sınıflar, sınıfların yapısı ve arasındaki ilişki tasarlanır. Bu diyagramları çizerken standart haline gelmiş şekil ve semboller kullanılır.

Sınıf ve Nesne Diyagramları Nasıl Çizilir?
  • Sınıflar dikdörtgen şeklinde çizilir.
  • Sınıfların çizildiği dikdörtgenler dikey olarak 3 parçaya ayrılır. İlk parçaya sınıfın ismi yazılır. İkinci parçaya sınıfın özellikleri yani değişkenler yazılır. Üçüncü parçaya sınıfın yaptığı işlemler yani metotlar yazılır.
  • Yazılan özellikler için erişim belirleyici + özellik ismi + :özellik tipi şeklinde belirtim yapılır.
  • Yazılan metotlar için erişim belirleyici + metot ismi + (metot parametreleri) + dönüş tipi şeklinde belirtim yapılır.
  • Erişim belirleyiciler için semboller kullanılır. Bu semboller public için +, private için -, protected için # şeklindedir.
  • Nesneler tek parça dikdörtgen şeklinde çizilir ve içerisine nesne bilgisi yazılır.
  • Yazılacak nesne bilgisi nesne adı + sınıf adı şeklinde belirtilir.

İlişkiler
UML diyaramlarda iki nesne veya sınıf arasında bir ilişki belirtilirken, bu iki çizim arasına bir çizgi çizilir. Ayrıca daha sonra ilişki türüne göre bu çizgi üzerine eklemeler yapılır. İlişki türleri ilerleyen yazılarda anlatılacaktır. 
Nesne veya sınıflar arasında bir ilişki belirtirken bu ilişkiye bir isim verilir. Bu ilişkiyi açıklayan anlamlı bir isim verilmelidir. Bu ilişkiyi belirten düz çizginin tam ortasına yazılır.

Multiplicity

İlişkide bulunan nesnelerin sayısını belirtmek için kullanılır. Örneğin yukarıdaki örnekte Kitap sınıfı içerisinde bir üye barındırabilir veya hiç barındırmayabilir. Yani bir kitabı bir üye ödünç almış olabilir veya o kitabı hiç bir üye ödünç almamış olabilir. Bu örnekte bir kitabı birden fazla üyenin ödünç alamayacağı gösterilmiştir.





Abstraction yani soyutlama nesne yönelimli programlamanın ve yazılım mühendisliğinin en önemli konularından biridir. Soyutlama yapılmadan yazılmış bir kodda değişiklik yapmak çok zordur. Soyutlama ile bir sistemin karmaşıklığı o sistemi kullanan paydaşlardan gizlenir. Kod yazarken de soyutlama ile yazdığımız her parça kendi işini yapmalı ve karmaşıklığını kendi içinde çözmelidir. O parçayı kullanan diğer parçaların işin nasıl yapılmadığı ile ilgili bir bilgisi olmamalıdır. Örnek verecek olursak kullandığımız telefonlarda bir soyutlama yapılmıştır. Biz arama yaptığımızda veya mesaj gönderdiğimizde bunu telefonun nasıl yaptığını bilmeyiz. Telefonumuza bir güncelleme geldiğinde veya başka bir telefon kullandığımızda herhangi bir zorluk çekmeyiz çünkü sistemin tüm detaylı bizden soyutlanmıştır.


Use Case yani kullanım senaryosu diyagramları sistemin operasyonlarını ortaya koymaya yarar. Genellikle modellemenin ilk aşamasında oluşturulur. Bu yüzden sistemin detayını değil genel bir yapısını oluşturur. Bu modellemede detaylı bir dil kullanılmaz basitçe bir olayın nasıl olacağını anlatılır. Örneğin "müşteri bilgileri veritabanına kaydedilir" use case diyagramlarda bir aksiyondur. Burada bu bilgilerin nasıl kaydedileceği, hangi teknolojinin kullanılacağı gibi herhangi bir detayın önemi yoktur. Sadece operasyon ile ilgili genel bir bilgi verilir.
Use case diyagramlar çizilirken sistemin aktörleri ve operasyonlar belirlenir. Sistemin aktörleri sistem ile ilişkili olan ve sistemin dışında olan her şeydir. Örneğin sistemi kullanan müşteri veya sistem yöneticisi bir aktördür. Aynı zamanda sistem örneğin bir ödeme sistemine bağlıysa bu da bir aktördür. Operasyonlar ise aktörlerin sistem üzerinde gerçekleştirdikleri aktivitelerdir.

Use Case Diyagramlarının Çizimi
  • Aktörler basit bir çubuk adam şeklinde belirtilir.
  • Operasyonlar elips şeklinde belirtilir.
  • Aktörlerin hangi operasyonları yapabilecekleri, aktörler ile operasyonlar arasına düz bir çizgi çizilerek belirtilir. Buna association denir.
  • Elemanlar arasındaki bağımlılıklar kesikli çizgi ile gösterilir. Örneğin bir use case operasyonunun içerisinde bir başka use case operasyonunu kullanması durumunda bir bağımlılık oluşur.

Use Case Anlatımları
  • Varsayım : Anlatımı basitleştirmek için bir operasyon olmadan önce zaten rutin olarak yapılacak işlemlerin kısaca belirtildiği kısımdır. Örneğin müşterinin giriş yapıp yapmadığının kontrolü.
  • Ön Koşul : Operasyonun başlaması için gerekli şartların belirtildiği kısımdır. Örneğin para çekme işleminde limit dahilinde bir tutarın girilmesi gerektiği gibi.
  • Başlatma : Operasyonu başlatan eylemdir. Örneğin kullanıcının butona basması gibi.
  • İşlem : Sistem içerisinde yapılan işlemler. Örneğin girilen tutar, bakiyeden düşürülür. Daha sonra yeni bakiye veritabanına kaydedilir gibi.
  • Sonlanma : Belirtilen senaryoda başarılı veya başarısız durumların oluştuğu kısımdır. Bakiyenin yetersiz olması, veritabanına erişilememesi veya atm'den müşteriye paranın teslim edilmesi gibi durumlar senaryonun sonlanma koşulları olabilir.
  • Sonlanma Koşulu : Operasyonun başarılı tamamlanma koşuludur. Örneğin para çekme işlemi sonucunda yeni bakiyenin doğru bir şekilde hesaplanması gibi.
  • Alternatif Akışlar : Ana senaryo dışında oluşabilecek yan senaryoların belirtildiği kısımdır. Örneğin atm'de para kalmaması durumu veya veritabanından bakiyenin okunamaması durumu gibi.

UML diagramlarını çizmek için pek çok farlı araç mevcuttur. UML diagramı çizmek için geliştirilmiş araçlar olduğu gibi mevcut ide'ler üzerine geliştirilmiş plugin'ler de mevcuttur. UML diagramı için kullanabileceğiniz bazı araçlar;




UML (Unified Modelling Language) bir modelleme dilidir. İş sistemlerinin modellemesi için kullanılır. Yazılım alanında da sıklıkla kullanılmaktadır. 1990'lı yıllarda yazılım dillerinden bağımsız bir modelleme diline duyulan ihtiyaçtan dolayı geliştirilmiştir. İsminde bulunan birleştirilmiş sözcüğü, birden fazla geliştiricinin geliştirdiği modelleme dillerinin bir standart oluşturmak için birleştirilmesinden dolayı eklenmiştir. UML modelleme sistemlerine bir standart getirir.

UML Kullanmanın Faydaları
  • Proje başlangıcında modelleme bir zaman kaybı gibi görünsede ilerleyen süreçlerde çıkabilecek hataları azalttığı ve geliştirme süresini kısalttığı için proje süresinde ciddi bir iyileştirme sağlar.
  • Projedeki gereksinimlerin ve risklerin proje başlangıcında ortaya çıkmasını sağlayarak daha sonradan başarısız olacak bir projenin geliştirmesine başlamadan bu durumun görünmesini sağlar.
  • Projenin kalitesini arttırır.

UML Modelleri
UML modelleri üç ana kategoriye ayrılır.
  • Dinamik, Davranışsal Modelleme (Sistemin davranışını modelleme)
  • Statik, Yapısal Modelleme (Sistemin yapısını modelleme)
  • İşlevsel Modelleme (Sistemin aktörler ile birlikte nasıl etkileşim kuracağını modelleme)

Dinamik, Davranışsal Modelleme
  • Sequence (Etkileşim) Diyagramları
  • Communication (İletişim) Diyagramları
  • State (Durum) Diyagramları
  • Activity (Faaliyet) Diyagramları
  • Timing (Zamanlama) Diyagramları

Statik, Yapısal Modelleme
  • Class (Sınıf) Diyagramları
  • Object (Nesne) Diyagramları
  • Deployment (Dağıtım) Diyagramları
  • Composite Structure (Bileşke Yapı) Diyagramları
  • Component (Bileşen) Diyagramları

İşlevsel Modelleme
  • Use Case Diyagramları




Java'da bulunan iki koleksiyon yapısı olan Set ve List yapıları birbirine çok benzesede temelde birbirinden farklı amaçlar için kullanılır. 
List yapısı verileri bir liste olarak sıralı bir şekilde tutar. Bir liste şeklinde tutulan verilerin sırası vardır ve bu sıra numarası(index) ile verilere erişebiliriz. Listeye istediğimiz elemanı ekleyebiliriz.
Set yapısı ise matematikteki kümelerin özelliklerini taşır. Eklenen elemanları bir sıralama ile tutmaz yani bir index yapısı kurmaz. Matematikteki kümeler gibi Set yapısı içerisine aynı elemandan iki tane eklemeye izin vermez. Ayrıca set yapısında null değere sahip tek bir eleman olabilir.


Nesne yönelimli programlama teorisinde 4 temel özellik zorunludur. Bir dilin saf nesne yönelimli sayılabilmesi için bu 4 temel özelliği sağlaması gerekmektedir. Java, bu 4 temel özelliği sağlar ve saf nesne yönelimli bir programlama dilidir. Nesne yönelimli programlama teorisinin 4 temel özelliği;

  • Soyutlama(Abstraction)
  • Sarmalama(Encapsulation)
  • Miras Alma(Inheritance)
  • Çok Biçimlilik(Polymorphism)

Soyutlama (Abstraction)

Nesne yönelimli programlamanın en önemli özelliği sayılabilir. Soyutlama programlarımızdaki karmaşık yapıların, özelliklerin diğer parçalardan ayrılmasıdır denilebilir. Nesne yönelimli programlamada soyutlama sınıflar ile yapılır.

Sarmalama (Encapsulation)

Nesne yönelimli programlamada oluşturduğumuz sınıflarımızı yani gerçek dünyadaki nesneleri soyutlayarak bilgisayar dünyasına aktardığımız yapılarımızı diğer program parçalarından ayırırız. Çünkü her bir parçanın mekanizması ve karmaşıklığı sadece o parçaya aittir ve diğer parçaları ilgilendirmez. Ancak bu parçaların birbirleri ile iletişime geçmeleri gerekebilir. İşte bu durumu encapsulation ile sağlarız. Sınıflarımızın karmaşıklığını gizleyerek, aralarında haberleşmeleri için basit ve özel yöntemler tanımlarız.

Miras Alma (Inheritance)

Gerçek dünyada bulunan objeler birbirleri ile ilişkilidir. Bu objelerin ortak özellikleri vardır. Örneğin tüm canlıların veya tüm memelilerin ortak özellikleri vardır. Gerçek dünya objelerini bilgisayar dünyasına taşıdığımızda bu objeler arasındaki hiyerarşiyi kurmak ve ortak özellikleri tanımlamak için inheritance özeliğini kullanırız.

Çok Biçimlilik (Polymorphism)

Gerçek dünyada her obje aynı olay karşısında aynı davranışı sergilemez. Bilgisayar dünyasında da aynı sınıftan oluşturduğumuz nesnelerimizin aynı olay karşısında farklı davranmalarını sağlayabiliriz. Bunu polymorphism ile yaparız.


Bu yazımda Visual Studio Code ile nasıl Github kullanabileceğimizi anlatacağım. Github'a nasıl proje yükleyeceğimizi ve daha sonra değişikliklerimizi Github projemize nasıl gönderebileceğimizi anlatacağım.

1. Github hesabımız ile yeni bir repository oluşturuyoruz.


2. Oluşturduğumuz repository'nin linkini kopyalıyoruz.


3. Visual Studio Code'a gelerek View menüsü altındaki Command Palette seçeneğini seçiyoruz.


4. Açılan alana 'git clone' komutunu yazıp enter tuşuna basıyoruz.


5. Açılan alana kopyaladığımız repository linkini yapıştırıyoruz.


7. Projemizin kaydedileceği dizini seçiyoruz.


8. Açılan iletişim kutusunda Open Repository seçeneğini seçiyoruz.


7. Projemizin açıldığını görebilirsiniz. Bu kısma kadar Github'ta yeni oluşturduğumuz veya var olan bir projeyi nasıl Visual Studio Code'a entegre edebileceğimizi anlattım.


8. Şimdi de projemizde yaptığımız değişiklikleri nasıl Github'a gönderebileceğimizi anlatacağım. Projemize yeni bir dosya ekliyoruz.



9. Sol taraftaki menüden Source Control kısmını seçiyoruz. Değişiklik yaptığımızda değişikliklerimizin sayısının Source Control seçeneği üzerine geldiğini görebilirsiniz.


10. Message kısmına commit mesajımızı yazıyoruz ve Commit seçeneğine basıyoruz.


11. Projemizde birden fazla commit yapabiliriz. Daha sonra yaptığımız tüm commit'leri Github repository'mize göndermek için More Actions menüsünden Push seçeneğini seçiyoruz.


12. Açılan alana Github kullanıcı adı bilgimizi yazıyoruz.


13. Github parolamızı yazıyoruz.


14. Github'a değişikliklerimizin yüklendiğini görebilirsiniz.