Abstraction ve Interface (Soyut ve Arayüzler)
- Yasin Özer
- Ekim 10, 2022
- 3 Yorum
Merhabalar bu yazımda abstraction ve interface kullanımından, ne durumlarda kullanılması ve uygulanması gerektiğine değineceğiz.
Bu merak edilen kavramlara başlamdan önce temel olarak OOP (Nesne Yönelimli Programlama) nedir, neden ihtiyaç duyulmuştur ve nasıl kullanılmalıdır bunun üzerinde durmak gerekir.
Java’daki OOP kavramları, Java’nın Nesne Yönelimli Programlamasının arkasındaki ana fikirlerdir. Bunlar;
Soyutlama (Abstraction)
Kapsülleme (Encapsulation)
Kalıtım (Inheritance)
Çok Biçimlilik (Polymoprhism)
Bunları kavramak, Java’nın nasıl çalıştığını anlamanın anahtarıdır. Temel olarak, Java OOP kavramları çalışma yöntemleri ve değişkenleri oluşturmamıza, ardından güvenlikten ödün vermeden hepsini veya bir kısmını yeniden kullanmamıza izin verir.
Abstraction(Soyutlama): Soyutlama, karmaşıklığı temsil etmek için basit şeyler kullanmak anlamına gelir. Java’da soyutlama, nesneler, sınıflar ve değişkenler gibi basit şeylerin daha karmaşık temel kod ve verileri temsil ettiği anlamına gelir. Bu önemlidir, çünkü aynı işi birden çok kez yinelemekten kaçınır.
Encapsulation (kapsülleme): Bir sınıf içindeki alanları özel tutma, daha sonra ortak yöntemlerle bunlara erişim sağlama uygulamasıdır. Bu, verileri ve kodu sınıfın içinde güvende tutan koruyucu bir bariyerdir. Bu şekilde, veri sistemi genelinde açık erişime izin vermeden kod bileşenleri veya değişkenler gibi nesneleri yeniden kullanabiliriz.
Inheritance (miras): Java’da Nesne Yönelimli Programlama’nın özel bir özelliğidir. Programcıların varolan sınıfların bazı özniteliklerini paylaşan yeni sınıflar oluşturmasına olanak tanır. Bu, bize miras aldığımız sınıfın özelliklerine erişmemizi sağlar.
Polimorphism (Çok biçimlilik): Java OOP konsepti, programcıların farklı durumlarda farklı şeyler ifade etmek için aynı ismi (aynı isimde metot olabilir) kullanmalarını sağlar. Java’da polimorfizmin bir şekli yöntem aşırı yüklemedir.Yani varolan bir methodu kullanılan bir sınıf için fakrlı anlam ifade ediyorsa kendi ifade şekline göre oluşturulur. Bu, farklı anlamların sağlanan değişkenlerin değerleri tarafından yönetilir.
Temel olarak teorik bilgi edindikten sonra artık üzerinde durmamız gereken abstraction ve interface konumuza dönebiliriz.
Abstract sınıflar,genellikle ortak özellikleri olan nesneleri tek bir çatı altında toplamak için kullanılır. Abstract sınıflarda içi boş yada dolu metodlar tanımlanır. Abstract sınıflardan new kelimesi ile nesne oluşturulmaz. En az 1 abstract metod varsa sınıf abstract olmalıdır. Bir sınıfı abstract sınıf yapmak için abstract kelimesi kullanılır.
Hangi durumlarda kullanılmalı :
Interface normal bir class gibi tip tanımlamak için kullanılır. İçerisindeki default ve static tanımlanan metotlar hariç, metotların implementasyonları bulunmaz ve state tutmaz. Bir çok class tarafından implement edilebilirlen yapılardır. Birden fazla interface’i extends edebilirler. Ve interfaceler ayrıcı çok iyi birer referans tutuculardır.
Hangi durumlarda kullanılmalı:
Örnek üzerinden görecek olursak;
public interface ICreditService {
void calculate();
void save();
}
public class TeacherCredit extends BaseCreditManager {
@Override
public void calculate() {
System.out.println("Teacher credit calculated..");
}
@Override
public void save() {
System.out.println("This area can use extra process for teacher credits");
super.save();
}
}
public class FarmerCredit extends BaseCreditManager {
@Override
public void calculate() {
System.out.println("Farmer credit calculated..");
}
}
public class MilitaryCredit extends BaseCreditManager {
@Override
public void calculate() {
System.out.println("military credit calculated..");
}
}
public class CreditUI {
public static void main(String[] args) {
List<ICreditService> creditServices = new ArrayList<ICreditService>();
MilitaryCredit militaryCredit = new MilitaryCredit();
TeacherCredit teacherCredit = new TeacherCredit();
FarmerCredit farmerCredit = new FarmerCredit();
creditServices.add(militaryCredit);
creditServices.add(teacherCredit);
creditServices.add(farmerCredit);
// Input from user
Scanner scan = new Scanner(System.in);
boolean isExit = false;
while (!isExit) {
System.out.println(
"------UI-----\nEnter a number for\n Military credit (1)\n Teacher credit (2)\n Farmer credit (3)\n all credits (4)\n Exit for press (5)");
int input = scan.nextInt();
switch (input) {
case 1:
militaryCredit.calculate();
break;
case 2:
teacherCredit.calculate();
break;
case 3:
farmerCredit.calculate();
break;
case 4:
for (ICreditService credit : creditServices) {
credit.calculate();
}
break;
case 5:
isExit = true;
break;
default:
throw new IllegalArgumentException("Unexpected value: " + input + " please enter valid value");
}
}
}
}
ICreditService üzerinden calculate() ve save() işlemleri tanımlanmaktadır.
bu bize ve diğer yazılım ekibine bir method imzası oluşturmakta ve artık bu interface’yi kulanan herkese zorunlu bir alan işaretlemiş oluyoruz.
Bu method imzasını olultuştuduktan sonra BaseCreditManager sınıfımızdan implements edip zorunlu alanları dolduruyoruz.
Ama BaseCreditManager tarafında metod olarak calculate() işlemimiz diğer her bir kredi durumları için farklı hesaplanacağından dolayı calculate() metodunu abstract olarak işaretleyip kullanan her bir subclass için içini dolduruyoruz ama save() (kayıt) işlemi hepsi veya bir çoğunluğu için aynı işlemler olacağından onu abstract olmadan gövdeli bir metod olarak ekliyoruz.
CreditUI ‘da basit bir arayüz ile kullanıma sunup kullanıcı işlemine göre ilgili operasyonları abstract ve interface mantığını kavrayarak anlamış olduk.
İyi günler, iyi çalışmalar :)
by OzerBey
Gelişmelerden daha hızlı haberdar olmak için sosyal medya hesaplarımızı takip edin.