Java - Yapılandırıcılar ( Constructors )

Pazar, Mart 08, 2015 kustemura 0 Yorum


Java - Methodlar adlı yazımın devamı olarak bu yazı da Yapılandırıcılar(Constractor)'ı anlatacağım.


class Rectangle{
 double width;
 double height;
 double depth;
 double volume {
  return width * height * depth ;
 }
 void setValues(double w , double h , double d){
  width = w;
  height = h;
  depth = d;
 }
}


Burada kullandığımız setValues() methodu uygun ve kullanışlı gözükse de , bu işlemleri nesne ilk oluşturulduğunda yapmak daha özlü ve kullanışlı bir hale getirecektir.Java'da Yapılandırıcılar nesne oluşturulduktan hemen sonra onu ilk kullanıma hazır hale getirirler.
setValues() methodunu bir yapılandırıcı ile değiştirelim.

Parametresiz Yapılandırıcı

class Rectangle{
 double width;
 double height;
 double depth;
 double volume {
  return width * height * depth ;
 }

 Rectangle(){
  width = 15;
  height = 15;
  depth = 15;

 }
}
Sınıf ile aynı isme sahip bir method olduğunu görüyoruz . İşte bu bir yapılandırıcı oluyor. Yapılandırıcılar her zaman bulunduğu sınıf ile aynı isme sahip olmak zorundadır.Aksi takdirde bu bir yapılandırıcı özelliği taşımaz. Burada ki Rectangle() yapılandırıcısının yaptığı iş , oluşturulan nesnelere ilk değer ataması yapmak.Oluşturulan nesnelere varsayılan değer olarak değişkenlerine 15 değeri atanıyor.

Parametreli Yapılandırıcı


class Rectangle{
 double width;
 double height;
 double depth;

 double volume(){
  return width * height * depth;
 }
 Rectangle (double w , double h , double d){
  width = w;
  height = h;
  depth = d;
 }
}

class mainClass{
 public static void main(string args[]){
  Rectangle myRectangle = new Rectangle(5,3,2);
  Rectangle myRectangle2 = new Rectangle(7,5,4);
  System.out.println("Dikdörtgenin Hacmi  myRectangle2 için :  "+myRectangle2.volume());
  System.out.println("Dikdörtgenin Hacmi  myRectangle için : "+myRectangle.volume());

 }
}
Programın Çıktısı :
Dikdörtgenin Hacmi myRectangle2 için : 140
Dikdörtgenin Hacmi myRectangle için  : 30

Ayrı bir setValues() gibi değer atamasını yapacağımız methodlara gerek kalmadan yapılandırıcı ile kodumuzu daha kısa bir halde getirdik.


0 yorum :

Java - Methodlar

Cumartesi, Mart 07, 2015 kustemura 0 Yorum


Bu yazımda bir önceki yazımda kullandığım yapıların devamı olarak Methodlar'ı anlatacağım.
" Java - Sınıflar " konulu yazıma bu adresten ulaşabilirsiniz.
Methodlar ;
  1 - Geriye değer döndürmeyen methodlar
    1.1 - Parametresiz geriye değer döndürmeyen methodlar
    1.2 - Parametreli geriye değer döndürmeyen methodlar
  2 - Geriye değer döndüren methodlar
    2.1 - Parametresiz geriye değer döndüren methodlar
    2.2 - Parametreli geriye değer döndüren methodlar
  olmak üzere ikiye ayrılırlar.

