Skip to content

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:

   début
         lire_tableau(T)
         trier_tableau(T)
         écrire_tableau(T)
   fin

burada T bir diziyi temsil eder. İşlemler

    . lire_tableau(T)
    . trier_tableau(T)
    . écrire_tableau(T)

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)
   début
        IMAX<--0

        pour i variant de 1 à IFIN
        faire
           si T[i]>T[IMAX] alors 
             début
                IMAX<--i
             fin
        finfaire
    fin
değişim modülü (T IMAX, IFIN)
  début
       temp<----T[IMAX]
       T[IMAX]<---T[IFIN]
       T[IFIN]<---temp
  fin

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

sub nomProcédure([Byref/Byval] param1, [Byref/Byval] param2, ...)
    instructions
end sub

ve bir fonksiyonun bildirimi ise

function nomFonction([Byref/Byval] param1, [Byref/Byval] param2, ...)
    instructions
end sub

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:

  1. fonksiyon sonu (end function) veya prosedür sonu (end sub) komutuna ulaşıldığında
  2. 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:

function nomFonction([Byref/Byval] paramForm1, [Byref/Byval] paramForm2, ...)
...
end function

İş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:

résultat=nomFonction(paramEff1, paramEff2, ...)

İş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

Sub proc1(byval i, ByRef j, k)
  ' i değer olarak aktarılır (byval) – bu durumda gerçek parametre ile biçimsel parametre farklıdır
  ' j, değer olarak aktarılır (byref) — bu durumda gerçek parametre ile biçimsel parametre aynıdır
  ' k'nın aktarım modu belirtilmemiştir. Varsayılan olarak, referans yoluyla aktarılır
  i=i+1
  j=j+1
  k=k+1
  affiche "dans proc1",i,j,k
End Sub

 Sub affiche(byval msg, ByVal i, ByVal j, ByVal k)
  ' i, j ve k değerlerini görüntüler
  wscript.echo msg & " i=" & i & " j=" & j & " k=" & k
End Sub


' ------------- işlev ve yordam çağrıları

' i ve j'yi başlatır
  i=4:j=5 : k=6

' doğrulama
  affiche "dans programme principal, avant l'appel à proc1 :",i,j,k

' proc1 prosedürünün çağrılması
  proc1 i,j,k

' doğrulama
  affiche "dans programme principal, après l'appel à proc1 :",i,j,k

' son
  wscript.quit 0
Sonuçlar
dans programme principal, avant l'appel à proc1 : i=4 j=5 k=6
dans proc1 i=5 j=6 k=7
dans programme principal, après l'appel à proc1 : i=4 j=6 k=7

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
p pe1, pe2, ...

ş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
résultat=f(pe1, pe2, ...)

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

 Function plusgrandque(byval i, ByVal j)
  ' i>j ise boole değerini true, aksi takdirde false olarak döndürür

  ' verilerin doğrulanması
  If isnumeric(i) And isnumeric(j) Then
    If i>j Then
      plusgrandque=true
    Else
      plusgrandque=false
    End If
  Else
    wscript.echo "Arguments (" & i & "," & j & ") erronés"
    plusgrandque=false
  End If
  Exit Function
End Function

 Function rendUnTableau(byval n)
  ' n elemanlı bir dizi döndürür
  tableau=array()
  ' n parametresinin geçerliliğini kontrol eder
  If isnumeric(n) And n>=1 Then
    ReDim Preserve tableau(n)
    For i= 0 To n-1
      tableau(i)=i
    Next
  Else
    wscript.echo "Argument [" & n & "] erroné"
  End If
  ' sonuç döndürülür
  rendUnTableau=tableau
End Function

 Function argumentsVariables(byref arguments)
  ' argümanlar, toplamı döndürülen bir sayı dizisidir
  somme=0
  For i=0 To ubound(arguments)
    somme=somme+arguments(i)
  Next
  argumentsVariables=somme
End Function

  ' iki parametresiz fonksiyon, iki farklı şekilde tanımlanmıştır
  Function sansParametres1
    sansParametres=4
  End Function

  Function sansParametres2()
    sansParametres=4
  End Function

  
' ------------- işlev ve prosedür çağrıları

