Alt Programlar, Fonksiyonlar, Prosedürler

Makine dilinde, Assembly dillerinde ve ilk gelişmiş programlama dillerinde; programımızı yazarken işleme başlar, her alt satırda bir sonraki adıma geçerdik. Programlar büyüdükçe, kodlar da büyümeye ve karmaşıklaşmaya başladı. İşte bu aşamada ortaya yapısal programlama diye bir kavram çıktı. Bu kavram, bizi alt programlar ve bloklar mantığıyla tanıştırdı.

Daha sonra nesneye dayalı programlama dillerinin ortaya çıkmasında da yapısal programlama önemli rol oynamıştır. Peki nedir yapısal programlama? Yapısal programlama, programlama dillerini tek bir akıştan kurtarmış, farklı durumlarda farklı blokların çalışmasını sağlamıştır. Bloklama mantığı ile aynı veya benzer işleri yapan kodlar düzenli şekilde istiflenmiş ve tekrar tekrar kullanılabilmiştir.

Algoritma Nedir? yazımızda adımlardan bahsetmiştik. O yazımızda bahsettiğimiz algoritma adımları, eski zamanlarda olduğu gibi programlama dillerine aktarılıyordu. Şimdi size aşağıya yapısal olmayan bir programlama dili olan GWBasic için yazılmış bir kod örneği paylaşacağım:

10 ‘Girilen iki sayi arasindaki asal sayilari listeler
20 CLEAR :CLS :KEY OFF
30 PRINT “BLOG.CEYNET.ORG: Asal sayi programi” :PRINT
40 INPUT “Kucuk sayiyi girin “;SMALL
50 INPUT “Buyuk sayiyi girin “;LARGE
60 IF LARGE < SMALL THEN SWAP LARGE,SMALL
70 SMALL=INT(SMALL/2)*2+1
80 LARGE=INT(LARGE/2)*2-1
90 FOR K=SMALL TO LARGE STEP 2
100 X=SQR(K)
110 F=0
120 FOR J=3 TO X STEP 2
130 IF K/J-INT(K/J)=0 THEN LET F=F+1
140 NEXT J
150 IF F=0 THEN PRINT USING “########”;K;
160 NEXT K
170 END

Ekran da şu şekilde bir sonuçla karşılaşacağız:

gwbasic

Dikkat ederseniz program kodlarının en başına adım numarası yazıyorum. Her işlemi adım adım yazıyorum. Algoritma yazımızda bahsettiğimiz gibi. Buraya kadar güzel. Algoritmamız neyse, programımıza adım adım taşıyabiliyoruz. Peki bu program o kadar da basit bir program değil. Bir sürü işlem yapıyoruz. Çeşitli işlemler yapıp daha sonra kullanıcıya bir kaç kez iki sayı arasındaki asal sayıları listeliyoruz. GWBasic’de bunu yapmak için 60 ile 160 arasındaki 10 satırı tekrar tekrar, listeleyeceğimiz her yerde yazmamız gerekecekti. Veya GOTO komutuyla kullanıcıları 60. satıra gönderecektik. Yani aynı işlemi programda değişik koşullarda tekrarlamak için sürekli 5-10 satır kod ekleyecektik.

Ancak ben aynı işi yapan bir programı Basic’in yapısal programa destekleyen, en son sürüm dili olan VB.Net‘te sizin için yeniden yazdım. Buyrun örnek kod:

vb.net

Öncelikle kodların birbirine benzediğine dikkat edin. GWBasic’teki 60. satırdaki kodları Private Sub AsallariListele yazan bölümün altına yazdık. End Sub koduyla da AsallariListele bölümünü sonlandırdık. O aradaki kod bloğu artık .NET derleyicisi tarafından tanınıyor ve tek bir “alt program” olarak kabul ediliyor. Ve ekrandaki 4 farklı düğmeye tıklandığında değişik rakamlar arasında asalları bir listeye yazdırmak için artık tek bir satır kod yazmam gerektiğini yukarıda görebilirsiniz.

Bakın dikkat ederseniz ekranda artık 4 tane buton var. Ve ben hepsi için 10-15 satırlık asal sayı bulma kodunu yazmadım. Sadece AsallariListele diye bir alt program yaptım. O programı değişik parametrelerle 4 düğmeden de çalıştırdım. Aynı kodu çalıştırıp sadece parametrelerimi değiştirdim.

