24 Haziran 2014 Salı

İlişkisel Veri Tabanı Yönetim Sistemi(RDBMS)




     Öncelikle veri tabanı yönetim sistemi nedir onu açıklayalım. Veri Tabanı Yönetim Sistemi (VTYS),
veri tabanlarının kurulmasında, tanımlanmasında ve işletilmesinde kullanılan yazılımların genel adıdır. 


     İlişkisel veri tabanı yönetim sistemine (Relational Database Management System kısaca RDBMS)  gelirsek; veri tabanımızı oluştururken aradaki ilişkiyi belirlememiz gerekir ve bunun için RDBMS kullanırız.  
RDBMS; verilerin tablolarda satır ve sütunlar hâlinde tutulduğu ve yüksek bir veri tutarlılığına sahip veri depolama sistemidir.  RDBMS ile veri tabanı içindeki nesnelerin birbiri ile olan ilişkilerini programlanabilir biçimde düzenleyerek saklar. Birbirleriyle ilişkisi demişken tıpkı OOP mantığında olduğu gibi eğer ilişkisi olan tablolardan birinde değişiklik yaparsak diğer tablonun da etkilenmesini RDBMS ile sağlayabiliriz. İlişkileri olan tablolar arasındaki veriler, çeşitli anahtarlar vasıtası ile birbirlerine bağlanırlar. İlgili tablolarda, sütunlar arasında bir anahtar sütun yer alır. Bu anahtar sütun aracılığı ile birden çok tablo verileri birbiriyle bağlantı sağlayabilir ve herhangi bir sorgulamada birlikte görüntülenebilir. Bu tür veri tabanları arasında PostgreSQL, MySQL, Oracle, dBase, Informix, Ingres, başta gelmektedir. 

RDBMS'nin genel faydaları şunladır;

• Verilerin doğru ve etkin biçimde saklanmasını sağlar.
• İlişkisel bütünlük kuralı (database integrity) sağlanır.
• Değişiklik kayıtları sayesinde, sistem çöktüğünde verileri kurtarmayı sağlar.

İlişkisel veri tabanlarında 3 tip ilişki vardır:
  • Bire Bir
  • Bire Çok
  • Çoka Çok
Birincil Anahtar (Primary Key): Tablolarda benzersiz kayıtlar elde etmemizi sağlayan sütuna verilen addır.
İkincil Anahtar (Foreign Key): Bir tabloda benzersiz kayıt oluşturmayı sağlayan sütunun diğer tabloda bir sütun olarak bulunmasına denir.
1- Bire Bir İlişki: İki tablo arasındaki ilişkiyi sağlayacak olan ortak alanların ikisi de birincil anahtar (primary key) ise birebir ilişki olur. Örneğin vatandaşlar ile T.C kimlik numaralarının olduğu bir veri tabanı gibi.

2- Bire Çok İlişki: İki tablo arasındaki ilişkiyi sağlayacak olan ortak alanlardan birisi birincil anahtar (primary key) diğeri yabancı anahtar (foreign key) ise bire çok ilişki olur.
Örneğin kişiler ve mal varlıklarının tutulduğu sistem veya bir öğrenci ve aldığı derslerin tutulduğu sistem.

3- Çoka Çok İlişki: İki tablo arasındaki ilişkinin bunların dışında ayrı bir tabloda tutulması ile oluşturulan ilişkidir. Bu ilişki tipi veri tabanında karmaşıklığa yol açar. Bu yüzden bunu önlemek için ilişkili olan iki tablo arasına bir tablo daha koyarak bire çok ilişki oluşturulup karmaşıklık önlenir.
Örneğin bir yazarın birden çok kitabı olması, bir kitabın birden fazla yazarı olması gibi.

Nesneye Yönelik Programlama(OOP) Mantığı