1-Geriye Değer Döndürmeyen Methodlar 
Daha önce tanımladığımız result değişkenine atadığımız değişkenleri başka işlemlerde kullanmak için tekrar toplama işlemini oluşturmamız gerekicektir.Bu işlemi mainClass sınıfının yerine Rectangle sınıfının yapması daha iyi olucaktır.
class Rectangle{
 double width;
 double height;
 double depth;
void volume (){
  System.out.println("Dikdörtgenin Hacmi  : "+(width * height * depth);
 }
}
Oluşturduğumuz her nesne için bu methodu çağırabiliriz.Böylelikle daha sade bir kullanım oluştu.
class mainClass {
 public static void main(String args[]) {
  Rectangle myRectangle = new Rectangle ();
  Rectangle myRectangle2 = new Rectangle ();
  double result;
  myRectangle.width = 5;
  myRectangle.height = 3;
  myRectangle.depth = 2;
  myRectangle2.width = 7;
  myRectangle2.height = 5;
  myRectangle2.depth = 4;
  myRectangle2.volume();
  myRectangle.volume();
 }
} 
Programın Çıktısı :
Dikdörtgenin Hacmi  için : 140 //myRectangle2
Dikdörtgenin Hacmi  için  : 30 //myRectangle

Bu şekilde programı çalıştırdığımızda bir önceki programda olduğu gibi sonucun aynı olduğunu görüyoruz.Böylelikle yapılan tekrarlardan kurtulup daha sade bir kullanım elde ettik.

Ama bu şekilde kullanımda yeterli değildir.Daha dinamik bir hale getirmek için geriye değer döndüren method şekilde kullanmamız gereklidir.

2 - Geriye Değer Döndüren Methodlar

Bir önceki programda çağırdımız volume methodunda sonucu ekrana yazdıran bir işlem yapıyorduk , bunu her zaman kullanmak mecburiyetinde değiliz.İstenildiği zaman programın çıktısı alınabilir.Bunun dışında diğer işlemler için kullanılmalıdır.Programı tekrar oluşturalım.

class Rectangle{
 double width;
 double height
 double depth;

 double volume (){
  return width * height * depth ;
 }
}

Burada volume methodunun önüne kullandığımız double ifadesi methodun geriye döndereceği değerin veri tipini belirtir.Eğer geriye bir boolean veri tipine sahip bir değer döndürmek istiyorsanız bu methodun tipini int olarak tanımlayamazsınız.Geriye değer döndüren methodlarda her zaman return ifadesi kullanılmak zorundadır.Aksi takdirde program derlenme esnasında hata vericektir.

class mainClass {
 public static void main(String args[]) {
  Rectangle myRectangle = new Rectangle ();
  Rectangle myRectangle2 = new Rectangle ();
  double result;
  myRectangle.width = 5;
  myRectangle.height = 3;
  myRectangle.depth = 2;
  myRectangle2.width = 7;
  myRectangle2.height = 5;
  myRectangle2.depth = 4;

  System.out.println("Dikdörtgenin Hacmi  myRectangle2 için :  "+myRectangle2.volume());
  System.out.println("Dikdörtgenin Hacmi  myRectangle için : "+myRectangle.volume());
 }
} 
Programın Çıktısı :
Dikdörtgenin Hacmi myRectangle2 için : 140 
Dikdörtgenin Hacmi myRectangle için  : 30

Bu programı çalıştırdığımızda ise çıktının yine aynı olduğunu görürüz.Eğer referans eden değişkenlere bir işlem yaptırmak istiyorsak bunu o sınıf içerisinde oluşturup gerekli işlem için çağrılmaya hazır hale getirmeliyiz.Yapı dinamik olursa eğer birçok işlemde kullanılabilir hale gelir.

Parametreli Methodlar

Yukarıda ki programlar parametresiz methodların kullanımını belirtiyordu.
Eğer kodu daha dinamik bir hale getirmek istiyorsak değişkenlere sadece sınıfın methodu içerisinde değer vermeliyiz.Bu durum hem güvenlik açısından hemde kodun sadeliği açısından oldukça önemlidir.Daha sonra bu konuya Sarmalama(Encapsulation) yazısında  ayrıntılı olarak değineceğiz.


class Rectangle{
 double width;
 double height;
 double depth;

 double setValues(double w , double h , double d){
  width = w;
  height = h;
  depth = d;
 }