' "plusgrandque" işlevine çağrılar
  wscript.echo "plusgrandque(10,6)=" & plusgrandque(10,6)
  wscript.echo "plusgrandque(6,10)=" & plusgrandque(6,10)
  wscript.echo "plusgrandque(6,6)=" & plusgrandque(6,6)
  wscript.echo "plusgrandque(6,'a')=" & plusgrandque(6,"a")

' rendUnTableau işlevine çağrılar
  monTableau=rendUnTableau(10)
  For i=0 To ubound(monTableau)
    wscript.echo monTableau(i)
  Next
  monTableau=rendUnTableau(-6)
  For i=0 To ubound(monTableau)
    wscript.echo monTableau(i)
  Next

' argumentsVariables işlevine çağrılar
  wscript.echo "somme=" & argumentsVariables(array(-1,2,7,8))
  wscript.echo "somme=" & argumentsVariables(array(-1,10,12))

' parametresiz işlev çağrıları
  res=sansParametres1
  res=sansParametres1()
  sansParametres1
  sansParametres1()

  res=sansParametres2
  res=sansParametres2()
  sansParametres2
  sansParametres2()

' son
  wscript.quit 0
Sonuçlar
plusgrandque(10,6)=Vrai
plusgrandque(6,10)=Faux
plusgrandque(6,6)=Faux
Arguments (6,a) erronés
plusgrandque(6,'a')=Faux
0
1
2
3
4
5
6
7
8
9

Argument [-6] erroné
somme=16
somme=21
somme=10

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:

Program
' ana program
Option Explicit

Dim T        ' le tableau de valeurs à trier

' değerlerin okunması
T=lire_tableau

' değerlerin sıralanması
trier_tableau T

' sıralanmış değerlerin görüntülenmesi
ecrire_tableau T

' son
wscript.quit 0

' ---------- işlevler ve prosedürler

' -------- lire_tableau
Function lire_tableau
    ' değerler isteniyor
    wscript.stdout.write "Tapez les valeurs à trier sous la forme val1 val2  ... valn : "
    ' değerler okunur
    Dim valeurs
    valeurs=wscript.stdin.readLine
    ' değerler bir tabloya ekleniyor
    lire_tableau=split(valeurs," ")
End Function

' -------- ecrire_tableau
Sub ecrire_tableau(byref T)
    ' T dizisinin içeriğini görüntüler
    wscript.echo join(T," ")
End Sub

' -------- trier_tableau
Sub trier_tableau (byref T)
    ' T tablosunu artan sırada sıralar

    ' T dizisinin imax indeksini arar[0..ifin]
    ' T[imax]'i T[0..ifin] dizisinin son elemanıyla değiştir
    ' ardından, bir eleman daha az olan bir diziyle aynı işlemi tekrarlıyoruz

    Dim ifin, imax, temp
    For ifin=ubound(T) To 1 Step -1
        ' T[0..ifin] dizisinin imax indeksini arıyoruz
        imax=chercher_max(T,ifin)
        ' max değerini T[0..ifin] dizisinin son elemanıyla değiştiriyoruz
        temp=T(ifin):T(ifin)=T(imax):T(imax)=temp
    Next
End Sub

' -------- chercher_max
Function chercher_max(byRef T, ByVal ifin)
    ' T[0..ifin] dizisinin imax indeksini arıyoruz
    Dim i, imax
    imax=0
    For i=1 To ifin
        If cdbl(T(i))>cdbl(T(imax)) Then imax=i
    Next

    ' Sonuç veriliyor
    chercher_max=imax    
End Function
Sonuçlar
Tapez les valeurs à trier sous la forme val1 val2  ... valn : 10 9 8 7 6 1
1 6 7 8 9 10

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

Program
' bir vergi mükellefinin vergisi hesaplanıyor
' program üç parametreyle çağrılmalıdır: evli, çocuk sayısı, maaş
' evli: evliyse O, evli değilse N karakteri
' çocuklar: çocuk sayısı
' maaş: sentler hariç yıllık maaş

' değişkenlerin zorunlu bildirilmesi
Option Explicit
Dim erreur

' argümanlar, geçerlilikleri kontrol edilerek alınır
Dim marie, enfants, salaire
erreur=getArguments(marie,enfants,salaire)
' hata mı?
If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0)

