Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize Temel Java Dersleri başlığı altında Nesne Yönelimli Programlama ‘ya giriş yaparak devam edeceğiz.
Nesne Yönelimli Programlama sadece Java yazılım diline ait bir kavram veya bir yöntem değildir. Yapısal olarak ilgili gereksinimleri sağlayan yazılım dilleri Nesne Yönelimli Programlama ‘ya destek verebilirler. Örneğin C programlama dili Nesne Yönelimli Programlama dili değil, Fonksiyonel (Procedural) bir programlama dilidir. C++ ise C’nin Nesne Yönelimli Programlamaya yönelik eksiklerinin giderildiği ve C dilinden üretilmiş bir Nesne Yönelimli Programlama dilidir. Fonksiyonel programlama dillerinde işler fonksiyonlar üzerinden yürürken, Nesne Yönelimli Programlama dillerinde işler nesneler üzerinden yürütülmektedir. Nesne ve sınıf yapılarıyla ilgili detaylı bilgiye bir önceki Nesne ve Sınıf Yapısı dersimizden ulaşabilirsiniz.
Bu dersimizde öncelikle Nesne Yönelimli Programlama nedir sorusunun teorik olarak cevabını verelim, ardından pratik olarak bir kaç örnek ile teorik bilgimizi pekiştirelim. Nesne Yönelimli Programlama da temel mantık, yapacağımız işlemleri tek bir sınıf içerisinde alt alta yazılmış uzun kodlarla değilde daha kısa yazılmış ve sınıfların mantıksal olarak birbirinden ayrılmış bir şekilde tasarlanmasıdır. Hatta sınıflar içerisinde yapılacak işlemlerin farklı metotlar içerisinde yazılarak yapının daha sade ve anlaşılır hale gelmesini sağlamaktır. Burada esas amaç; mantıksal yapıları kullanırken kalıtımdan faydalanmak, sınıfları soyutlamak, ilişkili metotları, değişkenleri kapsüllemek ve bir arayüz vasıtasıyla birden çok sınıfa çok biçimlilik sağlamaktır. Biraz zorlama ile kurduğum son cümlemde aslında Java’da Nesne Yönelimli Programlama parçalarından bahsettim.
Design Patterns, Clean Code, TDD(Test Driven Development)
Buraya kadar tüm derslerimizi sırayla takip ettiyseniz, artık Java’da nesne nedir, nasıl oluşturulur gibi soruların cevaplarını biliyor olmanız gerekmektedir. Nesneleri nasıl oluşturacağımızı biliyoruz, peki oluştururken nelere dikkat etmeliyiz? Bu dersin konusu olmasa da çok ufak bilgiler verebilirim.
Simple Responsibility Principle (SRP) Design Pattern konusuna dikkat etmeliyiz. Cohesion ve Coupling konularına dikkat etmeliyiz. Bunlar aslında her yazılımcının bilmesi ve proje geliştirirken dikkat etmesi gereken konulardır. Sınıflarımızın sade ve temiz görünmesini sağlamalıyız. Çünkü tecrübeli yazılımcıların edindikleri bilgiler, projeye bittikten sonra verilen desteğe proje geliştirilmesinden daha çok enerji harcandığı yönündedir. Geliştirdiğiniz projenin bakımını da büyük bir ihtimalle siz yapacağınız için, geliştirme esnasında Design Patterns ve Clean Code konularına dikkat etmenizde fayda var diye düşünüyorum.
Projenin geliştirilmesi devam ederken veya bittiğinde önceden yazmış olduğumuz bazı metotlarda değişiklikler yapmamız gerekebilir. Metotlar artık ilk yazdığımız hallerinde değildir bir çok bağımlılıkları oluşmuştur. Bu nedenle değişiklik yaptıktan sonra bu metot yine aynı şekilde çalışıyor mu veya bağımlılık yarattığı metotlar, ilgili metodumuzun yeni haliyle düzgün bir şekilde çalışıyor mu sorularını kendimize sormamız gerekmektedir. Sizden sonra gelecek, projenin geliştirmesini ve bakımını üstlenecek meslektaşlarınız metotların ne yaptığını girdisinin ne çıktısının ne olduğunu anlayabilecek mi? İşte tamda bu sebeplerden, yazdığımızı metotların testlerini de yazmamız gerekmektedir. Test Driven Development (TDD) metodolojisi ve hatta Behaivour Driven Development (BDD) metodolojisi aklımızın bir köşesinde bulunsun.
Nesne Yönelimli Programlama
Nesne Yönelimli Programlama konuya başlarken bahsettiğim Kalıtım (Inheritance), Soyutlama (Abstraction), Kapsülleme (Encapsulation) ve Çok Biçimlilik (Polymorphism) kavramlarından oluşmaktadır. Bu konu başlığında bu yapılarda kısaca bahsedip, ufak örneklerle konunun anlaşılmasını sağlayacağım ve kodlamaya kavramlardan detaylı bahsettiğim konularda başlayacağım.
Kalıtım (Inheritance)
Aslında yazılım veya teknolojik olarak düşünmeden sadece günlük hayatta duyduğumuz kalıtım sözcüğünün tam karşılığı yazılımda nesne yönelimli programlamada da mevcut. Gerçek hayatta nasıl canlı -> hayvan -> kuş -> güvercin gibi genelden özele inebiliyorsak, aynı şekilde yazılımda da bu bahsettiğim kavramları birer nesne gibi düşünerek oluşturabiliriz. Şimdi iki örnek oluşturalım;
Araba -> Volkswagen -> Binek -> Jetta
Araba -> Ford -> Ticari -> Ranger
Şimdi bu örneği kalıtım olarak cümlede oturtalım, aslında Jetta, volkswagen marka binek bir arabadır. Aynı şekilde Ranger, Ford marka ticari bir arabadır. Jetta’nın ve Ranger’ın ortak özellikleri olduğu gibi birbirlerinden farklı özellikleri de mevcuttur. Yine aynı şekilde binek ve ticari araçların aynı özellikleri olduğu gibi farklı özellikleri de mevcuttur.
Java dilinde Kalıtım sağlanırken “extends” anahtar kelimesi kullanılmaktadır.
public class BinekAraba extends Araba {
}
public class BinekAraba extends Araba {
} |
Bu örnekte BinekAraba sınıfından oluşturulacak nesne Araba sınıfı içindeki tüm özelliklere ulaşma hakkına sahiptir.
Soyutlama (Abstraction)
Soyutlama konusunu en iyi örnek vererek anlatabilirim. Şöyle ki;
Kullandığımız arabaların içerisindeki mekanik yapının nasıl çalıştığını bilmemize gerek yoktur, motor benzini nasıl alıyor nasıl yakıyor, oluşan enerjiyi tekerleri döndürmek için nasıl kullanıyor gibi konular arabayı kullanan kişiyi ilgilendirmez. Bu durum yazılım içinde geçerlidir. Kullandığımız bizim tarafımızdan yazılmamış tüm sınıfların içerisinde işlemlerin nasıl yapıldığını bilmemize gerek yoktur. Bir araba sınıfı olduğunu düşünelim, araba sınıfı marşa basıldığında arabayı çalıştıracak bir metoda ve bunun yanında anlık benzin veya motorin tüketimi hesaplayan bir metoda sahip. Biz Araba sınıfını kullanan bir kullanıcı olarak marşa basıldığında arabayı çalıştıran metodun ne yaptığıyla veya araba çalışırken benzin veya motorin tüketiminin nasıl hesaplandığıyla değil de sonuçlarıyla ilgileniyor olmalıyız.
Kapsülleme (Encapsulation)
Oluşturduğumuz bir sınıftaki değişkenlerin setter ve getter metotları kullanılarak ve bu setter ve getter metotlarına erişim belirleyicilerle belli sınıflardan erişim sağlanmasına izin vermek belli sınıflardan erişim sağlanmasına izin vermemek gibi kontroller Kapsülleme ile mümkündür. Kapsülleme yazılımcıya oluşturduğu sınıftaki değişkenlerin erişimlerini kontrol yetkisi verir. Aslında bu konuya bir önceki Erişim Belirleyiciler dersimizde detaylı bir şekilde anlattım. Dersteki örnekte Şoför belli işleri yapabiliyor ama yolcu daha kısıtlı şoför tarafından belirlenen işleri gerçekleştirebiliyordu.
Çok Biçimlilik (Polymorphism)
Çok Biçimliliği, ana sınıf içerisinde tanımlanan bir metodun alt sınıflarda değiştirilerek kullanılması olarak tanımlayabiliriz. Kalıtım başlığında verdiğimiz örnekte, Araba sınıfı içerisinde benzinDepoBuyuklugu nü dönen bir metot olsun. Bu metot binek ve ticari araç için farklı değerler dönerek birden fazla nesne tarafından farklı değerler şeklinde kullanılabilir, bu şekilde çok biçimlilik sağlanmış olur.
public class Araba {
public double getBenzinDepoBuyuklugu() {
return 50.0;
}
}
public class Araba {
public double getBenzinDepoBuyuklugu() { return 50.0; } } |
public class BinekAraba extends Araba {
@Override
public double getBenzinDepoBuyuklugu() {
return 60.0;
}
}
public class BinekAraba extends Araba {
@Override public double getBenzinDepoBuyuklugu() { return 60.0; } } |
public class TicariAraba extends Araba {
@Override
public double getBenzinDepoBuyuklugu() {
return 100.0;
}
}
public class TicariAraba extends Araba {
@Override public double getBenzinDepoBuyuklugu() { return 100.0; } } |
Sonuç
Bu derste bir çok teorik bilgi verdim, bu teorik bilgiler olmadan işlerin nasıl yürüdüğünü anlamak daha zor bir hal alabilir. Bu nedenle bahsetmiş olduğum bilgileri kafanızda canlandırarak sonraki dersleri çok daha rahat bir şekilde anlayabilirsiniz.
Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.
Tüm Temel Java Dersleri için tıklayınız..
58