homeboekenlinksledenabonneer je :Blijf op de hoogte door je te abonneren op de vbvoorbeelden RSS Niews Feed!Blijf op de hoogte door vbvoorbeelden te volgen op Twitter!Blijf op de hoogte door fan te worden van vbvoorbeelden op Facebook!
Visual Basic 2008 en 2010 Voorbeelden en Boeken Microsoft Visual Studio 2010Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

visual basic 2008 voorbeelden en boeken / visual basic 2010 voorbeelden en boeken

9.3. Implementatie

Print Email Deel op FacebookDeel op TwitterDeel op DiggBookmark op Google BookmarksDeel op del.icio.usOverige Sociale Netwerksites...

Dit artikel is gepubliceerd op woensdag 28 april 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

9.3.1. Caching versus Calculation

Een alternatief voor het berekenen van de GetPriceIncludingTax in de getfunctie is het berekenen ervan in de setters van Price en Tax properties. Deze berekende waarde kan dan "gecached" worden, zodoende het raadplegen van de functie GetPriceIncludingTax te versnellen door dan simpelweg de gestockeerde waarde terug te geven.
Visual Basic Broncode
Namespace Example1
    Class Product
        Private m_Price As Decimal
        Public Property Price() As Decimal
            Get
                Price = m_Price
            End Get
            Set(ByVal value As Decimal)
                m_Price = value
                setPriceIncludingTax()
            End Set
        End Property
        Private m_TaxPercentage As Decimal
        Public Property TaxPercentage() As Decimal
            Get
                TaxPercentage = m_TaxPercentage
            End Get
            Set(ByVal value As Decimal)
                m_TaxPercentage = value
                setPriceIncludingTax()
            End Set
        End Property
        Private m_PriceIncludingTax As Decimal
        Public Function GetPriceIncludingTax() As Decimal
            GetPriceIncludingTax = m_PriceIncludingTax
        End Function
        Private Sub setPriceIncludingTax()
            m_PriceIncludingTax = Price * (1 + (TaxPercentage / 100))
        End Sub
    End Class
    Module Client
        Sub Main()
            Dim product1 As Product = New Product
            product1.Price = 100
            product1.TaxPercentage = 8
            Console.WriteLine(product1.GetPriceIncludingTax())
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Visual Basic Output
108
Dit kan voordelig zijn wanneer de frequentie van opvragen van de GetPriceIncludingTax ( laten uitvoeren van de getfunctie ) hoger zal zijn dan de frequentie van instellen van de Price of Tax ( laten uitvoeren van de setters van die properties ). De berekening zal zo minder moeten uitgevoerd worden, wat de performantie bevordert.

Hierbij gaat men er natuurlijk wel vanuit te weten dat clients de klasse vooral op deze wijze zouden gebruiken, dit is echter vaak moeilijk te achterhalen of voorspelen. Bijkomend valt ervoor te pleiten de kans tot herbruik van de klasse zo hoog mogelijk te houden ( dit zou tenslotte één van de grote voordelen van OOP moeten zijn ) en er dus rekening mee te houden dat de klasse op allerhande manieren gebruikt kan worden.

In plaats van de formule hier in beide setters te herhalen, wordt hier gebruik gemaakt van een private hulpmethod om die formule in te plaatsen. Wat als voordeel heeft dat als de formule zou wijzigen men dit op 1 centraal punt zou kunnen aanpassen. De hulpmethod wordt ingekapseld ( Private ) omdat clients deze bewerking niet moeten kunnen initiëren.

Wat nadelig is aan deze werkwijze is dat de logica omtrent het bepalen van de prijs inclusief tax ( en omtrent het wanneer bepalen ) hier verspreidt zit over verschillende members van de klasse, en dus moeilijker te onderhouden zal zijn. Een grotere afhankelijkheid tussen de members ( of zelfs tussen verschillend klassen als de afgeleide waarde gebaseerd is op externe objecten ) kan zo worden gecreëerd, en vaak zal extra synchronisatiecode moeten toegevoegd worden.
Ga dan ook doordacht te werk, en wees je bewust van eventuele consequenties wanneer je voor deze aanpak kiest. Waarschijnlijk zal de aanpak uit vorig voorbeeld dus de te prefereren aanpak zijn.

In het geval je toch kiest om de berekende waarde als toestand te stockeren, raden coding guidelines aan een Property te gebruiken. De waarde moet enkel uitleesbaar zijn, dus een ReadOnly Property :
Visual Basic Broncode
Namespace Example2
    Class Product
        Private m_Price As Decimal
        Public Property Price() As Decimal
            Get
                Price = m_Price
            End Get
            Set(ByVal value As Decimal)
                m_Price = value
                setPriceIncludingTax()
            End Set
        End Property
        Private m_TaxPercentage As Decimal
        Public Property TaxPercentage() As Decimal
            Get
                TaxPercentage = m_TaxPercentage
            End Get
            Set(ByVal value As Decimal)
                m_TaxPercentage = value
                setPriceIncludingTax()
            End Set
        End Property
        Private m_PriceIncludingTax As Decimal
        Public ReadOnly Property PriceIncludingTax() As Decimal
            Get
                PriceIncludingTax = m_PriceIncludingTax
            End Get
        End Property
        Private Sub setPriceIncludingTax()
            m_PriceIncludingTax = Price * (1 + (TaxPercentage / 100))
        End Sub
    End Class
    Module Client
        Sub Main()
            Dim product1 As Product = New Product
            product1.Price = 100
            product1.TaxPercentage = 8
            Console.WriteLine(product1.PriceIncludingTax)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Visual Basic Output