Bir muhasebe programı yazdığınızı ve vergi oranına göre yüzlerce fatura için vergi hesapladığınızı düşünün. Her fatura için hesap yaparken, vergi hesaplama kodlarını tekrar mı yazmak istersiniz? Yoksa bir yere sabit yazıp, oranı değiştirerek çağırmak mı istersiniz?

Bu şekilde alt programlar ve fonksiyonlar vasıtasıyla kod yazılan diller “yapısal programlama dilleri” olarak bilinmekte. Peki bize ne avantajlar sağlıyor?

1 – Aynı kodları tekrar tekrar yazmadığımız için hız kazandırıyor.

2 – Kod satırlarını azalttığı için sadelik kazandırıyor.

3 – İşlemlerimizi tekrar tekrar kullanmamızı sağlayarak büyük programları hem daha az kodla, hem de daha hızlı yazmamızı sağlıyor.

4 – Basitlik ve sadelik kazandırdığı için daha karmaşık ve büyük programlar yazabilmemizi sağlıyor.

 

Peki bu alt programlar ve fonksiyonların farkı var mı? Hayır. Esasında fonksiyonlar da birer alt programlardır. Ayrı telafuz edilmesinin nedeni alt programların işlem yapmak için, fonksiyonların için bir yanıt vermesi için kullanılmasıdır. Bazı dillerde bu ikisi farklı değildir. Tamamı fonksiyondur. Çünkü fonksiyonlar alt programların işini de yapabilmektedir. Basic’deki Sub veya Pascal’daki procedure geriye bir sonuç döndermez. O yüzden fonksiyon olarak nitelenmez. Bir işlem yapıp bir diğer almak istiyorsanız Basic’de de Pascal’da da alt programınızda “function” ifadesi kullanarak bunun bir fonksiyon olduğunu belirtmelisiniz.

 

ALT PROGRAMLAR (SUB, PROCEDURE vs)

Örneğin yukarıda kullandığımız AsallariListele bir alt programdır. Visual Basic.Net’de Sub ifadesi yazdığımız kodun bir “alt program” olduğunu ifade eder. Gelin yukarıdaki ifademizden alt programları daha iyi anlamaya çalışalım:

Private Sub AsallariListele(SMALL As Integer, LARGE As Integer)

Burada Private ifadesi, bu alt programın bu class’a özel bir alt program olduğunu ifade eder. Yani sadece bu Form1 formunda kullanılabilir. Dışarıdaki bir form veya nesneden çağrılamaz. Private yerine Public veya Protected ifadeleri de kullanılabilirdi. Bu durumda bu çağrılabilme durumu değişirdi.

Sub ifadesi ise bunun bir “alt program” olduğunu ifade ediyor. Yani çalıştıktan sonra kendisini çağıran programa bir yanıt vermeyecek. Eğer sub yerine FUNCTION ifadesi kullansaydık, bir yanıt döneceğimizi belirtmiş olurduk. Yani yazdığımız blok bir fonksiyon haline gelirdi.

AsallariListele ise alt programımıza verdiğimiz isim.

SMALL ve LARGE ise programımızın beklediği parametreler. İkisi de integer tipinde. “As Integer” ifadesi bunu ifade ediyor. Vb.net’te bir alt program bu şekilde başlayıp End Sub ifadesiyle bitiyor.

 

FONKİSYONLAR (FUNCTION)

Fonksiyonlar tamamiyle alt programlara benzer. Aralarındaki tek farkları, fonksiyonların ekstra olarak, işlerini bitirdikten sonra bir yanıt dönmeleridir. Örneğin yukarıdaki AsallariListele alt programını fonksiyon haline getirerek programımızı tekrar yazalım.

vb.net fonksiyon

Şimdi kodumuzu biraz inceleyelim. Fonksiyonumuzun tanım bölümüne bakalım.

Private Function AsallariListele(SMALL As Integer, LARGE As Integer) As Boolean

Buradaki private ifadesini daha önce anlatmıştık. Eskiden Sub olan ifade artık “Function” olarak değişti. Yani bunun artık “sonuç dönderen” bir fonksiyon olduğunu belirtiyoruz Vb.Net derleyicisine. Ardından fonksiyonumuzun ismi ve parametrelerini gönderiyoruz, sub’da olduğu gibi. Ve en sona “As Boolean” ifadesini gönderiyoruz. Yani fonksiyonun bize vereceği cevap “Doğru-Yanlış” tipinde bir cevap olacakmış.

