java ile tasarım prensipleri ve tasarım örüntü · pdf file 1 java ile...

53
www.java-egitimleri.com 1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

Upload: lecong

Post on 21-Feb-2018

259 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 1

Java ile Tasarım Prensipleri ve

Tasarım Örüntüleri

Harezmi Bilişim Çözümleri

Page 2: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 2

İyi Tasarımın Amacı Nedir?

Page 3: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 3

Olası Değişiklikleri Kolay Bir Şekilde Ele Alabilmek...

Page 4: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 4

Peki Neler Değişir?

Page 5: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 5

“Gereksinimler”

Page 6: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 6

Gereksinimlerin Değişmesi● Gereksinimler tam değildir● Genellikle yanlış ve yanıltıcıdırlar● Sürekli değişirler, sistemle ilgili yeni

olasılıklar göz önüne gelir● Geliştiricilerin sistemi kavrayışı zaman

içerisinde gelişir● Yazılım sisteminin geliştirildiği ortam

sürekli değişir

Page 7: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 7

Sonuç: Gereksinimlerin değişmesinden şikayet etmek

anlamsızdır!

Page 8: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 8

Yapılması gereken: Değişiklikleri daha efektif biçimde

ele alabilen iyi bir tasarıma sahip olmalıyız!

Page 9: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 9

İyi Tasarımı Kötü Tasarımdan Nasıl Ayırt Edebiliriz?

Page 10: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 10

Kötü Tasarımın Belirtileri● 4 temel belirtisi vardır

– Rigidity (Esnemezlik)

– Fragility (Kırılganlık)

– Immobility (Taşınamamazlık)

– Viscosity (Akışkanlık)

● Bu belirtiler birbirleri ile bağlantılıdır ve kötü bir mimarinin işaretleridir

Page 11: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 11

Nesne Yönelimli Analiz ve Tasarım Nasıl Olmalı?

Page 12: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 12

Öncelikle probleme bakış açımızı değiştirmeliyiz!

Page 13: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 13

Geleneksel ve Modernist Yaklaşımlar

● Geleneksel yaklaşımda nesne = veri + metot

● Modernist yaklaşımda nesne – sorumlulukları olan

– belirli bir davranış sergileyen bir olgudur

● Modernist yaklaşım nesnenin içerisinde ne olduğu ile ilgilenmez

● Başka bir deyişle olgulara “ne yapmaları gerektiği” söylenmelidir, “nasıl yapmaları” değil

Page 14: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 14

Problemden çözüme nasıl gidilir?

Page 15: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 15

Ortaklık/Değişkenlik Analizi● Problem domain'i genelinde ortak şeyler

(commonality analiz) ve değişenler (variability analiz) tespit edilir

● Ortaklık analizi zaman içerisinde çok sık değişmeyecek kısımları arar

● Değişkenlik analizi ise sıklıkla değişecek yapıları arar

● Ortak kavramlar soyut sınıflarla ifade edilecektir

● Concrete sınıflar ise varyasyonlardır

Page 16: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 16

Ortaklık/Değişkenlik Analizi● Mimarisel perspektiften bakılırsa ortaklık

analizi mimariye uzun ömürlülük katar● Değişkenlik analizi ise kullanım kolaylığı

sağlar

Page 17: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 17

Altın Değerinde İki Tasarım Kuralı...

Page 18: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 18

Kural 1: Değişen ne ise bul ve encapsule et

Page 19: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 19

Kural 2: Composition'ı inheritance'a tercih et

Page 20: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 20

Geliştirme Sırasında İzlenecek İki Temel Tasarım Prensibi...

Page 21: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 21

Açıklık Kapalılık PrensibiOpen Closed Principle (OCP)

● Bir modül genişlemeye açık, değişikliğe kapalı olmalıdır

● Modülleri genişletilebilir (extend) biçimde yazmalıyız

● Modüller ileride değişiklik gerektirmemelidir

● Soyutlama OCP'de anahtar kelimedir

Page 22: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 22

Tersine Bağımlılık PrensibiDependency Inversion Principle (DIP)● Sadece arayüz veya soyut sınıflara

bağımlı olunmalıdır● Concrete sınıflara bağımlılık olmamalıdır● COM, CORBA, EJB gibi bileşen

teknolojilerinin dayandığı temel prensiptir● Tasarımdaki bütün bağımlılıklar soyut

olgulara doğru olmalıdır● Soyutlama noktaları tasarımın

genişletilebileceği noktaları oluşturur

Page 23: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 23

Örnek Problem: Simülasyon Programı Faz 1

Doğadaki canlılar hareket kabiliyetlerini sahip