108

9.3.2. Test Driven

Voor elke van de onderstaande klassen is steeds een "test fixture" gecreëerd.

De members van elke klasse ( elke "unit" ) worden getest op het verwachte gedrag.

Deze fixture maakt steeds een instantie aan van de te testen klasse, en zal daar aan de hand van de queries ( functies ) de initiële toestand van de eigenschappen en het aanpassen van de toestanden door de commands ( procedures ) gaan testen.

Deze testen definiëren wat we als gedrag verwachten van deze klasse.

Het kan geen kwaad - bij wijze van "testdriven development" - deze testen te schrijven alvorens de klasse zelf te definiëren.
Zo denk je na over de vereiste abstracte, de publieke interface en het verwachte gedrag van objecten van deze klasse.
Eens men over deze testen beschikt kan men makkelijk aan de implementaties van de members van deze klasse werken, en dit tot alle testen slagen.

Indien alle testen slagen zal bij deze fixtures steeds True als output op de console komen.

9.3.3. Oefeningen

Opgave 1 :

Maak een klasse waarbij men per object de toestand ( Value1 en Value2 ) van een Addition kan bijhouden ( instellen en opvragen ), en waarvan men ook de Result kan gaan opvragen.

Schrijf zelf een client om bovenstaande klasse te testen.
Oplossing 1 :
Visual Basic Broncode
Namespace Exercise1
    Class Addition
        Private m_Value1 As Integer
        Public Property Value1() As Integer
            Get
                Value1 = m_Value1
            End Get
            Set(ByVal value As Integer)
                m_Value1 = value
            End Set
        End Property
        Private m_Value2 As Integer
        Public Property Value2() As Integer
            Get
                Value2 = m_Value2
            End Get
            Set(ByVal value As Integer)
                m_Value2 = value
            End Set
        End Property
        Public Function GetResult() As Integer
            GetResult = Value1 + Value2
        End Function
    End Class
    Module AdditionTestFixture
        Sub Main()
            Dim addition1 As Addition = New Addition
            Console.WriteLine(addition1.Value1 = 0)
            Console.WriteLine(addition1.Value2 = 0)
            Console.WriteLine(addition1.GetResult() = 0)
            '
            addition1.Value1 = 1                                           ' (1)
            Console.WriteLine(addition1.Value1 = 1)
            Console.WriteLine(addition1.Value2 = 0)                        ' (2)
            Console.WriteLine(addition1.GetResult() = 1)
            '
            addition1.Value2 = 2
            Console.WriteLine(addition1.Value1 = 1)
            Console.WriteLine(addition1.Value2 = 2)
            Console.WriteLine(addition1.GetResult() = 3)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Visual Basic Output
True
True
True
True
True
True
True
True
True
Het lijkt op het eerste zicht misschien onzinnig te testen dat de eigenschap Value2 op waarde 0 staat (2) nadat enkel de eigenschap Value1 werd aangepast (1).
Toch is dit niet zo zinloos, door deze controle te doen, verifiëren we dat er niet "per ongeluk" werd geraakt aan eigenschap Value2 bij het instellen van Value1.
Opgave 2 :
Schrijf een klasse zodoende dat je Lamp objecten kan creëren waarop je een schakelaar kan gebruiken om het licht aan te steken.

Schrijf zelf een client om bovenstaande klasse te testen.
Oplossing 2 :
Visual Basic Broncode
Namespace Exercise2
    Class Lamp
        Private m_GivesLight As Boolean
        Public ReadOnly Property GivesLight() As Boolean
            Get
                GivesLight = m_GivesLight
            End Get
        End Property
        Public Sub PressButton()
            m_GivesLight = Not m_GivesLight
        End Sub
    End Class
    Module LampTestFixture
        Sub Main()
            Dim lamp1 As Lamp = New Lamp
            Console.WriteLine(lamp1.GivesLight = False)
            '
            lamp1.PressButton()
            Console.WriteLine(lamp1.GivesLight = True)
            '
            lamp1.PressButton()
            Console.WriteLine(lamp1.GivesLight = False)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Visual Basic Output
True
True
True
Opgave 3 :
Schrijf een klasse die je kan gebruiken om Counter objecten van te creëren.
Voor dergelijk Counter object moet je de Value en StepValue kunnen bijhouden ( instellen en opvragen ). Voorzie ook methods om de ingestelde Value te verhogen of te verlagen met de ingestelde StepValue.
De Value is initieel 0, de StepValue 1.

