Karar Verme – II

Bir önceki yazımızla birlikte javada karar verme konusuna giriş yapmıştık. Öncelikle if ifadesinin tek başına kullanılmasına değinmiştik. Örneğimizde kartta para varsa kulaklık satın alma işlemini gerçekleştirmiştik. Bu örneğin ardından kartta para varsa kulaklığı al ve kartta para yoksa ekrana “Bakiye yetersiz” yazdıran bir if-else örneği yapmıştık.

Ancak bazen öyle durumlar olur ki, karar verme anında ikiden fazla seçeneğimiz olur. Üzerinde uğraştığımız kredi kartları örneğine odaklanarak şöyle bir durum düşünebiliriz; Bir kartın tipi gold ise o karta 4 taksit uygulanır, kartın tipi normal ise o karta 2 taksit uygulanır ve kart tipi bunlardan farklı ise o karta taksit uygulanmaz. Bu daha uzun bir zincir de olabilirdi. Örneğin platium karta n taksit, silver karta t taksit olabilirdi. Bütün bu durumları çok sayıda if-else bloğu ile halletmek makul olmayacaktır.

Javada bu konu da çözüme kavuşturulmuştur. Bu yazıda ilk olarak bunu inceleyeceğiz. Öncelikle mevcut uygulamamızda bir takım değişiklikler yaparak main methodumuzu daha temiz bir hale getirelim. Yazdığımız kodu kaybetmemek için, main methodumuzun içerisindeki kodu, yeni, ayrı bir kartOrnegi() methodumuza alıyoruz. Bu methodu main içerisine commentli bir şekilde ekleyeceğiz. Methodu çalıştırmak istediğimizde, method çağrısını un-comment etmek yeterli olacaktır.

public class TestClass {

	public static void main(String[] args) {
		
		// İlk örneğin çalışması için method çağrısının 
		// önündeki comment işaretini (//) kaldırınız.
		
		//kartOrnegi();

	}

	private static void kulaklikSatinAl(KrediKarti kart) {
		
		if(kart.getBakiye() >= 750) {
			System.out.println("Kulaklık satıldı");
			int yeniBakiye = kart.getBakiye() - 750;
			kart.setBakiye(yeniBakiye);
		} else {
			System.out.println("Bakiye yetersiz");
		}
		
	}
	
	private static void kartOrnegi() {
		
		KrediKarti normalKart = new KrediKarti();
		normalKart.setKartTipi("normal");
		normalKart.setBakiye(1000);
		
		KrediKarti goldKart = new KrediKarti();
		goldKart.setKartTipi("gold");
		goldKart.setBakiye(10000);

		System.out.println("Normal kart önceki bakiye:" + normalKart.getBakiye());
		kulaklikSatinAl(normalKart);
		System.out.println("Normal kart sonraki bakiye:" + normalKart.getBakiye());
		
		System.out.println("Gold kart önceki bakiye:" + goldKart.getBakiye());
		kulaklikSatinAl(goldKart);
		System.out.println("Gold kart sonraki bakiye:" + goldKart.getBakiye());
		
		System.out.println("Normal kart önceki bakiye:" + normalKart.getBakiye());
		kulaklikSatinAl(normalKart);
		System.out.println("Normal kart sonraki bakiye:" + normalKart.getBakiye());
		
	}
	
}

Yukarıda yaptığımız işlem tamamen çalışma alanımızı temiz tutmak içindi. Şimdi de ikinci örneğimiz için yeni bir method kodlayacağız. Bu methodumuzun ismini kartOrnegiCokluSecenek() olarak belirliyoruz. Bu method içerisinde KrediKarti sınıfından 4 tane instance oluşturacağız. İsimlerini ise sırasıyla platiniumKart, silverKart, bronzeKart ve normalKart koyuyoruz. Bu nesnelerin kartTipi fieldlarını da kart ismine uygun olacak şekilde setleyiniz.

Farklı kartlar için bankanın bir kampanya yürüttüğünü ve kart tipine göre taksit yapıldığını düşünelim. Örneğin platinium için 8 taksit, silver için 6 taksit, bronze için 4 taksit uygulansın. Normal kartlarda ise taksit uygulaması olmasın. Banka geriye kalan tüm kart tipleri için ise 2 taksit uygulasın.