oldukları bacakları vasıtası ile sağlamaktadır. Her

türün farklı sayıda bacakları olabilir. Canlılar karada

yürüyebilir, denizde yüzebilir, havada ise uçabilirler.

Farklı canlı türlerinin hareket şekillerini modelleyen

bir simülasyon programı yazılması istenmektedir.

Simülasyon programında farklı canlı türlerini temsil

etmek için kedi, kuş ve balık türleri kullanılabilir.

Page 24: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 24

Canlı Hiyerarşisi

Soyut metot

Soyut sınıf

Page 25: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 25

Canli.java

public abstract class Canli {

private int bacakSayisi;

public int getBacakSayisi() {return bacakSayisi;

}

public void setBacakSayisi(int bacakSayisi) {this.bacakSayisi = bacakSayisi;

}

public abstract void hareketEt();

}

Page 26: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 26

Yüzen Canlılar

public class YuzenCanli extends Canli {

@Overridepublic void hareketEt() {

System.out.println("yüzüyor...");}

}

public class Balik extends YuzenCanli {public Balik() {

setBacakSayisi(0);}

}

Page 27: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 27

Simülator ve Ortam

Page 28: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 28

Ortam Arayüzü ve Alt Sınıfları

public interface Ortam {

}

public class Deniz implements Ortam {

}

Page 29: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 29

Simulator.java

public class Simulator {private Ortam ortam;

public Ortam getOrtam() {return ortam;

}

public void setOrtam(Ortam ortam) {this.ortam = ortam;

}

public void hareketEttir(Canli...canlilar) {for(Canli c:canlilar) {

c.hareketEt();}

}}

Page 30: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 30

Main.java

public class Main {

public static void main(String[] args) {Simulator simulator = new Simulator();

simulator.hareketEttir(new Kedi(),new Kus(),new Balik());

}

}

yürüyor...uçuyor...yüzüyor...

Page 31: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 31

Örnek Problem: Simülasyon Programı Faz 2

Bazı canlılar her ortamda tek bir hareket şekline sahip

iken, diğer bazıları ise farklı ortamlarda farklı hareket

şekillerine sahip olabilirler. Örneğin, kuşlar karada

yürüme, havada ise uçma kabiliyetine sahiptirler. Farklı

bir balık türü ise denizde yüzebilirken, belirli süre deniz

yüzeyinin üzerinden havalanarak uçabilmektedir.

Simülasyon programı, canlı türün hareket şeklinin

ortama göre değişiklik göstermesini de

desteklemelidir.

Page 32: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 32

Uçan Balık

Page 33: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 33

UcanBalik.javapublic class UcanBalik extends Balik {

private boolean uc = false;

public boolean isUc() {return uc;

}

public void setUc(boolean uc) {this.uc = uc;

}

@Overridepublic void hareketEt() {

if(uc) {System.out.println("uçuyor");

} else {super.hareketEt();

}}

}

If-else ifadesi bir algoritmikVaryasyon işaretçisidir

Page 34: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 34

Simulator.javapublic class Simulator {

private Ortam ortam;

public Ortam getOrtam() {return ortam;

}

public void setOrtam(Ortam ortam) {this.ortam = ortam;

}

public void hareketEttir(Canli...canlilar) {for(Canli c:canlilar) {

if(ortam instanceof Hava && c instanceof UcanBalik) {

((UcanBalik)c).setUc(true);}c.hareketEt();

}}

}

OCP, DIPprensipleriihlal ediliyor

Page 35: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 35

Kural 1: Değişen ne ise bul ve encapsule et

...farklı ortamlarda farklı hareket

şekillerine sahip olabilirler. ...canlı türün hareket

şeklinin ortama göre değişiklik

göstermesini de desteklemelidir.

Page 36: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 36

Farklı Hareket Şekilleri

Page 37: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 37

Canli.java

public abstract class Canli {

...

private HareketSekli hareketSekli;

public void hareketEt() {hareketSekli.hareketEt();

}

public void setHareketSekli(HareketSekli hareketSekli) {

this.hareketSekli = hareketSekli;}

}

DavranışınEncapsuleEdilmesi

Page 38: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 38

HareketSekli.java

public interface HareketSekli {public void hareketEt();

}

public class Ucmak implements HareketSekli {

public void hareketEt()System.out.println("uçuyor...");

}

}

public class Yuzmek implements HareketSekli {

public void hareketEt() {System.out.println("yüzüyor...");

}

}

Page 39: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 39

UcanBalik.javapublic class YuzenCanli extends Canli {

public YuzenCanli() {setHareketSekli(new Yuzmek());

}}

public class UcanBalik extends Balik {...

@Overridepublic void hareketEt() {

if(uc) {new Ucmak().hareketEt();

} else {super.hareketEt();

}}

}

OCP ve DIP problemleriDevam ediyor!

Page 40: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 40

Hareketin Ortama Göre Değişmesi

Hareket şekliniOrtam belirliyor!

Page 41: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 41

Ortam.javapublic interface Ortam {

public HareketSekli getHareketSekli();}

public class Deniz implements Ortam {

public HareketSekli getHareketSekli() {return new Yuzmek();

}

}

Page 42: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 42

Canli.javapublic abstract class Canli {...

private HareketSekli hareketSekli;

public void hareketEt(Ortam ortam) {hareketSekli.hareketEt();

}}

public class UcanBalik extends Balik {

@Overridepublic void hareketEt(Ortam ortam) {

ortam.getHareketSekli().hareketEt();}

}

Hareket şeklini ortama göre değiştirme imkanı sağlanıyor

Page 43: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 43

Simulator.javapublic class Simulator {

private Ortam ortam;

public Ortam getOrtam() {return ortam;

}

public void setOrtam(Ortam ortam) {this.ortam = ortam;

}

public void hareketEttir(Canli...canlilar) {for(Canli c:canlilar) {

c.hareketEt(getOrtam());}

}} O anki ortam, hareketEt metoduna input argüman olarak veriliyor

Page 44: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 44

Main.javapublic class Main {

public static void main(String[] args) {Simulator simulator = new Simulator();

simulator.setOrtam(new Deniz());simulator.hareketEttir(new UcanBalik());

simulator.setOrtam(new Hava());simulator.hareketEttir(new UcanBalik());

}}

yüzüyor...uçuyor...

Page 45: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 45

Nesne Yönelimli Yazılım Geliştirmede Tasarım

Örüntülerinin Rolü Nedir?

Page 46: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 46

Tasarım Örüntülerinin Faydaları

● Tasarım ve nesne yönelimli modelleme işlemine üst perspektiften bakmayı sağlar

● Bu sayede daha ilk aşamada gereksiz detay ve ayrıntılar içinde boğulmanın önüne geçilebilir

● Bu örüntüler zaman içerisinde evrilmiş ve olgunlaşmış çözümlerdir

● Bu nedenle üzerlerinde değişiklik yapmak daha kolay ve hızlıdır

Page 47: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 47

Tasarım Örüntülerinin Faydaları

● Çözümlerin yeniden kullanılmasını sağlar

● Hazır çözümler probleme sıfırdan başlamayı, ve olası hatalara düşmeyi önler

● Diğerlerinin deneyimlerinden faydalanmayı sağlar

● Ekip içinde ortak bir terminoloji oluşmasını sağlar, ortak bir bakış açısı getirir

Page 48: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 48

Örnek Bir Örüntü:StrategyÖrnek Problem: Robot davranışları

Robot davranışları ile ilgili bir simülasyon

programı geliştirilecektir. Robotların davranışları

agresif, savunmacı ve sakin olarak

değişmektedir. Her bir davranış tipine göre robot

farklı farklı haraket etmektedir. Robotların

davranışları dinamik olarak değişebilmektedir.

Page 49: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 49

Örnek Bir Örüntü:Strategy

Page 50: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 50

Örnek Bir Örüntü:StrategyProblem

● Kullanılacak algoritma istemciye veya eldeki veriye göre değişiklik gösterebilir

● İstemcinin algoritmanın detayını bilmesine gerek yoktur

Çözüm● Algoritmanın seçimi ile

implementasyonu birbirinden ayrı tutulur

● Algoritma seçimi context'e göre dinamik yapılabilir

Page 51: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 51

Örnek Bir Örüntü:StrategySonuçları

● Switch ve şartlı ifadeler ortadan kaldırılır● Algoritma değişiklikleri için alt sınıf

oluşturmaya bir alternatiftir● Bütün algoritmalar aynı biçimde invoke

edilmelidir● Strategy ile context arasında etkileşim

gerekebilir

Page 52: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 52

Soru / Cevap...

Page 53: Java ile Tasarım Prensipleri ve Tasarım Örüntü · PDF file  1 Java ile Tasarım Prensipleri ve Tasarım Örüntüleri Harezmi Bilişim Çözümleri

www.java-egitimleri.com 53

İletişim

● Harezmi Bilişim Çözümleri Ltd.● Kurumsal Java Eğitimleri● http://www.harezmi.com.tr● http://www.java-egitimleri.com● [email protected]