 double volume (){
  return width * height * depth ;
 }
}

Kodumuzu bu şekilde düzenlediğimizde artık her nesne değişkeni için tek tek atama yapmak yerine aynı işlemi bir methodda topladık.
class mainClass {
 public static void main(String args[]) {
  Rectangle myRectangle = new Rectangle ();
  Rectangle myRectangle2 = new Rectangle ();
  myRectangle.setValues(5,3,2);
  myRectangle2.setValues(7,5,4);
  System.out.println("Dikdörtgenin Hacmi  myRectangle2 için :  "+myRectangle2.volume());
  System.out.println("Dikdörtgenin Hacmi  myRectangle için : "+myRectangle.volume());
 }
}
Programın Çıktısı :
Dikdörtgenin Hacmi myRectangle2 için : 140
Dikdörtgenin Hacmi myRectangle için  : 30
Bu programın çıktısı yine aynı şekildedir , fakat daha dinamik ve kullanışlı bir hale dönüşmüştür.

0 yorum :

Java - Sınıflar

Cumartesi, Mart 07, 2015 kustemura 0 Yorum


Basit bir sınıf oluşturalım.


class Rectangle{
 double width;
 double height;
 double depth;
}
Rectangle adlı sınıfımız , 3 değişken tanımlıyor: width,height ve depth olarak.Şu anda bu sınıf method içermiyor.
class mainClass{
 public static void main(String args[]){
  Rectangle myRectangle = new Rectangle ();
  double result;
  Rectangle.width = 5;
  Rectangle.height = 3;
  Rectangle.depth = 2;
  result = Rectangle.width * Rectangle.height * Rectangle.depth ;
  System.out.println("Dikdörtgenin Hacmi myRectangle için : " + result);
 }
}
 Programın Çıktısı : 
Dikdörtgenin Hacmi : 30 
Bu program çalıştırıldığı zaman 2 adet sınıf oluşturulur , ilki Rectangle sınıfı diğeri ise mainClass sınıfıdır.Burada oluşturduğumuz myRectangle ise bir local değişkendir ve oluşturulduğu sınıfın tipini referans etmektedir.Eğer bir sınıf içerisindeki verilere(değişken) ve davranışlara(method) erişmek istiyorsak o sınıfı referans eden değişkenleri oluşturmak zorundayız.Eğer bu programı çalıştırmak istiyorsak mainClass sınıfını çalıştırmak zorundayız.Burada yaptığımız işlem oluşturduğumuz bir dikdörtgenin hacmini hesaplamak.
class mainClass{
 public static void main(String args[]){
  Rectangle myRectangle = new Rectangle ();
  Rectangle myRectangle2 = new Rectangle ();
  double result;
  myRectangle.width = 5;
  myRectangle.height = 3;
  myRectangle.depth = 2;
  myRectangle2.width = 7;
  myRectangle2.height = 5;
  myRectangle2.depth = 4;

  result = myRectangle.width * myRectangle.height * myRectangle.depth;
  System.out.println("(myRectangle için)  \n Dikdörtgenin Hacmi : " + result);
  result = myRectangle2.width * myRectangle2.height * myRectangle2.depth;
  System.out.println("(myRectangle2 için) \n Dikdörtgenin Hacmi : " + result);

 }
} 
Programın Çıktısı :
(myRectangle için) 
Dikdörtgenin Hacmi : 140
(myRectangle2 için) 
Dikdörtgenin Hacmi : 30 
Bir nesnenin değişkenine herhangi bir değişiklik yaparsak bundan diğer nesnelerin değişkenleri etkilenmez.Örneğin yukarıdaki programda bir önceki program gibi myRectangle işleminin sonucu yine 30'dur.Çıktıdan anlaşıldığı gibi iki nesneninde verileri birbirinden farklıdır.

0 yorum :

Trigger (Tetikleyici) Nedir ? Nasıl Kullanılır ?

Çarşamba, Mart 04, 2015 kustemura 0 Yorum

Bu yazımda TRIGGER'ları MYSQL kullanarak inceleyeceğiz.
INSERT , UPDATE , DELETE işlemlerinin gerçekleşmesi halinde devreye girebilen STORED PROCEDURE(SAKLI YORDAM) yapısıdır.Hassas verilerin değişiminin veritabanında kayıtlarını tutmayı , gerek eski haline getirmek ,gerek ise oluşan durumlara göre belirlediğimiz işlemleri yapabilmemizi sağlar.

TRIGGER çalışmaya başlamadan önce bir TRANSACTION açılır.TRANSACTION konusuna burada detaylı olarak girmiyorum.Fakat temel bir şekilde kullanımı şu şekilde gerçekleşiyor.Eğer TRIGGER bloğunda bir ROLLBACK  var ifadesi çalıştırılırsa oluşan durumlarda son işlem geçersiz olur ve yapılan işlemler eski haline dönderilir , eğer yok ise otomatik olarak COMMIT yapılır ve işlem gerçekleştirilir.Bunu şöyle örnekleyelim ; örneğin bir ATM'den birisine para transferi yapıyorsunuz,para hesabınızdan düştü fakat gönderdiğiniz kişinin hesabına para ulaşmadı.İşte bu durumlarda TRANSACTION devreye giriyor ve yaptığı kontrol ile parayı sizin hesabınıza tekrar yatırıyor.