Fonksiyonun içinde de bazı değişikler yaptık. Try-Catch ifadesi ile hata yakalama kodu ürettik. Return ifadesiyle de yanıtımızı döndürdük. Kodumuza göre TRY bloğu tamamlanırsa, yani hata almazsak TRUE yanıtı dönecek. Eğer hata alırsak, TRY bloğu çalışmayı kesip, CATCH bloğunu çalıştıracaktır (CATCH hata alınırsa çalışmaz). Bu durumda da fonksiyonumuzdan FALSE yanıtı dönecektir. Özetle fonksiyonumuz, işini tamamlarsa TRUE, yarıda kesilirse FALSE şeklinde bir yanıt döndürecektir.

Fonksiyonla, sub’ların tanımlamaları olduğu gibi, çağrılmaları da ufak değişikliklerle oluyor.

Eskiden btn20to30_Click sub’ı içinde AsallariListele sub’ımızı şöyle çağırıyorduk: AsallariListele(20, 30)

AsallariListele bir fonksiyon haline gelince, yine eski işlerini yapmaya devam ediyor. Ama artık bir de bize yanıt döndürüyor. Bu durumda çağırma kodumuz da şöyle değişti: If AsallariListele(20, 30) = True Then MsgBox(“İşlem tamamlandı.”)

Yani AsallariListele fonksiyonumuz bize TRUE yanıtını verirse mesajda “İşlem Tamamlandı” yazacağız. TRUE yanıtı dönmezse herhangi bir işlem yapmayacağız.

 

Günümüzdeki bütün programlama dillerinde artık fonksiyon ve sub’lar büyük yer kaplamakta. Bunları kullanmadan program yazmanın (en azından fiili anlamda) mümkün olmadığını söyleyebiliriz. Ayrıca bunları sadece kendimizin yazması gerekmez. Başkalarının yazdığı sub ve fonksiyonları da programlarımızda kullanıyoruz. Modern programlama dillerinin hemen her satırında bir fonksiyon veya sub çağırıyoruz. Bunu bazen kendimiz yazmış oluyoruz, bazen programlama dilini yazıp hazır olarak bize sunmuş oluyor, bazen de 3. bir kişinin yazdığı fonksiyonları programlarımızda kullanıyoruz.

Örneğin yukarıdaki programda sadece ASALLARILISTELE ismiyle bizim yazdığımız bir fonksiyon kullanılmıyor. 32. satırdaki “SMALL = InputBox(“Kucuk sayiyi girin”)” kodunda kullanılan INPUTBOX da bir fonksiyon. Fakat o fonksiyonu biz yazmadık. Tamamen VB.net programcıları tarafından yazılmış ve bizim kullanımımıza sunulmuş bir fonksiyon. Ekranda bir “yazı giriş kutusu” açılmasını sağlıyor ve içine yazılan yazıyı bize YANIT olarak dönderiyor. Her dilde farklı farklı yüzlerce bunun gibi fonksiyon bulunur.

Veya 8. satırdaki ListBox1.Items.Clear() kodu da bir sub’ı çağırıyor. Sub’ı biz yazmadık. Visual Basic.Net’i yazan programcılar Listbox diye bir class oluşturmuşlar, altına Items diye bir class oluşturmuşlar. Onun altına da CLEAR ismiyle bir SUB yazmışlar. Biz, kendi yazmadığımız bu sub’ı istediğimiz zaman çağırıp kullanabiliyoruz.

Yani her dilde, içine yerleşik olarak veya farklı kütüphanelerle gelen yüzlerce fonksiyon ve sub var. Bunlar dile göre değişiyor. O yüzden burada girmeyeceğim. Her dil için ayrı bir yazı yazmak gerekli, bunları incelemek için. İleride bunu yazacağım.

Bu yazıda incelediğimiz fonkisyon, sub gibi alt kod bloklara her dilde farklı isimler verilmekte. Method, procedure, function gibi bir çok ismi var. Ben bunlar için artık “yordam” ifadesini kullanacağım. Yukarıdaki sub ve function gibi kod bloklarına blog’un içinde artık yordam ismiyle sesleneceğiz.

One thought on “Alt Programlar, Fonksiyonlar, Prosedürler

Bir Cevap Yazın

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