I am going through some old VB code and I run into function definitions like these -
Private Function ExistingCustomer(Index As Integer, Customer As String) As Integer Private Sub cmdCustomerList_Click()
What's the difference?
A subprocedure is called, whenever it is required to perform certain tasks. It returns control to the calling code after performing a task. A function is called, whenever a value is required to be returned to the calling code after performing a task. A subprocedure does not return a value to the calling code.
A Sub procedure is a series of Visual Basic statements enclosed by the Sub and End Sub statements. The Sub procedure performs a task and then returns control to the calling code, but it does not return a value to the calling code.
Function is a series of statements enclosed by "Function" and "End Function" statements. The Function performs an activity and returns control to the caller. When it returns control, it also returns a value to the calling code. You can define a Function in a Class, Structure & Module. By default It is Public.
Like a Function procedure, a Sub procedure is a separate procedure that can take arguments, perform a series of statements, and change the value of its arguments. However, unlike a Function procedure, which returns a value, a Sub procedure can't be used in an expression.
Function returns value, Sub doesn't. It's that simple.
A function can also be used in an expression. A Subroutine cannot. Functions can lend to the readability of your code better than a subroutine.
Here's an example of how a function can increase readability:
If AccountIsLocked("JJones") then Msgbox("This account is locked")
this function would be defined somewhere
public function AccountIsLocked(UserId as string) as boolean dim usr = uow.AccountRepository.UserInfo(UserId) return usr.locked end function
Here's the same example but coded with a subroutine:
CheckIfAccountLocked("JJones")
and elsewhere this sub is defined:
public sub CheckIfAccountLocked(UserId) if uow.AccountRepository.UserInfo(UserId).locked then msgbox("Account is locked") end if end sub
Also note that checking the value is separated from the action -- this contributes to separation of duties. The function would lend toward re-usability.
With VB6 there are some odd rules governing parenthesis. If there are no parameters to a sub then the parenthesis are not needed (I think Visual Studio might remove the parenthesis). One way around this is to add the keyword "Call" before your sub.
Call CheckIfAccountLocked()
vs
CheckIfAccountLocked
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With