Nesneye yönelik programlama bilgisayar programlama yöntemidir ve işlerin kolaylaşıp harcanan sürenin kısalması için doğmuştur.
OOP mantığı doğmadan önce (prosedürel programlama dilleri vs.) programlar büyüdükçe ve karmaşıklaştıkça harcanan süreler ve emekler artıyor ve bu hem üretimi kısıtlıyor hem de maaliyeti arttırıyordu. Ayrıca kodun başkaları tarafından okunması ve düzenlenmesi çok zorlaşıyordu. Daha sonraları 1960'lı yıllarda Ole-Johan Dahl ve Kristen Nygaard ortaya OOP mantığıyla Oslo'daki Norveç Bilgi İşlem Merkezi'nde geliştirdikleri Simula I ve Simula 67 dillerini çıkardılar.

Bir dilin OOP olabilmesi için belli bazı özellikleri olması gerekir. Bunlar;

Encapsulation(Kapsülleme):
Bazı nesnelerin ve metodların diğerlerinden saklanabilmesi, erişiminin sınırlandırılabilmesidir.  Bir hocamın dediği üzere encapsulation'ı bir kapaklı bir kumandaya benzetebiliriz.  Kumandanın  normal ayar tuşları ortada (public) iken ileri seviye ayar tuşları kapağın altındadır(private). Böylece nesnelerin ve metodların ilgili kişiler tarafından kullanımı sağlanarak bilinçsiz kullanım önlenmiş olur.

Inheritance(Kalıtım): Bir sınıfın başka bir sınıftaki özellik ve metodlara sahip olmasına inheritance denir. Belli bir sınıf, daha genel bir kavramı ifade eden sınıfın üyelerine sahip olarak, onları tekrar tanımlamak zorunda kalmaz. Bir sınıfın üst sınıfın özelliklerini miras olarak alması için kullanılan anahtar kelime 'extends' dir.
  
Polymorphism(Çok Biçimlilik): Bir metodun birçok nesne tarafından kullanılabilmesidir. Bunun için overload özelliğinden faydalanılır.

17 Haziran 2014 Salı

ActionListener mı MouseListener mı?



Bazı şeyler için ikisi de aynı görevi yapıyor gibi görünen bu iki arayüzün farklarını ve ne zaman hangisini kullanmamız gerektiğini açıklamaya çalışacağım.

Öncelikle Java'da eventsler Low level events ve semantic events olarak ikiye ayrılır. Low level evenstler daha çok alt seviyelerde(işletim sistemi bazında) olan olaylardır. Kullanıcıdan gelen inputlar sonucu oluşur.  Geri kalan her şeye semantic events diyebiliriz ve bunlar ise itemEvent'lar sonucu oluşur.

Bunları öğrendikten sonra ActionListener ile MouseListener arayüzlerinin temel özelliklerine bakalım.

ActionListener arayüzü sadece semantic eventslere bakar. Buton tıklanması, klavye kısayolu olan tuşa basılması gibi. Yani bunların actionEvent e sahip olup olmamasıyla ilgilenir. Eğer bir butona tıklanırsa ActonEvent ateşlenir ve bunu ActionListener ile handle edebiliriz. Ayrıca ActionListener arayüzünü uygularken sadece tıklandığında/basıldığında  ne yapılacağı metodu yazılması yeterlidir. Çünkü spesifik bir şeyler yapmıyoruz, sadece actionEvent ateşlenince yapılacak şeyi yazıyoruz.

Diğer yönden MouseListener ise low level eventlere bakar. Farenin nereye tıklandığını(koordinatsal olarak) handle edebilir, rastgele tıklanmaları handle edebilir, ayrıca beş tane override edilmesi gereken metodu vardır. Bunlar mousePressed(), mouseClicked(), mouseExited(), mouseEntered(), mouseReleased()

Şimdi asıl soruna geçelim. Örneğin bir tane butonumuz var ve butonun tıklanıp tıklanmadığını kontrol etmek istiyoruz. Hangi arayüzü kullanmalıyız?
Aslında mantık basit. Mümkün olduğunca semantic eventleri(actionEvent gibi) tercih etmeliyiz ki böylece kodumuz güçlü ve taşınabilir olsun.  Eğer spesifik bir şeyler yapmak istiyorsak ise low eventleri kullanmalıyız(mouseEvent gibi).