Visual Basic: An Object Oriented Approach 6: Object Modelling
OOP – The Basics Revised Classes – templates for objects Encapsulation – separation of internal workings from external interface Properties – attributes of an object Methods – operations definValidateed for a class of objects Messages – interactions between objects
Object Models Real programs will involve large numbers of objects Will interact in various ways Will form logical structures May involve several levels of structure in complex systems Key to maintaining coherence is in building an object model that provides a ‘world view’ of the system
Use-Case Diagrams Used to obtain a high level (user-level) picture of the system Can be used in discussions with clients Shows main interactions between system and users/external environment ATM - Bank Machine Accept Card Verify PIN Print Statement Withdraw Cash Deposit Cash User (Actor)
Class Model based on Use-Case Diagram Having identified classes, need to define… Interactions between them Structure Class Interfaces ATM ValidateUser PrintStatement DoDeposit DoWithdrawal Account Balance PIN Owner Deposit Withdraw Statement :ATM:Account :Deposit(50)
Coding a Class Need to… Determine storage needs (member variables) Include structural relationships – e.g. An Account owns a collection of Transactions Implement Methods and Properties in terms of accesses to member variables Consider mechanisms for getting info to and from and object Properties (the obvious) Parameters to Subs and Functions (can apply multiple values at once) Results of Functions
Coding Classes Start from class lowest in structure/hierarchy Likely that higher up classes will have these as components Easier to test Build then test each class First individually, then With classes it interacts with, then In sub-system Have test data ready Best to consider testing during design phases Store test data and revise/reuse as necessary
Example – Bank/ATM Assume two classes only ATM Class models Teller machine Account class models individual account Start with Account class From Use-Case point of view, ATM accesses Account and is therefore controller Can build and test this class before moving on to ATM (which needs a working account to enable a full test) Decide on tests necessary based on Use-Case diagram Be prepared to change Use-Case, structure etc. as whole picture unfolds.
Account Class Private mvarBalance As Currency ‘ Unrealistic, but will do for example Private mvarPIN As Integer Private mvarOwner As String Public Property Get Balance() As Currency… Public Property Get PIN() As Integer… Public Property Let PIN(newValue As Integer)… Public Property Get Owner() As String… Public Property Let Owner(newValue As String)… Public Sub Deposit(amount As Currency)… Public Sub Withdraw(amount As Currency)… Public Function Statement() As String… Private mvarBalance As Currency ‘ Unrealistic, but will do for example Private mvarPIN As Integer Private mvarOwner As String Public Property Get Balance() As Currency… Public Property Get PIN() As Integer… Public Property Let PIN(newValue As Integer)… Public Property Get Owner() As String… Public Property Let Owner(newValue As String)… Public Sub Deposit(amount As Currency)… Public Sub Withdraw(amount As Currency)… Public Function Statement() As String… Whole Property and Method code not shown here. See samples next, and exercises in chapters 2 and 7 for complete code. Mostly, the code is Simple and obvious.
Account – Sample Property and Method Public Property Get Balance() As Currency Balance = mvarBalance End Property Public Property Get PIN() As Integer PIN = mvarPIN End Property Public Property Let PIN(newValue As Integer) mvarPIN = newValue End Property Public Sub Deposit(amount As Currency) mvarBalance = mvarBalance + amount End Sub Public Property Get Balance() As Currency Balance = mvarBalance End Property Public Property Get PIN() As Integer PIN = mvarPIN End Property Public Property Let PIN(newValue As Integer) mvarPIN = newValue End Property Public Sub Deposit(amount As Currency) mvarBalance = mvarBalance + amount End Sub Read-only property Read-write property Method definition
Testing Account Set A = New Account A.Owner = “Fred Bloggs” A.PIN = “1234” A.Deposit Print A.Statement Statement for: Fred Bloggs Balance = £ A.Withdraw 50 Print A.Statement Statement for: Fred Bloggs Balance = £ ‘ etc… Set A = New Account A.Owner = “Fred Bloggs” A.PIN = “1234” A.Deposit Print A.Statement Statement for: Fred Bloggs Balance = £ A.Withdraw 50 Print A.Statement Statement for: Fred Bloggs Balance = £ ‘ etc… In VB can use the Immediate Window to test a class Create an object Execute methods Print property values (Using Print or ?) Can also copy, the sequence of test statements, paste into Notepad or an editor, and save for re-testing if changes are made.
Continue Development Can go up hierarchy to create next class (ATM) Now possible to test ATM since Account class is in place ATM class must create an Account object to interact with User-Interactions with ATM should translate to ATM interactions with Account
Example ATM Method Public Function ValidateUser(A As Account) As Boolean Dim userPIN As Integer userPIN = InputBox(“Enter PIN”) If A.PIN = userPIN Then Set mvarCurrentAccount = A ValidateUser = True Else ValidateUser = False End If End Property Public Function ValidateUser(A As Account) As Boolean Dim userPIN As Integer userPIN = InputBox(“Enter PIN”) If A.PIN = userPIN Then Set mvarCurrentAccount = A ValidateUser = True Else ValidateUser = False End If End Property This method depends on the Account A being Available. Success of method leads to ATM Storing a reference to the Account.
Testing an ATM Method Set A = New Account A.Owner = “Fred Bloggs” A.PIN = “1234” Set ATM = New ATM Print ATM.ValidateUser A ‘ VB creates an InputBox() here to enter PIN number ‘ ATM returns True or False depending on input to it. ‘ Could now have ATM performing deposits and ‘ withdrawals etc. e.g… ATM.Deposit ATM.PrintStatement Statement for: Fred Bloggs Balance = £ Set A = New Account A.Owner = “Fred Bloggs” A.PIN = “1234” Set ATM = New ATM Print ATM.ValidateUser A ‘ VB creates an InputBox() here to enter PIN number ‘ ATM returns True or False depending on input to it. ‘ Could now have ATM performing deposits and ‘ withdrawals etc. e.g… ATM.Deposit ATM.PrintStatement Statement for: Fred Bloggs Balance = £100.00
References A Reference is a variable that acts as an alias for an object VB uses references exclusively for interacting with objects An object with no references to it is destroyed automatically When an object is created, a reference to it is assigned to an object variable As a consequence of this, an object can have any number of references to it.
References and Objects Set A = New Account Creates object Assigns reference A Account Object A2 Set A2 = A
Collections A Collection maintains a list of object references Therefore no need to maintain individual reference variables to prevent objects from being destroyed Acts as an unbounded array – no need to indicate how many elements to accommodate A collection is itself an object Can create collections of collections
Collection Methods Four main methods Add – adds an object reference to the collection Remove – removes a reference Count – returns number of references in the collection Item – a virtual array in the collection – allows access to object references Indexing Objects can be retrieved by number Objects can be added with a Key (string), which acts as a textual index
A Collection Set C = New Collection Set A = New Account A.Owner = “Fred” C.Add A Set A = New Account A.Owner = “Mary” C.Add A, “Second account” Print C.Count 2 Print C(1).Owner Fred Print C(“Second Account”).Owner Mary Set C = New Collection Set A = New Account A.Owner = “Fred” C.Add A Set A = New Account A.Owner = “Mary” C.Add A, “Second account” Print C.Count 2 Print C(1).Owner Fred Print C(“Second Account”).Owner Mary
Collections and For Each… Collections and objects introduce a new style of For..Next loop For Each A In C: Print A.Owner: Next Fred Mary For Each A In C: Print A.Owner: Next Fred Mary