Bir başka methodumuz ise kendisine gelen kartın tipine bakıp, kaç taksit yapıldığını geriye dönsün. Bu methodumuzun ismi ise getTaksitSayisi() olsun. TestClass içerisine bu methodları kodlayacağız. İlk adım olarak getTaksitSayisi() methodumuzun boş olacağını belirteyim. Bu method tahmin edeceğiniz üzere parametre olarak bir KrediKarti nesnesi alacaktır.

	private static void kartOrnegiCokluSecenek() {
		
		KrediKarti platiniumKart = new KrediKarti();
		platiniumKart.setKartTipi("platinium");
		
		KrediKarti silverKart = new KrediKarti();
		silverKart.setKartTipi("silver");
		
		KrediKarti bronzeKart = new KrediKarti();
		bronzeKart.setKartTipi("bronze");
		
		KrediKarti normalKart = new KrediKarti();
		normalKart.setKartTipi("normal");
		
	}
	
	private static int getTaksitSayisi(KrediKarti kart) {
		//Derleme hatasını engellemek için 
		// geçici bir return değeri kullanıyoruz
		return -1;
	}

Bu noktada karar verme aşamasında kullandığımız if ve if-else bloklarının dışında yeni bir yapı kullanacağız. Bu yapımıza else-if yapısı ismini veriyoruz. Yukarıda bahsettiğimiz banka kampanyasının kodlamasını da bu yapıyı kullanarak yapacağız. Taksit sayısını get eden methodumuzu aşağıdaki gibi düzenliyoruz.

	private static int getTaksitSayisi(KrediKarti kart) {
		
		String kartTipi = kart.getKartTipi();
		
		if (kartTipi.equals("platinium")) {
			return 8;
		} else if(kartTipi.equals("silver")) {
			return 6;
		} else if(kartTipi.equals("bronze")) {
			return 4;
		} else if(kartTipi.equals("normal")) {
			return 1;
		} else {
			return 2;
		}
		
	}

Kodu biraz incelersek, yeni bir ifade ile karşılaşırız. Bu ifade else if ifadesidir. İfadeyi kullanabilmek için bir if ifadesi öncelikle bulunmalıdır. Bu ifadenin görevi, ikiden fazla seçenek olduğunda bunu işleme tek seferde alabilecek bir yapıyı oluşturmaktır.

Burada bir de minik bir detay daha eklemek istiyorum. Dikkat ettiyseniz String ifadeleri kıyaslarken == operatörünü kullanmadım. Bunu sonraki konularda ele alacağız. Ancak String ifadeleri kıyaslarken, geriye true ya da false değer dönen equals() methodunu kullanmanız gerektiğini, aklınızın bir köşesine yazınız.

Nihayetinde bankanın kampanyasının kodlamaya dökülmüş hali bu şekildedir. Şimdi bunu test etme zamanı. kartOrnegiCokluSecenek() methodumuzu uygun şekilde düzenliyoruz.

	private static void kartOrnegiCokluSecenek() {
		
		KrediKarti platiniumKart = new KrediKarti();
		platiniumKart.setKartTipi("platinium");
		
		KrediKarti silverKart = new KrediKarti();
		silverKart.setKartTipi("silver");
		
		KrediKarti bronzeKart = new KrediKarti();
		bronzeKart.setKartTipi("bronze");
		
		KrediKarti normalKart = new KrediKarti();
		normalKart.setKartTipi("normal");
		
		System.out.println("=== Taksit sayıları ===");
		System.out.println("platinium:" + getTaksitSayisi(platiniumKart));
		System.out.println("silver:" + getTaksitSayisi(silverKart));
		System.out.println("bronze:" + getTaksitSayisi(bronzeKart));
		System.out.println("normal:" + getTaksitSayisi(normalKart));
		
	}

Bununla birlikte bu methodu main methodumuzdan çağırılacak şekilde kodumuzu ayarlıyoruz. Ardından ise main methodumuzu çalıştıracağız.

	public static void main(String[] args) {
		
		// İlk örneğin çalışması için method çağrısının 
		// önündeki comment işaretini (//) kaldırınız.
		
		//kartOrnegi();

		kartOrnegiCokluSecenek();
	}
Çıktı:
=== Taksit sayıları ===
platinium:8
silver:6
bronze:4
normal:1

