Karar Verme

Karar verme, belirli bir olgunun gerçekleşmesi veya gerçekleşmemesi durumunda, elimizdeki seçeneklerden hangisinin kullanılabilir olduğunun tayin edilmesidir. Karar verme eylemi, akış şemalarımızda sıklık ile karşımıza çıkmaktadır. Programlamanın temellerinden olan bu durumu, javada da karşılayabilmekteyiz.

Bu yazımızda kullanmak üzere, içerisinde TestClass’ı bulunan bir proje oluşturuyoruz ve ismini 04 – DecisionMaking olarak belirliyoruz. Bu konuyu işlerken yine gerçek dünyadan bir örnekle ilerleyeceğiz. Uygulamamızın içerisinde KrediKarti isminde yeni bir sınıf yaratıyoruz. Bu sınıfımız iki field barındırmalıdır. Fieldlardan bir tanesi String değer taşıyan kartTipi diğeri ise sayısal bir değer tutan bakiyedir. Bu alanların erişim düzenleyicileri ise private olmalı ve alanlara getter/setter vasıtasıyla ulaşılmalıdır. Sınıfı öncelikle kendiniz yazıp, sonrasında aşağıdaki kod ile karşılaştırınız.

public class KrediKarti {
	
	private String kartTipi;
	
	private int bakiye;

	public String getKartTipi() {
		return kartTipi;
	}

	public void setKartTipi(String kartTipi) {
		this.kartTipi = kartTipi;
	}

	public int getBakiye() {
		return bakiye;
	}

	public void setBakiye(int bakiye) {
		this.bakiye = bakiye;
	}

}

Şimdi main methodumuza gidiyoruz ve iki ayrı değişken yaratıyoruz. İki değişkenimizin de tipi KrediKarti olup; değişkenlerden bir tanesinin ismi normalKart ve diğeri ise goldKart olacaktır. KrediKarti sınıfına ait bu instanceların, kendi içlerindeki kartTipi alanları sırasıyla “normal” ve “gold” olarak setlenmeli, bakiyeleri ise 1000 ve 10000 olmalıdır. Kodunuzu kendiniz yazdıktan sonra yine aşağıdaki blokla karşılaştırınız.

public class TestClass {

	public static void main(String[] args) {

		KrediKarti normalKart = new KrediKarti();
		normalKart.setKartTipi("normal");
		normalKart.setBakiye(1000);
		
		KrediKarti goldKart = new KrediKarti();
		goldKart.setKartTipi("gold");
		goldKart.setBakiye(10000);
		
	}
	
}

Bu kısa kodlama seansından sonra bu iki obje ile neler yapabileceğimizi düşünelim. Öncelikle bunlar bakiyeleri olan kartlar olduğu için, bu bakiyeleri nasıl karar verme noktası olarak kullanacağımızı hayal edebiliriz. Bu kartlar elinizde olsaydı ve değeri 750 birim olan bir kulaklık almak isteseydiniz, her iki kartın da bunu sağlıyor olması gerekirdi. Ancak normalKart bu kulaklığı bir kere alabiliyorken goldKart burada size farklı bir sonuç sağlayacaktır. O halde kart bakiyesini karar verme noktası olarak kullanabiliriz. Gelin kulaklık satma işlevini gerçekleştiren ve parametre olarak KrediKarti tipinde bir input alan methodu, test sınıfımıza ekleyelim. Bu methoda gönderilen kart objesinin bakiyesi 750 birimi karşılayabiliyorsa, konsola çıktı olarak “Kulaklık satıldı” yazsın ve hemen ardından karttan 750 birim bakiye eksiltsin. Methodumuz şu şekilde olacaktır.

	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);
		}
		
	}

Öncelikle şu ana kadar yaptığımız örnekler arasında, programlamaya gerçekten en yakın durduğumuz örneğin bu olduğunu belirtmek isterim. Yukarıdaki method her ne kadar böyle bir özellik taşısa da, normal şartlarda tasarımını doğru bulacağım bir kodu temsil etmiyor. Unutmayın ki, bu yazıların amacı belli başlı kalıpları öğretmektir. Dolayısı ile örneklerdeki hedefimiz doğru tasarım yapmak değil, konuyu benimsetmektir. Eğer bir miktar programlama bilginizle bu yazıları okuyorsanız ve size yanlış gelen şeyler varsa, lütfen bu bahsettiğim önceliği gözden kaçırmayınız.

Bu kısa bilgiden sonra methodu incelemeye alalım. Method henüz değinmediğimiz bir sebeple static anahtar sözcüğünü imzasında taşımaktadır. Bu noktaya takılmadan devam edelim. Methodumuz TestClass sınıfımızda bulunan, main methodundan sonraki ikinci methoddur. Methodların sınıf içerisinde satır numarası olarak yerleri önemli değildir. Dolayısı ile buradaki ikinci ifadesi sizi yanıltmasın. Methodumuzun dönüş tipi voiddir. Yani geriye bir bilgi dönmez. Methodumuz içerisine KrediKarti tipinde bir parametre alır. Bu durumu kartı karşınızdaki kişiye vermek gibi düşünebilirsiniz.

Methodun içerisine baktığımızda ise bir if bloğu içerisinde kulaklığın satıldığını konsola yazdıran ve hemen ardından kart bakiyesinden 750 birim düşmekte olan bir kod görürüz. Buradaki yöntemde, mevcut bakiye get edilmiş, get edilen değerden 750 birim çıkarılmış ve yeniBakiye ismindeki bir int değişkene atanmıştır. Sonrasında bu int değişken ile güncel bakiye setlenmiştir.