  • INSERT işleminde sadece NEW kullanılır.
  • UPDATE işleminde hem NEW hem de OLD kullanılır.
  • DELETE işleminde ise sadece OLD kullanılır.

Syntax'ı (Yazım Kuralı):


CREATE [ DEFINER={ < kullanici adı >} | CURRENT_USER} ] TRIGGER < trigger adı >
{ BEFORE | AFTER }
{ UPDATE | INSERT | DELETE }
ON < tablo ad >
FOR EACH ROW
BEGIN
..
…
END ; 
Örnek bir uygulama ile daha anlaşılır bir hale getirelim.
Yapılan INSERT ve DELETE işlemlerinde tetiklenecek birer TRIGGER oluşturalım. Bir futbol takımı için mülakat seçimi yapılsın ,  eğer ki jürinin verdiği puanlarla toplamda 85 puanın üzerinde olan kişileri futbol takımına aldığımızı varsayalım.Takım alınan her kişiye otomatik olarak 1-100 arasında takım numaraları verilmektedir.Daha sonra takımdan ayrılanları da belirtelim.


Öncelikle tablolarımızı oluşturuyoruz ;
CREATE TABLE mulakat_listesi (tcno INT NOT NULL,isim VARCHAR(20),soyisim VARCHAR(20),
mulakat_puani INT,PRIMARY(tcno));
Mülakat listesine katılan kişilerin tcno , isim , soyisim ve mülakattan aldıkları puan için mulakat_puani field alanlarını tanımladık.
CREATE TABLE futbol_takimi(takimno INT NOT NULL,ad VARCHAR (20),soyad VARCHAR(30),
tarih TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Futbol takımına seçilecek olan kişiler için futbol_takimi tablosunda her bir kişinin bir takimno , ad , soyad ve tarih field alanlarını tanımladık.
CREATE TABLE ayrilan (ayrilan_isim VARCHAR(20),ayrilan_soyisim VARCHAR(20),
giris_tarih VARCHAR(100),ayrilma_tarih TIMESTAMPS NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Takımdan ayrılanları tutacağımız ayrilan tablosunda ayrilan_isim , ayrilan_soyisim , giris_tarih ve ayrilma_tarih field alanlarını tanımladık.


Ardından TRIGGER'ımızı oluşturuyoruz.

DELIMITER $$

CREATE TRIGGER takima_girmek
 BEFORE INSERT ON mulakat_listesi
  FOR EACH ROW
   BEGIN
    IF(NEW.mulakat_puani>85) THEN
     INSERT INTO futbol_takimi (takimno,ad,soyad) VALUES  ((FLOOR(RAND()*100)),NEW.isim,NEW.soyisim);
    END IF;
   END;$$ 
Burada yapmış olduğumuz şey , eğer seçmelerde mülakat puanı 85'ten yüksek olan bir kişi var ise  bu kişinin bilgilerini alıp , 1 ile 100 arasında bir takım numarası verip , futbol takımı tablosuna eklemek.Bu TRIGGER'ı oluşturup çalıştırdığımızda sistem bizim yerimize TRIGGER koşulunu sağlayan durumda bu işlemleri gerçekleştirecektir.
DELIMITER $$


CREATE TRIGGER ayrilma_islemi
 AFTER DELETE ON futbol_takimi
  FOR EACH ROW
   BEGIN
    INSERT INTO ayrilan (ayrilan_isim,ayrilan_soyisim,giris_tarih)
    VALUES(OLD.ad,OLD.soyad,OLD.tarih);
   END;$$
Burada ise eğer takımdan ayrılan olursa bu kişinin adını , soyadını takıma giriş tarihini ve çıkış tarihini ayrılan tablosuna ekliyor.

0 yorum :