Bölüm 4 - Objects and Classes
OOP (Object-Oriented Programming) Giriş
Bir object-oriented (nesne-tabanlı) program objects (nesnelerden) yapılır. Her nesne specific özelliklere sahiptir. Eskiden daha çok functional yani procedural (C'de ki gibi) programlama geliştiriliyordu örneğin bir tane web browseri olduğunu düşünün 2000 tane proceduru kullanıyor yani 2000 tane fonksiyon'u kullanması hakikaten normal bir şey değil ve gerçekten bunu yönetmek kolay da değil bunun yerine biz OOP-style'si yani OOP türünde bunu örneğin 20 tane methodu 100 tane class'a bırakırsak en azından bu bir programcı için classları yönetme yada bir yerde hata oldu mu nerede olduğunu çözebilmek için daha kolaydır.

Classes (Sınıflar)
Bir nesnenin neyden oluştuğunu gösterir. Class'ları kurabiye kalıbı (cookie cutters); objects (nesneleride) kurabiyelerin kendileri olarak düşünebilirsiniz.

Eğer ki biz bir class'tan nesne ürettiğimiz (construct) ettiğimizi söylersek; buna nesnenin bir örneğini oluşturduk deriz (instance of the class). Önceden de yazdığımız üzere bütün kodlarımızın hepsi Java classları üzerinde yazıldı ve Java'da binlerce class vardır bunları bizler tarih ve zaman, network programming gibi olaylar üzerinde kullanabiliriz. Ne olursa olsun, eğer ki biz kendi uygulamamızın ana problemini çözmek istersek yani uygulamamız neye hizmet edecekse ona göre class yazmak zorundayız.
Terim olarak Encapsulation terimi vardır bu bir anahtar konseptir nesnelerle çalışınca ama amacı veri ve davranışını (data and behavior) bir paket içerisinde birleştirip uygulamanın da ayrıntılarını kullanıcıdan gizlemektir. Biz object(nesnemizin) üzerindeki veri parçalarına instance fields ve bu veriler üzerinde işlemler yapan procedur'lere ise method ismi veriyoruz.
- Encapsulation'da ki ana amaç, methodların kendi class'ları dışındaki başka class'larda bulunan instance field'lara erişimin sağlanmamasını sağlamaktır. Programların hepsi sadece object'lerin methodları üzerinden object'lerin datalarına (instance fields) erişim sağlama yapmalıdır.
Class'lar başka classları extends edip, diğer classlardaki özellikleri kullanabilirler. Örneğin Java'da bizim "cosmic superclass" dediğimiz bir class vardır ismi Object'dir ve bütün class'lar bu Object'i extends eder.
Biz eğer ki Class'ımızı başka class'lar üzerinden extends edersek, yeni oluşan class her zaman extends edilen class'ın bütün properties ve methodlarına sahip olurlar. Bir class'ın diğer class'ı bu şekilde extends edip properties ve methodlarına sahip olması özelliğine inheritance diyoruz.
Objects
OOP ile çalışmak için objects'lerin karakteristik özelliklerini bilmek gerekir:
- Object's behavior : Bu object neler yapabilirsiniz veya ona hangi yöntemleri uygulayabilirsiniz?
- Object's state : Bu metotları çağırdığınızda object nasıl tepki veriyor?
- Object's identity : Aynı davranış ve duruma sahip olabilecek diğerlerinden object nasıl ayırt edilir?
Aynı class'ın instancesi olan tüm objectler aynı behavior destekleyerek bir aile benzerliğini paylaşırlar. Bir object'in behavioru, çağırabileceğiniz methodlar tarafından tanımlanır.
Her object o anda nasıl göründüğü hakkında bilgi depolar. Bu, object'in state'sidir. Bir object'in state'si zamanla değişebilir, ancak kendiliğinden değişmez.Bir object'in state'sindeki bir değişiklik, method çağrılarının bir sonucu olmalıdır.
Ancak, bir object state'si onu tam olarak tanımlamaz, çünkü her object'in kendine özgü bir identity'si vardır. Örneğin, bir sipariş işleme sisteminde, aynı öğeleri talep etseler bile 2 sipariş farklıdır. Bir sınıfın örnekleri (instances of a class) olan bireysel object identity her zaman farklı olduğunu ve genellikle state'lerinin de farklı olduğunu unutmayın.
Identifying Classes
Normal traditional procedural programlama (eski) main function ile yukarıda fonksiyonları tanımlamak zorundaydık, oop sisteminde "yukarı (top)" diye bir şey yoktur. Genelde bir class'ın görünümde ismi noun (isim) olur yani eylem belirtmezken, method'larda verbs (fiil) olurlar eylem belirtirler.
Yukarıda sipariş işleme sistemimiz vardı örneğin bunun için class isimlerini şöyle belirtebiliriz:
- Order
- Item
- Shipping address
- Payment
- Account
gibi
Fiil olarak methodları da belirtmek istersek mesela şöyle bir şey diyebiliriz , Item's siparişlere eklendi (burda bir fiil belirttik) yani add() methodu kullanabiliriz. Yada Siparişler shipped (kargolandı) yada cancelled (iptal edildi). ship() yada cancel() gibi methodlar belirtebiliriz.
Relationships between Classes
Class'lar arasındaki ilişkileri tanımlamak istersek yayın olarak kullanılanlar şunlardır:
- Dependence ("uses-a")
- Aggregation ("has-a")
- Inheritance ("is-a")
Dependence (bağımlılık) demek en çok görülen kullanım şekillerinden birisidir, örneğin bizim Order (Sipariş) classımız Account class'ını kullanıyor olsun çünkü Order objects Account nesnelerine ermesine ihtiyacı vardır ki hesabın mesela kredi durumuna erişebilsin. Ama Item classı'nın da Account class'ına ihtiyacı yoktur çünkü Item nesnelerinin bu müşteri hesaplarıyla ilgili bir şeye erişmesine ihtiyacı yoktur. Bu nedenle, bir class'ın metotları o class'ın object'lerini kullanıyorsa veya işliyorsa, o class başka bir class'a bağımlıdır.
class Account {
public boolean hasCredit() {
return true;
}
}
class Order {
public void process(Account account) { // Order uses Account
if (account.hasCredit()) {
System.out.println("Order processed.");
} else {
System.out.println("Insufficient credit.");
}
}
}
Aggregation sahiplik demektir, örneğin Order nesneleri Item nesnelerini içerir. Yani bir class diğer class'ı içeriyorsa bunlar arasında has-a ilişki vardır dyebiliriz. Normalde bazı yerlerde aggregation'u, association relationship olarak da görebilirsiniz.
class Item {
String name;
double price;
Item(String name, double price) {
this.name = name;
this.price = price;
}
}
class Order {
private List<Item> items = new ArrayList<>(); // Order has Items
public void add(Item item) {
items.add(item);
}
}
Inheritance, özel bir class ile daha genel bir class arasındaki ilişkiyi tanımlar. Örneğin bizde Order class'ı vardı ya bunu RushOrder yani hızlı sipariş class'ı olarak düşünebiliriz bu da Order class'ının bir alt class'ı daha özelleşmiş class'ı olarak düşünebiliriz halbuki sonunda da RushOrder da bir Order mıdır ? Cevabına evet der isek artık bunlar arasında bir inheritance ilişkisi (kalıtım) vardır.
class Order {
public void ship() {
System.out.println("Order shipped in normal time.");
}
}
class RushOrder extends Order { // RushOrder IS-A Order
@Override
public void ship() {
System.out.println("Rush order shipped immediately!");
}
}
Çoğu yazılımcılar bu class'lar arasındaki ilişkileri tanımlayabilmek için UML (Unified Modeling Language) araçlarını kullanır.

