Nesne Yönelimli Programlama Giriş
by admin on Ekim 7, 2010
Ne zamandır yazmak istediğim konuların başında geliyordu.Yazma amacım çok iyi bildiğimden değil sadece pekiştirmek, unutmamak ve hatırlamak.
Nesne yönelimli programlama 4 temel prensibe dayanıyor ve bu prensipler etrafında şekillenmiş tasarım desenlerini kapsıyor.Tasarım desenlerinin çıkış sebebi ise aslında problemlere dayanıyor.Yani karşılaşılaşılan bir problem tipi var buna bir çözüm uygulanması gerekiyor.Uygulanılan çözüm her seferinde o durumu çözüyor ise işte o bir tasarım deseni oluyor.
Peki tasarım desenleri neden ihtiyaç duyuyoruz.
Tasarım desenleri, test sağlayarak kanıtlanmış kalkınma paradigmaları geliştirme sürecini hızlandırır.Kodun okunabilirliğini arttırır.En önemlisi kod kontrol altında olur ve yazmış olduğunuz kod bug fixler ile yamalanmış bohça yerine düzenli büyüyen kod haline gelir.Bunu şehir planllaması gibi düşünebiliriz aslında, eğer tasarım kalıpları kullanılırsa buna düzenli kentleşme, kullanılmaz ise buna düzsensiz kentleşme diyebiliriz. Sisteminiz ne kadar çok büyür ise bir o kadar da içinden çıkılmaz hal alır (eğer tasarım kalıpları kullanılmaz ise).
Tasarım desenlerine tekrar döneceğim.Şimdi açıklamam gereken 4 prensip
1. Encapsulation (Kapsülleme) : Oluşturacağımız sınıfların özelliklerine erişimi kısıtlama ve gizlemeyi işaret eder.Şöyle ki ihtiyaca göre oluşturacağınız bir sınıf belirli değerlerini verdikten sonra işlemleri kendi içinde yapmasını ve dışarıdan bire müdahale görmemesini isteriz.Bunun için özelliklerimizi private yapıp bunları getter ve setter metodlar yardımı ile kullanmalıyız.Basit bir örnek
class Person {
private String name;
private String surnname;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setSurnname(String surnname) {
this.surnname = surnname;
}
public String getSurnname() {
return surnname;
}
public static void main(String[] args) {
Person person = new Person();
person.setName("Mustafa");
person.setSurnname("İleri");
System.out.println(person.getName());
System.out.println(person.getSurnname());
}
}
2. Abstraction (Soyutlama) : Soyutlama karmaşıklığı önlemek, nesnelerin birbirleri ile olan bağımlılığını yönetebilmek için kullanılır.Soyutlama ile miras aslında farklı şeylerdir.Soyutlamada kullanacağınız abstract class ve interface ile bir sınıfın bağımlı olduğu metodları belirleyebilirsiniz.
3.Inheritance (Miras): Nesneleri birbirlerinden türetmedir.Mesela her futbolvu bir sprocu ise futbolcu nesnesi sporcu dan türeyebilir. Miras alınan üst sınıf a parent alt sınıfa child der isek; üst sınıftaki bütün metodlar ve özellikler alt sınıfa gelir.Bir soyut sınıf değil ise üst sınıftaki metodları tekrar tanımlamak zorunda değilsiniz.Java PHP ve C# dillerinde çoklu miras alma yoktur.Yani siz bir A sınıfı hem B den hem C den miras alsın diyemezsiniz.
4.Polymorphism (Çok Biçimlilik): Nesneler birbirlerinden farklı olabilir fakat miras ilişkisine ikisi de aynı ana sınınftan türemiş ise o sınıflara hükmedebilirsiniz. Bunu şöyle örnekleyelim. Şimdi bir soyut sınıf oluşturacağım adı Insan olan, sonra buna bağlı olan Muhendis veOgrenci sınıfları oluşturacağım. Daha sonra buna bağlı olmayan bir Makine sınıfı oluşturacağım. Sonra bunları tip olarak insan isteyen bir metod a sokacağım sonuca bakalım.
Insan.java
public abstract class Insan {
abstract void nefesAl();
abstract void yasa();
}
Makine.java
public class Makine {
public void calis() {
}
}
Muhendis.java
public class Muhendis extends Insan {
@Override
void nefesAl() {
System.out.println("Muhendis nesef alıyor");
}
@Override
void yasa() {
System.out.println("Muhendis nesef yaşıyor.");
}
}
Ogrenci.java
public class Ogrenci extends Insan {
@Override
void nefesAl() {
System.out.println("Ogrenci nesef alıyor");
}
@Override
void yasa() {
System.out.println("Ogrenci nesef yaşıyor.");
}
}
Test.java
public class Test {
public static void main(String[] args) {
Test test = new Test();
Ogrenci ogrenci = new Ogrenci();
Muhendis muhendis = new Muhendis();
Makiine makine = new Makine();
test.nefesAl(ogrenci);
test.nefesAl(muhendis);
test.nefesAl(makine);
}
public void nefesAl(Insan insan) {
insan.nefesAl();
}
}
Şimdi Test.java dosyamızı çalıştırdığımızda nefesAl metoduna sadece Insan tipinde nesne verebiliyoruz.Buraya muhendis veya orgenci verebiliyorken makineyi veremedik.Basit olarak çok biçimliliği böyle anlatabilirim.
Tasarım desenleri uygulanma şekline göre şu şekilde kategorilendiriliyor.
1. Cretional Design Patterns (Yaratılışsal Tasarım Desenleri)
- Abstract Factory
- Builder
- Factory Method
- Object Pool
- Prototype
- Singleton
2. Structural Design Patterns (Yapısal Tasarım Desenleri)
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Private Class Data
- Proxy
3. Behavioral Design Patterns (Davranışsal Tasarım Desenleri)
- Chain of responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Null Object
- Observer
- State
- Strategy
- Template method
- Visitor
İlk yazımda bu kadar anlatabildim bundan sonraki hedefim tüm bu tasarım desenlerini örnek kodlarla anlatmak.
Leave your comment