' vergi hesaplaması için gerekli veriler alınır
Dim limites, coeffR, coeffN
getData limites,coeffR,coeffN

' sonuç görüntülenir
wscript.echo "impôt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN)

' hata olmadan çıkılır
wscript.quit 0

' ------------ işlevler ve prosedürler

' ----------- getArguments
Function getArguments(byref marie, ByRef enfants, ByRef salaire)
    ' ana programa argüman olarak geçirilen üç değeri almalıdır
    ' bir argüman, önüne ve arkasına boşluk eklenmeden programa aktarılır
    ' verilerin geçerliliğini kontrol etmek için düzenli ifadeler kullanılacak

    ' 2 değerli bir hata dizisi varyantı döndürür
    ' hata(0): hata kodu; hata yoksa 0
    ' hata(1): hata varsa hata mesajı, yoksa boş dize

    Dim syntaxe
    syntaxe= _
    "Syntaxe : pg marié enfants salaire" & vbCRLF & _
    "marié : caractère O si marié, N si non marié" & vbCRLF & _
    "enfants : nombre d'enfants (entier >=0)" & vbCRLF & _
    "salaire : salaire annuel sans les centimes (entier >=0)"

    ' 3 argüman olup olmadığı kontrol edilir
    Dim nbArguments
    nbArguments=wscript.arguments.count
    If nbArguments<>3 Then
        ' hata mesajı
        getArguments= array(1,syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments incorrect")
        ' son
        Exit Function
    End If

    Dim modele, correspondances
    Set modele=new regexp

    ' medeni durum, karakterler arasında olmalıdır oOnN
    modele.pattern="^[oOnN]$"
    Set correspondances=modele.execute(wscript.arguments(0))
    If correspondances.count=0 Then
        ' hata mesajı
        getArguments=array(2,syntaxe & vbCRLF & vbCRLF & "erreur : argument marie incorrect")
        ' çıkılıyor
        Exit Function
    End If
    ' değeri alınıyor
    If lcase(wscript.arguments(0)) = "o"Then
        marie=true
    Else
        marie=false
    End If

    ' çocuk sayısı 0'dan büyük bir tamsayı olmalıdır
    modele.pattern="^\d{1,2}$"
    Set correspondances=modele.execute(wscript.arguments(1))
    If correspondances.count=0 Then
        ' hata
        getArguments= array(3,syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants incorrect")
        ' çıkılıyor
        Exit Function
    End If
    ' değeri alınıyor
    enfants=cint(wscript.arguments(1))

    ' maaş, 0'dan büyük bir tamsayı olmalıdır
    modele.pattern="^\d{1,9}$"
    Set correspondances=modele.execute(wscript.arguments(2))
    If correspondances.count=0 Then
        ' hata
        getArguments= array(4,syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire incorrect")
        ' çıkılıyor
        Exit Function
    End If
    ' değer alınır
    salaire=clng(wscript.arguments(2))

    ' hata olmadan tamamlandı
    getArguments=array(0,"")
End Function

' ----------- getData
Sub getData(byref limites, ByRef coeffR, ByRef coeffN)  
    ' vergi hesaplaması için gerekli verileri 3 tabloya giriyoruz
    limites=array(12620,13190,15640,24740,31810,39970,48360, _
    55790,92970,127860,151250,172040,195000,0)
    coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _
    0.5,0.55,0.6,0.65)
    coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _
    12106,16754.5,23147.5,30710,39312,49062)
End Sub

' ----------- calculerImpot
Function calculerImpot(byval marie,ByVal enfants,ByVal salaire, ByRef limites, ByRef coeffR, ByRef coeffN)

    ' pay sayısı hesaplanır
    Dim nbParts
    If marie=true Then
        nbParts=(enfants/2)+2
    Else
        nbParts=(enfants/2)+1
    End If
    If enfants>=3 Then nbParts=nbParts+0.5

    ' aile katsayısı ve vergilendirilebilir gelir hesaplanır
    Dim revenu, qf
    revenu=0.72*salaire
    qf=revenu/nbParts

    ' vergi hesaplanır
    Dim i, impot
    i=0
    Do While i<ubound(limites) And qf>limites(i)
        i=i+1
    Loop
    calculerImpot=int(revenu*coeffr(i)-nbParts*coeffn(i))
End Function

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.