Gelelim bu kodun karar verdiğimiz kısmına. buradaki if ile başlayıp hemen ardından parantezle devam eden kısım bizim karar noktamızdır. Burada öncelikle parantez içerisindeki ifadeye odaklanalım.

if(kart.getBakiye() >= 750)
Karar noktamız

Operatörler yazımızdan da hatırlayacağınız üzere >= ifadesi bir operatördür. Bu operatör sağında ve solunda bulunan ifadeleri kıyaslar. Eğer soldaki ifade sağdakinden büyükse veya eşit ise geriye true döner. Bu durumda ifademizi şu şekilde okuyabiliriz : if(condition), yani konuşma diline yaklaşmak istersek “Eğer şartımız doğru ise” şeklinde belirtebiliriz. Bu durumun bir sonucu olarak, eğer şart doğru ise if bloğundaki kod çalışır. Yani bu methoda gönderilen kartın bakiyesi 750’den büyük veya eşit ise blok çalışır. Gelin bunu birlikte deneyimleyelim. TestClass’ın durumu test etmek üzere düzenlenmiş son halini aşağıya yapıştırıyorum ve ardından çalıştırıp aldığım çıktısını ekliyorum.

public class TestClass {

	public static void main(String[] args) {

		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());
		
	}

	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);
		}
		
	}
	
}
Çıktı:
Normal kart önceki bakiye:1000
Kulaklık satıldı
Normal kart sonraki bakiye:250
Gold kart önceki bakiye:10000
Kulaklık satıldı
Gold kart sonraki bakiye:9250

Gördüğünüz gibi bakiye başarılı şekilde düşüyor ve kulaklığın alındığına dair ibareleri görüyoruz. Peki normalKart ile ikinci bir satın alma işlemi daha yapmak isteseydik, yani bakiyemiz olmasaydı, neler olurdu? Tahmin edebildiniz mi? main methoduna aşağıdaki kod parçasını ekleyip kodu tekrar çalıştırdığımızda çıktı şu şekilde olacaktır.

		System.out.println("Normal kart önceki bakiye:" + normalKart.getBakiye());
		kulaklikSatinAl(normalKart);
		System.out.println("Normal kart sonraki bakiye:" + normalKart.getBakiye());
Çıktı:
Normal kart önceki bakiye:1000
Kulaklık satıldı
Normal kart sonraki bakiye:250
Gold kart önceki bakiye:10000
Kulaklık satıldı
Gold kart sonraki bakiye:9250
Normal kart önceki bakiye:250
Normal kart sonraki bakiye:250

Görüleceği üzere kulaklığın satıldığına dair bir ifade olmadan önceki ve sonraki bakiye ekrana basılmış. Bu da if şartının çalıştığını, bunun sonucunda false değer geldiği için bloğun kendisinin çalıştırılmadığını göstermektedir. Peki biz bunu da belirtmek istesek, yani eğer bakiye yoksa “Bakiye yetersiz” yazdırmak istesek ne yapardık? Bir if bloğu daha eklemek iş görecektir. Ancak bu durumda mantıksal bir problem oluşur. Bu iki şartın bir arada bulunma olasılığı yok. Yani hem bakiye olmaması hem de kulaklığı almanız olası değil. Dolayısı ile iki işi ayrı ayrı yapmak biraz verimsiz gözüküyor. Yani şartlardan biri çalışırsa, diğerinin çalışmaması makul gözüküyor. İşte bu durumu javada çözebiliyoruz. if ifadesinin kardeşi olan ve birlikte kullanılan else ifadesi bunu bize sağlamaktadır. if-else kullanımını şu şekilde temsil edebiliriz:

if(şart) { 
	//şart doğru ise çalışır
} else { 
	//şart doğru değil ise çalışır
}

Dikkat ederseniz else ifadesinin yanında bir parantez bulunmuyor. Dolayısı ile if koşulunun başarısız olmasının, else bloğundaki kodun çalışması için yeterli olduğunu söyleyebiliriz. O halde bunu deneyip görelim. kulaklikSatinAl methodumuzun içeriğini şu şekilde düzenleyelim.

	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");
	}

Hemen ardında programı tekrar çalıştırıp çıktısına bakalım.

Çıktı:
Normal kart önceki bakiye:1000
Kulaklık satıldı
Normal kart sonraki bakiye:250
Gold kart önceki bakiye:10000
Kulaklık satıldı
Gold kart sonraki bakiye:9250
Normal kart önceki bakiye:250
Bakiye yetersiz
Normal kart sonraki bakiye:250

Az öncekinden farklı olarak “Bakiye yetersiz” ifadesini konsolda göreceğiz. Böylece iki ayrı if yazmadan bu durumu nasıl yöneteceğimizi görmüş olduk.

Bir sonraki yazımızda da karar verme konusuna devam edeceğiz. Bu noktadan sonra işler tamamen ciddileşmiş gözüküyor. Daha evvel önerdiğim gibi, geçmiş konuları zaman zaman tekrar etmeniz size faydalı olacaktır. Yazılarda mümkün olduğunca önceki konulara referans vermeye çalışıyorum. Eğer bu referansları çok sık kontrol etme ihtiyacı duyuyorsanız tekrar şart demektir. Bir sonraki yazıda görüşmek üzere!

1 Comment

Leave a Comment

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