Bir ufak pratik olarak kartTipi gold olan bir nesne daha yaratınız ve yukarıda yaptığımız gibi ekrana taksit sayısını yazdırınız. Gold kart olarak ekranda 2 taksit olduğunu göreceksiniz.

Yukarıda yaptığımız örneği java alternatif bir yöntem ile daha yapmamıza izin verir. Bu yöntem switch-case yöntemidir. Örneği hiç değiştirmeden yeni bir method ile bunu da inceleyelim. Öncelikle sözdizime değinmek istiyorum. Bir switch case ifadesi kabaca şu şekilde oluşur:

switch (anahtar) {
	case alternatifDeğer:
		//Çalışacak kod
		break;
	case alternatifDeğer2:
		//Çalışacak kod
		break;
	//...
	//diğer case ifadeleri
	//...
	default:
		//Çalışacak kod
		break;
}

Dikkat ederseniz çok sayıda farklı durumu switch-case ile yönetebiliyoruz. Ancak sözdiziminde bir takım detaylar ilgi çekmekte. Bunun sebeplerine gelirsek;

  • Öncelikle switch ifadesi çalışır ve bir değer üretir.
  • Üretilen bu değer her case ifadesi ile karşılaştırılır.
  • Eğer bir eşleşme varsa o blok çalıştırılır.
  • Eğer bir eşleşme yoksa default içerisinde yazılmış kod çalışır.
  • Bir kod çalıştıktan sonra break ile switch akışı kırılır ve ifadenin çalışması sonlandırılır.

Şimdi de taksit sayılarını ekrana yazdıran bir method daha yazalım. Bu method içerisinde birlikte switch-case kullanalım. Methodumuzun ismi ise getTaksitSayisiSwitchCase() olsun. Öncelikle bu methodu tek başınıza kodlamaya çalışın. Sonra aşağıdaki kod ile karşılaştırın.

	private static void getTaksitSayisiSwitchCase(KrediKarti kart) {

		String kartTipi = kart.getKartTipi();

		switch (kartTipi) {
		case "platinium":
			System.out.println("Platinium kart için taksit sayısı:" + 8);
			break;
			
		case "silver":
			System.out.println("Silver kart için taksit sayısı:" + 6);
			break;
			
		case "bronze":
			System.out.println("Bronze kart için taksit sayısı:" + 4);
			break;
			
		case "normal":
			System.out.println("Normal kart için taksit sayısı:" + 1);
			break;

		default:
			System.out.println("Diğer kart için taksit sayısı:" + 2);
			break;
		}
	}

kartOrnegiCokluSecenek() methodumuzun içerisinde bulunan nesneler ile bu methodu test edelim ve çıktıyı else-if yapısındaki çıktıyla karşılaştıralım. Methodumuza şu satırları ekliyoruz ve ardından uygulamamızı çalıştırıyoruz.

		System.out.println("=== Taksit sayıları / switch-case ===");
		
		getTaksitSayisiSwitchCase(platiniumKart);
		getTaksitSayisiSwitchCase(silverKart);
		getTaksitSayisiSwitchCase(bronzeKart);
		getTaksitSayisiSwitchCase(normalKart);
Çıktı:
=== Taksit sayıları ===
platinium:8
silver:6
bronze:4
normal:1
=== Taksit sayıları / switch-case ===
platinium:8
silver:6
bronze:4
normal:1

Javanın temel karar verme ifadelerini son iki yazımız ile inceledik. Umarım faydalı olmuştur. Yazı içerisinde bazı ufak detaylara da dikkat çekmek istedim. Örneğin bir method geriye değer dönerken diğeri dönmüyor. Bu durumda ekran yazdırmak için farklı yaklaşımlar sergiledik. Siz iki methodu da değer dönen veya dönmeyen hale getirip pratik yapabilirsiniz. Ayrıca String ifadelerin nasıl kıyaslanacağına değindik. Üzerinde çalıştığımız örnekleri sınırlı sayıda tuttuk, ancak, bu örnekleri daha da uzatabileceğimizi gözlemledik. Editörümüzde şu ana kadar 4 ayrı proje oluşturduk. Bunlar zamanla daha da artacaktır. Siz bütün bu projeler dışında yeni bir proje oluşturup, farklı örnekler yapıp, tüm öğrendiklerinizi bir arada kullanmaya çalışın. Unutmayın, pratik mükemmelleştirir. Sonraki yazıda görüşmek üzere.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir