Searle95
Searle95

Reputation: 1

Can someone help me simplify my code segment?

This is a code from a program in visual basic and I was wondering if there was a way to simplify it?

It takes the number of strings and says, if you equal this number then show this letter and this cover.

Is there a simpler way to do this so I don't have to repeat the code over and over again?

If UBound(Variables.Words) = "0" Then
        Round1.Letter6.Show()
        Round1.Cover6.Show()
    ElseIf UBound(Variables.Words) = "1" Then
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
    ElseIf UBound(Variables.Words) = "2" Then
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
    ElseIf UBound(Variables.Words) = "3" Then
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
    ElseIf UBound(Variables.Words) = "4" Then
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
    ElseIf UBound(Variables.Words) = "5" Then
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
    ElseIf UBound(Variables.Words) = "6" Then
        Round1.Letter3.Show()
        Round1.Cover3.Show()
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
    ElseIf UBound(Variables.Words) = "7" Then
        Round1.Letter3.Show()
        Round1.Cover3.Show()
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
        Round1.Letter10.Show()
        Round1.Cover10.Show()
    ElseIf UBound(Variables.Words) = "8" Then
        Round1.Letter2.Show()
        Round1.Cover2.Show()
        Round1.Letter3.Show()
        Round1.Cover3.Show()
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
        Round1.Letter10.Show()
        Round1.Cover10.Show()
    ElseIf UBound(Variables.Words) = "9" Then
        Round1.Letter2.Show()
        Round1.Cover2.Show()
        Round1.Letter3.Show()
        Round1.Cover3.Show()
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
        Round1.Letter10.Show()
        Round1.Cover10.Show()
        Round1.Letter11.Show()
        Round1.Cover11.Show()
    ElseIf UBound(Variables.Words) = "10" Then
        Round1.Letter1.Show()
        Round1.Cover1.Show()
        Round1.Letter2.Show()
        Round1.Cover2.Show()
        Round1.Letter3.Show()
        Round1.Cover3.Show()
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
        Round1.Letter10.Show()
        Round1.Cover10.Show()
        Round1.Letter11.Show()
        Round1.Cover11.Show()
    ElseIf UBound(Variables.Words) = "11" Then
        Round1.Letter1.Show()
        Round1.Cover1.Show()
        Round1.Letter2.Show()
        Round1.Cover2.Show()
        Round1.Letter3.Show()
        Round1.Cover3.Show()
        Round1.Letter4.Show()
        Round1.Cover4.Show()
        Round1.Letter5.Show()
        Round1.Cover5.Show()
        Round1.Letter6.Show()
        Round1.Cover6.Show()
        Round1.Letter7.Show()
        Round1.Cover7.Show()
        Round1.Letter8.Show()
        Round1.Cover8.Show()
        Round1.Letter9.Show()
        Round1.Cover9.Show()
        Round1.Letter10.Show()
        Round1.Cover10.Show()
        Round1.Letter11.Show()
        Round1.Cover11.Show()
        Round1.Letter12.Show()
        Round1.Cover12.Show()
    End If

Any help is much appreciated!

Thanks, Dan.

EDIT ** I am not new to this but I only know basic functions. Sorry to be difficult, but could you show me full examples of what i would need to do.

Thanks, again.

Upvotes: 0

Views: 134

Answers (3)

trucker_jim
trucker_jim

Reputation: 572

Building on Peter G's idea:

You can avoid the situation where you have to name so many variables so specifically to be able to control them by creating them dynamically in the LoadItemLookup method shown below, but doing it the way you've done it you can use a lookup like this:

'   Lookup of Cover/Letter objects
Private _ItemLookup as Dictionary(of Integer, YourObjectType)
Private ReadOnly Property ItemLookup As Dictionary(of Integer, YourObjectType)
    Get
        If IsNothing(_itemLookup) Then
            _ItemLookup = LoadItemLookup
        End If
        Return _ItemLookup
    End Get 
End Property

'  Loads the lookup
Private function LoadItemLookup as Dictionary(of Integer, YourObjectType)
    dim newLookup As New Dictionary(of Integer, YourObjectType)
    newLookup.Add(1, Round1.Letter1)
newLookup.Add(2, Round1.Letter2)
newLookup.Add(3, Round1.Letter3)
     'etc
    Return newLookup 
End Sub


Private Sub YourExecutingSub

    Select Case UBound(Variables.Words)
        Case "0"
            ShowItems(6, 6)
        Case "1"
            ShowItems(6, 7)
        Case "2"
            ShowItems(5, 7)
        Case "3"
            ShowItems(5, 8)
        Case "4"
            ShowItems(4, 8)

    End Select
End Sub

' taken from peter g's answer
Private Sub ShowItems(ByVal startNumber as Integer, byval EndNumber as Integer)
    For i As Integer = StartNumber to EndNUmber
        If ItemLookup.ContainsKey(i) Then
            ItemLookup(i).Letter.Show
            ItemLookup(i).Cover.Show
        End If
    Next
End Sub

Upvotes: 0

peterG
peterG

Reputation: 1641

Could you refactor the letters and covers so that they are in an array or collection , and then assuming they are always consecutive, write a procedure passing start and end params along these lines:

dim i as integer = Ubound(words)
select case i
case 0
showlettersandcovers(6,6)
case 1
showlettersandcovers(6,7)
. . .
case 3
showlettersandcovers(5,8)
. . .

(added in response to comment)

sub ShowLettersAndcovers(startnum as integer, endnum as integer) 
for i as integer = startnum to endnum
    Round1.Letter(i).show
    Round1.Cover(i).show
next

That's assuming you can get your letters and covers into an array or similar - without knowing the details of your application, I've no idea if this is a reasonable assumption or not. For instance, you might be able to set your letters up like this:

Dim letterarray as letter() with {new letter(paramsforletter0), new letter(paramsforletter1 . . . }

Or you might be loading them from a database, so they might already be in a dataset which you could iterate over as above. . .

Upvotes: 1

Brent Keller
Brent Keller

Reputation: 1435

Another option to reduce repetition slightly would be to group calls into functions since it seems like the letter and the cover are always shown together.

Private Function ShowSection6()
    Round1.Letter6.Show()
    Round1.Cover6.Show()
End Sub        

Private Function ShowSection7()
    Round1.Letter7.Show()
    Round1.Cover7.Show()
End Sub        
'.... etc ...

Then group things in a Select statement as mentioned by @Westie since you only have a single outcome each time

   Select Case UBound(Variables.Words)  
       Case 0  
           ShowSection6()
       Case 1 
           ShowSection6()
           ShowSection7()
       Case 2
       ...  
       Case Else  
       ...  
    End Select

Upvotes: 0

Related Questions