5. İşlevler ve prosedürler
5.1. VBScript'in önceden tanımlanmış işlevleri
Bir dilin zenginliği büyük ölçüde işlev kütüphanesinden kaynaklanır; bu işlevler, yöntemler adı altında nesneler içinde kapsüllenebilir. Bu açıdan bakıldığında, VBScript'in oldukça sınırlı olduğu söylenebilir.
Aşağıdaki tablo, VBScript'in nesne dışı işlevlerini tanımlamaktadır. Bunları ayrıntılı olarak ele almayacağız. İşlevlerin adları genellikle işlevlerinin ne olduğunu gösterir. Okuyucu, belirli bir işlev hakkında ayrıntılı bilgi almak için belgelere başvurabilir.
Abs | Array | Asc | Atn |
CBool | CByte | CCur | CDate |
CDbl | Chr | CInt | CLng |
Dönüştürmeler | Cos | CreateObject | CSng |
Tarih | DateAdd | DateDiff | DatePart |
DateSerial | DateValue | Gün | Türetilmiş Matematik |
Değerlendirme | Exp | Filtre | FormatCurrency |
FormatDateTime | FormatNumber | FormatPercent | GetLocale |
GetObject | GetRef | Hex | Saat |
InputBox | InStr | InStrRev | Uluslararası, Sabit |
IsArray | IsDate | IsEmpty | IsNull |
IsNumeric | IsObject | Katıl | LBound |
LCase | Sol | Len | LoadPicture |
Günlük | LTrim; RTrim; ve Trims | Matematik | Orta |
Dakika | Ay | MonthName | MsgBox |
Şimdi | Ekim | Değiştir | RGB |
Sağ | Rnd | Yuvarlak | ScriptEngine |
ScriptEngineBuildVersion | ScriptEngineMajorVersion | ScriptEngineMinorVersion | İkinci |
SetLocale | İmza | Sin | Boşluk |
Split | Sqr | StrComp | String |
Tan | Zaman | Zamanlayıcı | TimeSerial |
TimeValue | TypeName | UBound | UCase |
VarType | Hafta içi | WeekdayName | Yıl |
5.2. Modüler programlama
Bir sorunun programlanmış çözümünü tanımlamak, bilgisayar tarafından yürütülebilen ve sorunu çözebilen temel eylemler dizisini tanımlamaktır. Dillere göre bu temel işlemler az ya da çok karmaşıktır. Örneğin şunlar sayılabilir:
- klavyeden veya diskten veri okumak
- ekrana, yazıcıya, diske vb. bir veri yazmak
- ifadeleri hesaplamak
- bir dosyada gezinmek
- ...
Karmaşık bir problemi tanımlamak, bu temel komutlardan binlerce ve hatta daha fazlasını gerektirebilir. Bu durumda, insan zihninin bir programın genel görünümünü kavraması çok zordur. Sorunu bir bütün olarak kavramadaki bu zorluk karşısında, sorunu çözmesi daha kolay olan alt sorunlara ayırırız. Şu sorunu ele alalım: Klavyeden girilen sayısal değerlerden oluşan bir listeyi sıralamak ve sıralanmış listeyi ekranda görüntülemek.
İlk olarak çözümü şu şekilde tanımlayabiliriz:
début
lire les valeurs et les mettre dans un tableau T
trier le tableau T
écrire les valeurs triées du tableau T à l'écran
fin
Sorunu, çözülmesi daha kolay olan 3 alt soruna ayırdık. Algoritmik yazım genellikle öncekinden daha biçimseldir ve algoritma şu şekilde yazılacaktır:
burada T bir diziyi temsil eder. İşlemler
işlemleri, temel olmayan işlemlerdir ve bunlar da sırayla temel işlemlerle tanımlanmalıdır. Bu, modüller olarak adlandırılan yapılar içinde gerçekleştirilir. T verisi, modülün parametresi olarak adlandırılır. Bu, çağıran programın çağrılan modüle ilettiği (giriş parametresi) veya çağrılan modülden aldığı (çıkış parametresi) bilgidir. Dolayısıyla, bir modülün parametreleri, çağıran program ile çağrılan modül arasında alışverişi yapılan bilgilerdir.
lire_tableau(T) modülü | ![]() |
trier_tableau(T) modülü | ![]() |
écrire_tableau(T) modülü | ![]() |
lire_tableau(T) modülü şu şekilde tanımlanabilir:
début
écrire "Tapez la suite de valeurs à trier sous la forme val1 val2 ... : "
lire valeurs
construire tableau T à partir de la chaîne valeurs
fin
Burada, lire_tableau modülünü yeterince açıklamış olduk. Nitekim, gerekli olan üç eylem VBScript'te doğrudan karşılık bulmaktadır. Sonuncusu ise split işlevinin kullanılmasını gerektirecektir. VBScript'te bu işlev olmasaydı, 3. eylem de VBScript'te doğrudan karşılık bulan temel eylemlere ayrıştırılmak zorunda kalınırdı.
écrire_tableau(T) modülü şu şekilde açıklanabilir:
début
construire chaîne texte "valeur1,valeur2,...." à partir du tableau T
écrire texte
fin
écrire_tableau(T) modülü şu şekilde tanımlanabilir (T elemanlarının indekslerinin 0'dan başladığı varsayılır):
début
N<-- indice dernier élément du tableau T
pour IFIN variant de N à 1
faire
//, T kümesindeki en büyük elemanın indeksi IMAX aranıyor
// IFIN, T'nin son elemanının indeksidir
chercher_max(T, IFIN, IMAX)
// T'nin en büyük elemanı ile T'nin son elemanı yer değiştirilir
échanger (T, IMAX, IFIN)
finfaire
FIN
Burada algoritma yine temel olmayan eylemler kullanıyor:
. chercher_max(T, IFIN, IMAX)
. échanger(T, IMAX, IFIN)
chercher_max(T, IFIN, IMAX), son elemanının indeksi IFIN olan T dizisinin en büyük elemanının indeksini IMAX olarak belirler.
![]() |
değiştir(T, IMAX, IFIN) işlevi, T dizisinin IMAX ve IFIN indeksli iki elemanını değiştirir.
![]() |
Bu nedenle, yeni temel olmayan işlemleri tanımlamak gerekir.
chercher_max modülü(A, IFIN, IMAX) | |
değişim modülü (T IMAX, IFIN) |
Başlangıçtaki problem, temel VBScript işlemleri kullanılarak tam olarak tanımlanmıştır ve bu nedenle artık bu dile çevrilebilir. Temel işlemlerin dilden dile farklılık gösterebileceği ve bu nedenle bir sorunun analizinde belirli bir noktada kullanılan programlama dilinin dikkate alınması gerektiği unutulmamalıdır. Bir dilde var olan bir nesne, başka bir dilde olmayabilir ve bu durum kullanılan algoritmayı değiştirebilir. Dolayısıyla, bir dilde sıralama işlevi varsa, bunu kullanmamak mantıksız olur.
Burada uygulanan ilke, “aşağıdan yukarıya analiz” olarak adlandırılan ilkedir. Çözümün iskeletini gösterirsek, şu şekilde olur:
![]() |
Bir ağaç yapısı söz konusudur.
5.3. VBScript işlevleri ve yordamları
Modüler analiz tamamlandıktan sonra, programcı algoritmasının modüllerini fonctions veya procédures VBScript'e çevirebilir. Hem fonctions hem de procédures işlevleri giriş/çıkış parametrelerini kabul eder; ancak fonction, ifadelerde kullanılabilmesini sağlayan bir sonuç döndürürken, procédure böyle bir sonuç döndürmez.
5.3.1. VBScript işlev ve yordamlarının tanımlanması
Bir VBScript yordamının bildirimi şu şekildedir
ve bir fonksiyonun bildirimi ise
Sonucunu döndürmek için, fonksiyonun sonucunu fonksiyonun adını taşıyan bir değişkene atayan bir atama ifadesi içermesi gerekir:
fonksiyonAdı=sonuç
Bir fonksiyonun veya prosedürün yürütülmesi iki şekilde sona erer:
- fonksiyon sonu (end function) veya prosedür sonu (end sub) komutuna ulaşıldığında
- fonksiyon çıkış (exit function) veya prosedür çıkış (exit sub) komutuna ulaşıldığında
İşlev söz konusu olduğunda, işlevin end function veya exit function ile sona ermeden önce sonucun işlevin adını taşıyan bir değişkene atanmış olması gerektiğini unutmayalım.
5.3.2. Bir fonksiyon veya prosedürün parametrelerinin aktarım yöntemleri
Bir fonksiyon veya prosedürün giriş-çıkış parametrelerinin tanımlanmasında, çağıran programdan çağrılan programa parametrenin aktarım şekli (byRef, byVal) belirtilir:
sub nomProcédure([Byref/Byval] param1, [Byref/Byval] param2, ...)
function nomFonction([Byref/Byval] param1, [Byref/Byval] param2, ...)
byRef veya byVal aktarım modu belirtilmediğinde, byRef modu kullanılır.
Etkili parametreler, biçimsel parametreler
Şu şekilde tanımlanmış bir VBScript fonksiyonu düşünelim:
İşlev veya yordam tanımında kullanılan parmamFormi parametreleri, biçimsel parametreler olarak adlandırılır. Yukarıdaki işlev, ana programdan veya başka bir modülden şu tür bir komutla çağrılabilir:
İşlev veya yordam çağrısında kullanılan parmamEffi parametrelerine etkin parametreler denir. nomFonction işlevinin yürütülmesi başladığında, biçimsel parametreler karşılık gelen etkin parametrelerin değerlerini alır. byRef ve byVal anahtar sözcükleri, bu değerlerin aktarım şeklini belirler.
Değerle aktarım modu (byVal)
Bir biçimsel parametre bu aktarım modunu belirtirse, biçimsel parametre ile gerçek parametre iki farklı değişken olur. Gerçek parametrenin değeri, fonksiyon veya prosedür çalıştırılmadan önce biçimsel parametreye kopyalanır. Fonksiyon veya prosedür, yürütme sırasında biçimsel parametrenin değerini değiştirirse, bu durum ilgili gerçek parametrenin değerini hiçbir şekilde etkilemez. Bu aktarım modu, fonksiyon veya prosedürün giriş parametreleri için oldukça uygundur.
![]() |
Referansla aktarım yöntemi (byRef)
Bu aktarım türü, herhangi bir parametre aktarım türü belirtilmediğinde varsayılan moddur. Bir biçimsel parametre bu aktarım türünü belirtirse, biçimsel parametre ile karşılık gelen etkin parametre tek ve aynı değişkendir. Dolayısıyla, işlev biçimsel parametreyi değiştirirse, etkin parametre de değiştirilir. Bu aktarım türü şunlar için uygundur:
- çıkış parametreleri için, çünkü bunların değeri çağıran programa aktarılmalıdır
- tablolar gibi yeniden yazılması zahmetli olan giriş parametreleri
![]() |
Aşağıdaki program, parametre aktarımına ilişkin örnekler göstermektedir:
Program |
|
Sonuçlar |
Yorumlar
- Bir VBScript betiğinde, işlevler ve yordamlar için belirli bir yer yoktur. Bunlar kaynak metnin herhangi bir yerinde bulunabilir. Genellikle, bunlar betiğin başına veya sonuna toplanır ve ana programın kesintisiz bir blok oluşturması sağlanır.
5.3.3. İşlev ve prosedür çağırma sözdizimi
pf1, pf2, ... gibi biçimsel parametreleri kabul eden p adlı bir yordam olduğunu varsayalım
- p yordamının çağrılması şu şekilde yapılır
şeklinde yapılır; parametrelerin etrafında parantez yoktur
- p yordamı hiçbir parametre almıyorsa, p veya p() çağrısı ile sub p veya sub p() bildirimi arasında fark yoktur
pf1, pf2, ... gibi biçimsel parametreleri kabul eden f fonksiyonu olsun
- f işlevinin çağrılması şu şekilde yapılır
Parametrelerin etrafındaki parantezler zorunludur. f fonksiyonu hiçbir parametre almıyorsa, f veya f() çağrısı ile function f veya function f() bildirimi arasında bir fark yoktur.
- f işlevinin sonucu, çağıran program tarafından göz ardı edilebilir. Bu durumda f işlevi bir yordam olarak kabul edilir ve yordam çağırma kurallarına uyar. Bu durumda f işlevini çağırmak için f pe1, pe2, ... (parantezsiz) şeklinde yazılır.
İşlev veya yordam bir nesne yöntemi ise, kurallar biraz farklı ve tutarsız gibi görünmektedir.
- Örneğin, MyFile.WriteLine "Bu bir testtir." veya MyFile.WriteLine("Bu bir testtir.") yazılabilir
- ancak wscript.echo 4 yazılabilse de, wscript.echo(4) yazılamaz.
Aşağıdaki kurallara uyulacaktır:
- prosedür veya prosedür olarak kullanılan bir fonksiyonun parametrelerinin etrafına parantez konulmayacaktır
- fonksiyon parametrelerinin etrafında parantez kullanılacaktır
5.3.4. Bazı fonksiyon örnekleri
Aşağıda fonksiyon tanımları ve kullanımlarına ilişkin birkaç örnek verilmiştir:
Program |
|
Sonuçlar |
Yorumlar
- rendUnTableau işlevi, bir işlevin tek bir sonuç değil, birden fazla sonuç verebileceğini gösterir. Bunun için sonuçları bir dizi değişkenine yerleştirmek ve bu değişkeni sonuç olarak döndürmek yeterlidir.
- Tersine, argumentsVariables işlevi, değişken sayıda argüman kabul eden bir işlev yazılabileceğini gösterir. Burada da argümanları bir dizi değişkenine yerleştirmek ve bu değişkeni işlevin bir parametresi yapmak yeterlidir.
5.3.5. Çıkış parametresi veya bir fonksiyonun sonucu
Bir uygulamanın analizinin, Ei giriş parametreleri ve Sj çıkış parametreleri olan bir M modülüne ihtiyaç olduğunu gösterdiğini varsayalım. Giriş parametrelerinin, çağıran programın çağrılan programa verdiği bilgiler olduğunu ve tersine, çıkış parametrelerinin ise çağrılan programın çağıran programa verdiği bilgiler olduğunu hatırlayalım. VBScript'te çıkış parametreleri için birkaç çözüm vardır:
- Tek bir çıkış parametresi varsa, bunu bir fonksiyonun sonucu olarak kullanabiliriz. Bu durumda artık bir çıkış parametresi yoktur, sadece bir fonksiyon sonucu vardır.
- n adet çıkış parametresi varsa, bunlardan biri fonksiyon sonucu olarak kullanılabilir; geri kalan n-1 tanesi ise çıkış parametresi olarak kalır. Ayrıca fonksiyon kullanmak yerine n adet çıkış parametresine sahip bir yordam da kullanılabilir. Çağıran programa döndürülecek n değeri içeren bir dizi döndüren bir fonksiyon da kullanılabilir. Çağırılan programın, sonuçlarını çağıran programa değer kopyalama yoluyla döndürdüğünü hatırlayalım. Referans yoluyla aktarılan çıkış parametreleri durumunda bu kopyalama işlemi önlenir. Dolayısıyla bu son çözümde zaman tasarrufu sağlanır.
5.4. Değerleri sıralayan Vbscript programı
Modüler programlama konusuna, klavyeden girilen sayısal değerlerin sıralanmasına ilişkin algoritmik incelemeyle başlamıştık. İşte bunun VBScript diline çevirisi:
Yorumlar:
- İlk algoritmada tespit edilen échanger modülü, ayrı bir modül oluşturmak için fazla basit olduğu düşünülerek burada VBScript modülü haline getirilmemiştir.
5.5. Modüler biçimdeki IMPOTS programı
Vergi hesaplama programını bu kez modüler biçimde yeniden ele alıyoruz
Açıklamalar
- getArguments işlevi, vergi mükellefinin bilgilerini (eş, çocuklar, maaş) almayı sağlar. Burada bu bilgiler, VBScript programına argüman olarak aktarılır. Bu durum değişirse, örneğin bu argümanlar bir grafik arayüzden gelirse, yalnızca getArguments yordamı yeniden yazılmalıdır, diğerleri değil.
- getArguments işlevi, argümanlardaki hataları tespit edebilir. Böyle bir durum meydana geldiğinde, getArguments işlevinde bir wscript.quit komutu kullanılarak programın yürütülmesinin durdurulmasına karar verilebilirdi. Ancak bu, hiçbir işlev veya prosedür içinde yapılmamalıdır. Bir işlev veya yordam bir hata tespit ederse, bunu bir şekilde çağıran programa bildirmelidir. Yürütmeyi durdurup durdurmama kararı, yordama değil, çağıran programa aittir. Örneğimizde, çağıran program, yürütmeyi durdurmak yerine kullanıcıdan hatalı veriyi klavyeden yeniden girmesini isteyebilir.
- Burada, getArguments işlevi, ilk elemanı bir hata kodu (hata yoksa 0) ve ikinci elemanı ise hata olması durumunda bir hata mesajı olan bir dizi varyantı döndürür. Elde edilen sonucu test ederek, çağıran program bir hata olup olmadığını öğrenebilir.
- getData yordamı, vergi hesaplaması için gerekli verileri elde etmeyi sağlar. Burada bu veriler doğrudan getData prosedüründe tanımlanmıştır. Bu verilerin başka bir kaynaktan, örneğin bir dosyadan veya veritabanından alınması gerekiyorsa, yalnızca getData prosedürü yeniden yazılmalı, diğerleri değil.
- calculerImpot işlevi, verilerin nasıl elde edildiğine bakılmaksızın tüm veriler elde edildikten sonra verginin hesaplanmasını sağlar.
- Dolayısıyla, modüler bir kodlama yapısının belirli modüllerin farklı bağlamlarda (yeniden) kullanılmasına olanak sağladığı unutulmamalıdır. Bu kavram, son yirmi yıl içinde nesne yönelimli programlama kavramı çerçevesinde büyük ölçüde geliştirilmiştir.







