Java

Abstraction ve Interface (Soyut ve Arayüzler)


Abstract Class (Soyut Sınıf) & Interface (Arayüz)

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.


OOP (Object Orianted Programming) Nedir ?

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 Class (Soyut Sınıf) nedir?

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ı :

  • Birbiriyle ilişkisi olan sınıflar arasında kod paylaşımı yapmak istediğimizde
  • Nesnelerin oluşturulfugu sınıflardaki, static ve final türünde olmayan sınıf değişkenlerini manipüle ederek o sınıftan oluşturulan nesnelerin davranışlarını değiştirilmeyi sağlayan metodlar tanımlamak istediğimizde
  • Soyut sınıftan miras alınan sınıfların bir çok ortak değişkeni veya metot içerebileceğini ve public erişim belirtecine sahip olmayan (private veya protected) metot veya değişkenler içerebileceğini öngördüğünüzde kullanabiliriz.

Interface (arayüz) nedir?

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ı:

  • Birden fazla sınıftan davranışları miras almak istediğimizde,
  • Sistem için belirli bir davranış belirlediğimiz durumlarda ama o davranışın ne gibi durumlarda elde edildiğini bir önemi olmadığı durumlarda,
  • Bir biriyle yakın ilişkisi olmayan / olmadığı halde arayüzünü geliştirecek sınıflar oluşturulmak istenildiğinde kullanabiliriz.

Örnek üzerinden görecek olursak;

public interface ICreditService {

	void calculate();

	void save();
}
 
 
public abstract class BaseCreditManager implements ICreditService {

	// Abstract methods holds on uncompleted and common process
	@Override
	public abstract void calculate(); // This method is abstract because different event each other.

	@Override
	public void save() {
		System.out.println("Credit saved on BaseCreditManager..");
	}

}
 
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.

Sonuç olarak

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
0 Yorum
Yorum Yap
Yasin Özer
Merhaba, Ben Yasin Özer

A friend who is a computer engineer

Bizi takip edin!

Gelişmelerden daha hızlı haberdar olmak için sosyal medya hesaplarımızı takip edin.