Skip to content

5. Функції та процедури

5.1. Вбудовані функції VBScript

Багатство мови значною мірою залежить від її бібліотеки функцій, які можуть бути інкапсульовані в об’єкти під назвою методів. З цієї точки зору можна вважати, що VBScript є досить бідним.

У наступній таблиці наведено функції VBScript, що не входять до об’єктів. Ми не будемо їх детально описувати. Зазвичай їхні назви вказують на їхнє призначення. Для отримання детальної інформації про конкретну функцію читач може звернутися до документації.

Abs
Array
Asc
Atn
CBool
CByte
CCur
CDate
CDbl
Chr
CInt
CLng
Перетворення
Cos
CreateObject
CSng
Дата
DateAdd
DateDiff
DatePart
DateSerial
DateValue
День
Похідні математичні дисципліни
Оцінка
Експ
Фільтр
FormatCurrency
FormatDateTime
FormatNumber
FormatPercent
GetLocale
GetObject
GetRef
Шістнадцятковий
Година
InputBox
InStr
InStrRev
Інтервал, Фіксований
IsArray
IsDate
IsEmpty
IsNull
IsNumeric
IsObject
Приєднатися
LBound
LCase
Ліворуч
Len
LoadPicture
Log
LTrim; RTrim; та обрізки
Математика
Середня
Хвилина
Місяць
MonthName
MsgBox
Зараз
Жовтень
Замінити
RGB
Праворуч
Rnd
Round
ScriptEngine
ScriptEngineBuildVersion
ScriptEngineMajorVersion
ScriptEngineMinorVersion
Другий
SetLocale
Підпис
Sin
Пробіл
Спліт
Sqr
StrComp
String
Тан
Час
Таймер
TimeSerial
TimeValue
TypeName
UBound
UCase
VarType
День тижня
WeekdayName
Рік

5.2. Модульне програмування

Описати запрограмоване рішення задачі — це описати послідовність елементарних дій, які може виконати комп'ютер і які здатні вирішити задачу. Залежно від мови програмування ці елементарні операції є більш-менш складними. Наприклад, серед них є:

  • зчитування даних з клавіатури або з диска
  • запис даних на екран, на принтер, на диск тощо
  • обчислення виразів
  • переміщення по файлу
  • ...

Опис складної задачі може вимагати кількох тисяч таких елементарних інструкцій і навіть більше. У такому разі людському розуму дуже важко охопити програму в цілому. З огляду на цю складність у сприйнятті проблеми в цілому, її розкладають на підпроблеми, які простіше вирішити. Розглянемо таку задачу: відсортувати список числових значень, введених з клавіатури, та вивести відсортований список на екран.

Спочатку можна описати рішення у такій формі:

  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

Ми розклали задачу на 3 підзадачі, які простіше вирішити. Алгоритмічний запис часто є більш формалізованим, ніж попередній, і алгоритм буде виглядати приблизно так:

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

де T — масив. Операції

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

є неелементарними операціями, які, у свою чергу, мають бути описані за допомогою елементарних операцій. Це здійснюється в так званих модулях. Дані T називаються параметрами модуля. Це інформація, яку програма-викликач передає модулю, що викликається (вхідний параметр), або отримує від нього (вихідний параметр). Отже, параметри модуля — це інформація, яка обмінюється між програмою-викликом та модулем, що викликається.

модуль lire_tableau(T)
модуль trier_tableau(T)
модуль écrire_tableau(T)

Модуль lire_tableau(T) можна описати наступним чином:


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

Тут ми достатньо докладно описали модуль lire_tableau. Дійсно, три необхідні дії мають безпосередній відповідник у VBScript. Остання дія вимагатиме використання функції split. Якби у VBScript не було цієї функції, дію 3 довелося б, у свою чергу, розкласти на елементарні дії, що мають безпосередній відповідник у VBScript.

Модуль écrire_tableau(T) можна описати так:


début
    construire chaîne texte "valeur1,valeur2,...." à partir du tableau T
    écrire texte
fin

Модуль écrire_tableau(T) можна описати наступним чином (припускаємо, що індекси елементів T починаються з 0):

début
      N<-- indice dernier élément du tableau T
      pour IFIN variant de N à 1
      faire
           //шукаємо індекс IMAX найбільшого елемента T
           // IFIN — індекс останнього елемента T

          chercher_max(T, IFIN, IMAX) 

           // обмінюємо найбільший елемент T з останнім елементом T

          échanger (T, IMAX, IFIN)

      finfaire
