Abstraction — Soyutlama
Object Oriented Programming (OOP) yazısında bahsettiğimiz gibi OOP 4 temel özellik üzerine kurulmuştur. Bu yazımızda bu 4 temel taştan biri olan Abstraction yani Soyutlama hakkında konuşacağız. Keyifli okumalar..
Yazılımda Abstraction kavramını anlayabilmek için öncelikle gelin gerçek hayatta abstraction nedir bunu anlayalım. Abstraction yani soyutlama, bir nesneyi, bir varlığı, bir mekanı, bir mekanizmayı veya aklınıza gelebilecek herhangi bir şeyi detaylarından ayırarak, sadece ilgimizi çeken kısımlarını görmemizi sağlayan bir yapıdır. Yani soyutlama sayesinde sadece görmek istediklerimizi ve işimize yarayacak kısımları görürüz.
Örnek vermek gerekirse şuan bu yazıyı okurken tarayıcının hangi işleri yaptığını ya da bilgisayarın arkaplanında hangi işlemlerin döndüğünü biliyor musunuz? Daha doğrusu bunlarla ilgileniyor musunuz? Cevabınız “hayır” değil mi? İşte soyutlama tam da budur. Soyutlama ile bir işin yalnızca işimize yarayan kısmını alırız.
Bir de hayatın içinden bir örnek verelim. Yeni bir insanla tanıştığınızı ve onunla arkadaş olacağınızı farzedin. Arkadaş olmak için onun karakteri, hayata bakış açısı vb. özellikleri ile ilgilenirsiniz değil mi? Yani karşınızdaki kişiyi tanımak için bu özelliklere bakarsınız. Peki o kişinin iç organlarının sağlığı ile ilgileniyor musunuz? veya kalp atış hızını merak ediyor musunuz? İşte bunlar soyutlama demektir. Soyutlama sayesinde detaylarda boğulmadan olaylara nesnelere vb. her şeye genel bir çerçeveden bakarız.
Peki yazılımda abstraction nedir? Genel bir tanım olarak, bir sınıfın iç detaylarından haberdar olmadan sınıf içerisindeki değişkenleri ve metotları kullanabilmemizi sağlayan yapıdır.
Örneğin dönem sonu notlarını hesaplayan bir fonksiyonumuz olsun. Biz bu fonksiyonu çalıştırdığımızda sadece dönem sonu notumuzu elde etmek istiyoruz başka detaylarla ilgilenmiyoruz değil mi? Ama bu fonksiyonun dönem sonu notunu elde edebilmek için sınıf içerisinde kullandığı birçok farklı fonksiyon olabilir fakat bu fonksiyonların sınıf dışına açılmasının veya bizim bu fonksiyonları görmemizin bir anlamı yoktur. İşte burada başka detaylarla ilgilenmeden sadece amacımıza yönelik fonksiyona ulaşmamızı sağlayan yapı Abstraction yani soyutlamadır.
Abstraction (soyutlama) kavramını anladığımıza göre gelin şimdi bu kavramı nasıl uygulayacağımıza bakalım.
Java’da soyutlama yapmamızı sağlayan iki tane yapı bulunmaktadır. Bunlar Abstract Class’lar yani soyut sınıflar ve Interface’ler yani arayüzlerdir. Önce Soyut Sınıfların ve Arayüzlerin özelliklerine bakalım daha sonra da bu iki kavramın farklarını inceleyelim.
Abstract Class’ların Özellikleri:
- Kendisinden türeyecek olan sınıflara ara bir katman oluşturarak, ortak özelliklerini belirli bir yerde tutmalarını sağlar.
- Alt sınıflar soyut sınıflardan miras alabilirler.
- Soyut sınıfların constructor’ı olabilir fakat constructor’larının olması bu sınıftan instance alınabileceği yani nesne oluşturulabileceği anlamına gelmez.
- Bir sınıf bir Abstract Class’ı extend ediyorsa “extends” anahtar kelimesini kullanır.
- Soyut sınıflarda soyut veya soyut olmayan fonksiyonlar tanımlanabilir.
- Static fonksiyonlar ve “final” keyword’ü ile tanımlanmış fonksiyonlar içerebilirler.
- Abstract olarak tanımlanmış metotların body’sini oluşturmak zorunlu değildir fakat bu metotların bulunduğu sınıfı miras alan sınıflarda bu metotların body’sini oluşturmak zorunludur. Yani abstract metotlarda Override zorunludur.
Türeteceğimiz class’larda belli başlı bazı özellikleri tekrar tekrar yazmak istemiyorsak abstract class kullanmamız gerekir. Çünkü abstract class’lar ile bir metodu tüm alt class’larda varsayılan metot şeklinde tanımlayabiliriz ve alt class’larda bunları tekrar yazmamıza gerek kalmaz, kalıtımla aktarılmış olurlar. Yani kalıtım yapmak istiyorsak abstract class’ları kullanmamız gerekir.
Interface’lerin Özellikleri:
- Interface’te bulunan metotlar sınıfın ne yapacağını anlatır, nasıl yapacağı hakkında bilgi vermez.
- Bir sınıf bir interface’i implemet ediyorsa “implements” anahtar kelimesini kullanır.
- Interface’ler de abstract class’lar gibi new’lenemezler.
- Interface’ler içerisinde sadece soyut metotlar yani sadece ismi olan metotlar tanımlanabilir, gövdesi olan metotlar tanımlanamaz. Metot gövdeleri onları implement edilen sınıflarda doldurulur. Bu özellik interface’lerin soyutlama oranının abstract class’lara göre çok daha fazla olduğunu gösterir.
- Interface’ler sözleşmeler gibidir. Bir sınıf eğer bir interface’ten kalıtım alıyorsa o interface’te tanımlı olan tüm soyut özellikleri karşılamak zorundadır.
Eğer kalıtım alan sınıf interface’teki bazı metotlara ihtiyaç duymuyorsa yazılım tasarımınızda bir problem var demektir !
Yazının buraya kadar olan kısmında Abstract Class’ların ve Interface’lerin özelliklerini inceledik. Şimdi de farklarına bakalım ve yazımızı sonlandıralım.
Umarım keyifli ve açıklayıcı bir okuma olmuştur. Soyut Sınıflar ve Arayüzler ile ilgili kod örneklerini başka bir yazıda ele alacağız. Hepinize iyi çalışmalar diliyorum.. ✨