Schrijf zelf een client om bovenstaande klasse te testen.
Oplossing 3 :
Visual Basic Broncode
Namespace Exercise3
    Class Counter
        Private m_Value As Integer
        Public Property Value() As Integer
            Get
                Value = m_Value
            End Get
            Set(ByVal value As Integer)
                m_Value = value
            End Set
        End Property
        Private m_StepValue As Integer = 1
        Public Property StepValue() As Integer
            Get
                StepValue = m_StepValue
            End Get
            Set(ByVal value As Integer)
                m_StepValue = value
            End Set
        End Property
        Public Sub Raise()
            Value += StepValue
        End Sub
        Public Sub Lower()
            Value -= StepValue
        End Sub
    End Class
    Module CounterTestFixture
        Sub Main()
            Dim counter1 As Counter = New Counter
            Console.WriteLine(counter1.Value = 0)
            Console.WriteLine(counter1.StepValue = 1)
            '
            counter1.Value = 10
            Console.WriteLine(counter1.Value = 10)
            Console.WriteLine(counter1.StepValue = 1)
            '
            counter1.StepValue = 5
            Console.WriteLine(counter1.Value = 10)
            Console.WriteLine(counter1.StepValue = 5)
            '
            counter1.Raise()
            Console.WriteLine(counter1.Value = 15)
            Console.WriteLine(counter1.StepValue = 5)
            '
            counter1.Lower()
            Console.WriteLine(counter1.Value = 10)
            Console.WriteLine(counter1.StepValue = 5)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Visual Basic Output
True
True
True
True
True
True
True
True
True
True
Opgave 4 :
Maak een klasse die een eenvoudige robot simuleert. De robot kan zich over een X-Y coördinatenstelsel voortbewegen. Dit kan ofwel door in horizontale of verticale richting een stap te nemen ( 1 eenheid op te schuiven over de X- of Y-as ), ofwel door te roteren ( 90 graden naar rechts te draaien, zonder dat de robot hierbij van positie wijzigt ).
Het moet mogelijk zijn van de robot zowel de positie op de X-as als op de Y-as op te vragen.

Initieel bevindt de robot zich op positie 0 op zowel de X- als Y-as. Initieel zou de robot zich in opwaartse richting bewegen over het assen-stelsel.

Schrijf zelf een client om bovenstaande klasse te testen.
Oplossing 4 :
Visual Basic Broncode
Namespace Exercise4
    Class Robot
        Private m_X As Integer
        Public ReadOnly Property X() As Integer
            Get
                X = m_X
            End Get
        End Property
        Private m_Y As Integer
        Public ReadOnly Property Y() As Integer
            Get
                Y = m_Y
            End Get
        End Property
        Private m_Direction As Integer
        Public Sub Rotate()
            m_Direction += 1
            If m_Direction > 3 Then m_Direction = 0
        End Sub
        Public Sub PlaceStep()
            Select Case m_Direction
                Case 0 ' up
                    m_Y += 1
                Case 1 ' right
                    m_X += 1
                Case 2 ' down
                    m_Y -= 1
                Case 3 ' left
                    m_X -= 1
            End Select
        End Sub
    End Class
    Module RobotTestFixture
        Public Sub Main()
            Dim robot1 As Robot = New Robot
            Console.WriteLine(robot1.X = 0)
            Console.WriteLine(robot1.Y = 0)
            '
            robot1.PlaceStep()
            Console.WriteLine(robot1.X = 0)
            Console.WriteLine(robot1.Y = 1)
            '
            robot1.PlaceStep()
            Console.WriteLine(robot1.X = 0)
            Console.WriteLine(robot1.Y = 2)
            '
            robot1.Rotate()
            Console.WriteLine(robot1.X = 0)
            Console.WriteLine(robot1.Y = 2)
            '
            robot1.PlaceStep()
            Console.WriteLine(robot1.X = 1)
            Console.WriteLine(robot1.Y = 2)
            '
            robot1.Rotate()
            robot1.PlaceStep()
            Console.WriteLine(robot1.X = 1)
            Console.WriteLine(robot1.Y = 1)
            '
            robot1.Rotate()
            robot1.PlaceStep()
            Console.WriteLine(robot1.X = 0)
            Console.WriteLine(robot1.Y = 1)
            '
            robot1.Rotate()
            robot1.PlaceStep()
            Console.WriteLine(robot1.X = 0)
            Console.WriteLine(robot1.Y = 2)
            '
            Console.ReadLine()
        End Sub
    End Module
End Namespace
Visual Basic Output
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True
True

Dit artikel is gepubliceerd op woensdag 28 april 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Visual Basic 2008 & 2010 Boeken

Het Groene Visual Basic 2008 & 2010 Voorbeelden Boek Het Blauwe Visual Basic 2008 & 2010 Voorbeelden Boek Het Rode Visual Basic 2008 & 2010 Voorbeelden Boek

Bevalt een artikel je, dan kan je de inhoud van vbvoorbeelden ook reclamevrij in boekvorm verkrijgen.

De inhoud is verdeeld over 3 boeken, Het Groene, Het Blauwe en Het Rode Visual Basic 2008 & 2010 Voorbeelden Boek.

Klik hier voor meer informatie.

Berichten

Fast UML Sequence Diagram Editor