FIN

Тут алгоритм знову використовує не елементарні дії:


 . chercher_max(T, IFIN, IMAX)
 . échanger(T, IMAX, IFIN)

chercher_max(T, IFIN, IMAX) повертає індекс IMAX найбільшого елемента масиву T, індекс останнього елемента якого дорівнює IFIN.

обміняти(T, IMAX, IFIN) обмінює 2 елементи масиву T — ті, що мають індекси IMAX та IFIN.

Отже, необхідно описати нові неелементарні операції.

модуль chercher_max(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
модуль обміну (T IMAX, IFIN)
  début
       temp<----T[IMAX]
       T[IMAX]<---T[IFIN]
       T[IFIN]<---temp
  fin

Початкова задача була повністю описана за допомогою елементарних операцій VBScript і тепер може бути переведена на цю мову. Слід зауважити, що елементарні дії можуть відрізнятися від однієї мови до іншої, а отже, аналіз задачі в певний момент повинен враховувати мову програмування, що використовується. Об’єкт, який існує в одній мові, може не існувати в іншій, що, відповідно, змінює використовуваний алгоритм. Так, якщо в мові є функція сортування, було б безглуздо не використовувати її в даному випадку.

Принцип, що застосовується тут, називається «низхідним аналізом». Якщо зобразити основу рішення, отримаємо таке:

Ми маємо деревоподібну структуру.

5.3. Функції та процедури VBScript

Після проведення модульного аналізу програміст може перекласти модулі свого алгоритму на VBScript у вигляді fonctions або procédures. fonctions та procédures приймають вхідні/вихідні параметри, але fonction повертає результат, який дозволяє використовувати її у виразах, тоді як procédure такого результату не повертає.

5.3.1. Оголошення функцій та процедур VBScript

Оголошення процедури VBScript має такий вигляд

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

а оголошення функції — таким

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

Щоб повернути результат, функція повинна містити оператор присвоєння результату змінній, що має ім’я функції:

ім'я_функції = результат

Виконання функції або процедури припиняється двома способами:

  1. при зустрічі з оператором закінчення функції (end function) або закінчення процедури (end sub)
  2. при зустрічі з оператором виходу з функції (exit function) або процедури (exit sub)

Щодо функції слід пам’ятати, що результат має бути присвоєно змінній, яка має ім’я функції, до того, як функція завершиться за допомогою end function або exit function.

5.3.2. Способи передачі параметрів функції або процедури

У оголошенні вхідних та вихідних параметрів функції або процедури вказується спосіб (byRef, byVal) передачі параметра від програми-викликувача до програми, що викликається:

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

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

Якщо режим передачі byRef або byVal не вказано, використовується режим byRef.

Фактичні параметри, формальні параметри

Нехай функція VBScript визначається таким чином:

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

Параметри parmamFormi, що використовуються у визначенні функції або процедури, називаються формальними параметрами. Попередню функцію можна викликати з головної програми або іншого модуля за допомогою такої інструкції:

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

Параметри parmamEffi, що використовуються під час виклику функції або процедури, називаються фактичними параметрами. Коли починається виконання функції nomFonction, формальні параметри отримують значення відповідних фактичних параметрів. Ключові слова byRef та byVal визначають режим передачі цих значень.

Режим передачі за значенням (byVal)

Коли формальний параметр вказує цей режим передачі, формальний параметр і фактичний параметр є двома різними змінними. Значення фактичного параметра копіюється у формальний параметр перед виконанням функції або процедури. Якщо функція або процедура змінює значення формального параметра під час виконання, це жодним чином не впливає на значення відповідного фактичного параметра. Цей режим передачі добре підходить для вхідних параметрів функції або процедури.

Спосіб передачі за посиланням (byRef)

Цей режим передачі є режимом за замовчуванням, якщо не вказано жодного режиму передачі параметра. Коли формальний параметр визначає цей режим передачі, формальний параметр і відповідний фактичний параметр є однією й тією самою змінною. Отже, якщо функція змінює формальний параметр, фактичний параметр також змінюється. Цей режим передачі добре підходить:

  • для вихідних параметрів, оскільки їхні значення мають передаватися програмі, що викликає
  • для вхідних параметрів, копіювання яких є трудомістким, наприклад масивів

Наступна програма демонструє приклади передачі параметрів:

Програма

Sub proc1(byval i, ByRef j, k)
  ' i передається за значенням (byval) — фактичний і формальний параметри в цьому випадку відрізняються
  ' j передається за значенням (byref) — фактичний і формальний параметри в цьому випадку збігаються
  ' режим передачі k не вказано. За замовчуванням — за посиланням
  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 та k
  wscript.echo msg & " i=" & i & " j=" & j & " k=" & k
End Sub


' ------------- виклики функцій і процедур

' ініціалізація i та j
  i=4:j=5 : k=6

' перевірка
  affiche "dans programme principal, avant l'appel à proc1 :",i,j,k

' виклик процедури proc1
  proc1 i,j,k

' перевірка
  affiche "dans programme principal, après l'appel à proc1 :",i,j,k

' кінець
  wscript.quit 0
Результати
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

Коментарі

  • У скрипті VBScript немає окремого місця для функцій і процедур. Вони можуть бути розміщені в будь-якому місці вихідного коду. Зазвичай їх групують або на початку, або в кінці, і роблять так, щоб основна програма утворювала суцільний блок.

5.3.3. Синтаксис виклику функцій і процедур

Нехай процедура p приймає формальні параметри pf1, pf2, ...

  • виклик процедури p здійснюється у формі
p pe1, pe2, ...

без дужок навколо параметрів

  • якщо процедура p не приймає жодних параметрів, можна однаково використовувати виклик p або p() та оголошення sub p або sub p()

Нехай функція f приймає формальні параметри pf1, pf2, ...

  • виклик функції f здійснюється у формі
résultat=f(pe1, pe2, ...)

Дужки навколо параметрів є обов’язковими. Якщо функція f не приймає жодних параметрів, можна однаково використовувати виклик f або f() та оголошення function f або function f().

  • Результат функції f може ігноруватися програмою, що її викликає. У такому разі функція f розглядається як процедура і підпорядковується правилам виклику процедур. Тоді для виклику функції f пишуть f pe1, pe2, ... (без дужок).

Якщо функція або процедура є методом об’єкта, то, здається, правила дещо відрізняються і не є однорідними.

  • Так, можна написати MyFile.WriteLine «Це тест.» або MyFile.WriteLine(«Це тест.»)
  • але якщо можна написати wscript.echo 4, то не можна написати wscript.echo(4).

Будемо дотримуватися таких правил:

  • не ставити дужки навколо параметрів процедури або функції, що використовується як процедура
  • дужки навколо параметрів функції

5.3.4. Деякі приклади функцій

Нижче наведено кілька прикладів визначення та використання функцій:

Програма

 Function plusgrandque(byval i, ByVal j)
  ' повертає логічне значення «true», якщо i>j, інакше — «false»

  ' перевірка даних
  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 елементів
  tableau=array()
  ' перевірка правильності параметра n
  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
  ' повертає результат
  rendUnTableau=tableau
End Function

 Function argumentsVariables(byref arguments)
  ' аргументи — це масив чисел, суму яких повертаємо
  somme=0
  For i=0 To ubound(arguments)
    somme=somme+arguments(i)
  Next
  argumentsVariables=somme
End Function

  ' дві функції без аргументів, оголошені двома різними способами
  Function sansParametres1
    sansParametres=4
  End Function

  Function sansParametres2()
    sansParametres=4
  End Function

  
' ------------- виклики функцій і процедур

' виклики функції «більше за»
  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
  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
  wscript.echo "somme=" & argumentsVariables(array(-1,2,7,8))
  wscript.echo "somme=" & argumentsVariables(array(-1,10,12))

' виклики функцій без параметрів
  res=sansParametres1
  res=sansParametres1()
  sansParametres1
  sansParametres1()

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

' кінець
  wscript.quit 0
Результати
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

Коментарі

  • Функція rendUnTableau демонструє, що функція може повертати не один, а кілька результатів. Для цього достатньо розмістити їх у масиві-варіанті та повернути цей варіант як результат.
  • І навпаки, функція argumentsVariables демонструє, що можна написати функцію, яка приймає змінну кількість аргументів. Для цього також достатньо помістити їх у масив-варіант і зробити цей варіант параметром функції.

5.3.5. Вихідний параметр або результат функції

Припустимо, що аналіз програми показав необхідність модуля M із вхідними параметрами Ei та вихідними параметрами Sj. Нагадаємо, що вхідні параметри — це інформація, яку програма-викликач передає програмі-викликаній, а, навпаки, вихідні параметри — це інформація, яку програма-викликана передає програмі-викликачу. У VBScript існує кілька рішень для вихідних параметрів:

  • якщо є лише один вихідний параметр, його можна зробити результатом функції. У цьому випадку вже не існує вихідного параметра, а є лише результат функції.
  • якщо є n вихідних параметрів, один із них може слугувати результатом функції, а інші n-1 залишаються вихідними параметрами. Можна також не використовувати функцію, а процедуру з n вихідними параметрами. Можна також використати функцію, яка поверне масив, у який будуть поміщені n значень, що мають бути повернуті програмі-викликувачу. Нагадаємо, що викликана програма повертає свої результати програмі-викликачу шляхом копіювання значень. У випадку вихідних параметрів, що передаються за посиланням, такого копіювання вдається уникнути. Отже, останній варіант забезпечує економію часу.

5.4. Програма Vbscript для сортування значень

Ми розпочали обговорення модульного програмування з алгоритмічного аналізу сортування числових значень, введених з клавіатури. Ось переклад VBScript, який можна було б для цього використати:

Програма
' головна програма
Option Explicit

Dim T        ' le tableau de valeurs à trier

' зчитування значень
T=lire_tableau

' сортування значень
trier_tableau T

' виведення відсортованих значень
ecrire_tableau T

' кінець
wscript.quit 0

' ---------- функції та процедури

' -------- lire_tableau
Function lire_tableau
    ' запит значень
    wscript.stdout.write "Tapez les valeurs à trier sous la forme val1 val2  ... valn : "
    ' зчитуються
    Dim valeurs
    valeurs=wscript.stdin.readLine
    ' вносимо їх у масив
    lire_tableau=split(valeurs," ")
End Function

' -------- ecrire_tableau
Sub ecrire_tableau(byref T)
    ' виводить вміст масиву T
    wscript.echo join(T," ")
End Sub

' -------- trier_tableau
Sub trier_tableau (byref T)
    ' сортує масив T у порядку зростання

    ' шукаємо індекс imax масиву T[0..ifin]
    ' щоб поміняти T[imax] місцями з останнім елементом масиву T[0..ifin]
    ' потім повторюємо процедуру з масивом, що має на 1 елемент менше

    Dim ifin, imax, temp
    For ifin=ubound(T) To 1 Step -1
        ' знаходимо індекс imax масиву T[0..ifin]
        imax=chercher_max(T,ifin)
        ' обмінюємо max з останнім елементом масиву T[0..ifin]
        temp=T(ifin):T(ifin)=T(imax):T(imax)=temp
    Next
End Sub

' -------- chercher_max
Function chercher_max(byRef T, ByVal ifin)
    ' шукаємо індекс imax масиву T[0..ifin]
    Dim i, imax
    imax=0
    For i=1 To ifin
        If cdbl(T(i))>cdbl(T(imax)) Then imax=i
    Next

    ' Видаємо результат
    chercher_max=imax    
End Function
Результати
Tapez les valeurs à trier sous la forme val1 val2  ... valn : 10 9 8 7 6 1
1 6 7 8 9 10

Коментарі:

  • модуль échanger, який було виявлено в початковому алгоритмі, тут не став предметом модуля на VBScript, оскільки його було визнано занадто простим, щоб виділяти для нього окремий модуль.

5.5. Програма IMPOTS у модульній формі

Ми повертаємося до програми розрахунку податку, написаної цього разу у модульній формі

Програма
' розрахунок податку платника податків
' програму слід запускати з трьома параметрами: одружений, діти, заробітна плата
' одружений: символ O, якщо одружений, N, якщо неодружений
' діти: кількість дітей
' зарплата: річна зарплата без копійок

' обов’язкове оголошення змінних
Option Explicit
Dim erreur

' аргументи отримуються з перевіркою їхньої правильності
Dim marie, enfants, salaire
erreur=getArguments(marie,enfants,salaire)
' помилка?
If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0)

' отримуємо дані, необхідні для розрахунку податку
Dim limites, coeffR, coeffN
getData limites,coeffR,coeffN

' виведення результату
wscript.echo "impôt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN)

' програма завершується без помилок
wscript.quit 0

' ------------ функції та процедури

' ----------- getArguments
Function getArguments(byref marie, ByRef enfants, ByRef salaire)
    ' повинен отримати три значення, передані як аргументи до головної програми
    ' аргумент передається програмі без пробілів перед і після нього
    ' для перевірки правильності даних будуть використовуватися регулярні вирази

    ' повертає масив помилок із 2 значеннями
    ' помилка(0): код помилки, 0, якщо помилки немає
    ' помилка(1): повідомлення про помилку, якщо помилка є; інакше — порожній рядок

    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 аргументів
    Dim nbArguments
    nbArguments=wscript.arguments.count
    If nbArguments<>3 Then
        ' повідомлення про помилку
        getArguments= array(1,syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments incorrect")
        ' кінець
        Exit Function
    End If

    Dim modele, correspondances
    Set modele=new regexp

    ' сімейний стан повинен міститися серед символів oOnN
    modele.pattern="^[oOnN]$"
    Set correspondances=modele.execute(wscript.arguments(0))
    If correspondances.count=0 Then
        ' повідомлення про помилку
        getArguments=array(2,syntaxe & vbCRLF & vbCRLF & "erreur : argument marie incorrect")
        ' вихід
        Exit Function
    End If
    ' отримано значення
    If lcase(wscript.arguments(0)) = "o"Then
        marie=true
    Else
        marie=false
    End If

    ' «діти» має бути цілим числом >=0
    modele.pattern="^\d{1,2}$"
    Set correspondances=modele.execute(wscript.arguments(1))
    If correspondances.count=0 Then
        ' помилка
        getArguments= array(3,syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants incorrect")
        ' вихід
        Exit Function
    End If
    ' отримуємо значення
    enfants=cint(wscript.arguments(1))

    ' зарплата має бути цілим числом >=0
    modele.pattern="^\d{1,9}$"
    Set correspondances=modele.execute(wscript.arguments(2))
    If correspondances.count=0 Then
        ' помилка
        getArguments= array(4,syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire incorrect")
        ' виходимо
        Exit Function
    End If
    ' отримано значення
    salaire=clng(wscript.arguments(2))

    ' завершено без помилок
    getArguments=array(0,"")
End Function

' ----------- getData
Sub getData(byref limites, ByRef coeffR, ByRef coeffN)  
    ' визначаємо дані, необхідні для розрахунку податку, у 3 таблицях
    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)

    ' розраховується кількість часток
    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

    ' розраховується сімейний коефіцієнт та оподатковуваний дохід
    Dim revenu, qf
    revenu=0.72*salaire
    qf=revenu/nbParts

    ' розраховується податок
    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

Коментарі

  • функція getArguments дозволяє отримати інформацію (дружина, діти, заробітна плата) про платника податків. Тут ці дані передаються як аргументи до програми VBScript. Якщо це зміниться, наприклад, якщо ці аргументи будуть надходити з графічного інтерфейсу, то переписати потрібно буде лише процедуру getArguments, а не інші.
  • Функція getArguments може виявляти помилки в аргументах. У такому випадку можна було б вирішити зупинити виконання програми у функції getArguments за допомогою інструкції wscript.quit. Цього ніколи не слід робити у функції чи процедурі. Якщо функція або процедура виявляє помилку, вона повинна якимось чином повідомити про це програму, що її викликає. Саме вона, а не процедура, має прийняти рішення про те, чи зупиняти виконання. У нашому прикладі програма, що викликає, може вирішити попросити користувача повторно ввести помилкові дані з клавіатури, замість того щоб зупиняти виконання.
  • Тут функція getArguments повертає масив, перший елемент якого є кодом помилки (0, якщо помилки немає), а другий — повідомленням про помилку, якщо помилка сталася. Перевіривши отриманий результат, програма-викликач може визначити, чи сталася помилка.
  • Процедура getData дозволяє отримати дані, необхідні для розрахунку податку. Тут вони безпосередньо визначені в процедурі getData. Якщо ці дані мають надходити з іншого джерела, наприклад, із файлу або бази даних, то переписати слід лише процедуру getData, а інші — ні.
  • Функція calculerImpot дозволяє розрахувати податок після отримання всіх даних, незалежно від способу їх отримання.
  • Отже, слід зазначити, що модульний підхід до програмування дозволяє (повторно) використовувати певні модулі в різних контекстах. Ця концепція протягом останніх двадцяти років активно розвивалася в рамках об’єктно-орієнтованого програмування.