2017-02-03 124 views
-1

這似乎是驗證數據輸入的一種很差的方式。我發現自己做了很多事情。程序可以組合或簡化嗎?驗證數據輸入

子的Main() ...

Console.Write("Landscape Size: ") 
       IsNumeric(LandscapeSize) 
       Console.Write("Initial number of warrens: ") 
       IsNumeric(InitialWarrenCount) 
       Validate(InitialWarrenCount, LandscapeSize) 
       Console.Write("Initial number of foxes: ") 
       IsNumeric(InitialFoxCount) 
       Validate(InitialFoxCount, LandscapeSize) 

這裏是兩個潛艇這似乎過於複雜:

Sub IsNumeric(ByRef Variable As Integer) 
    While True 
     Try 
      Variable = CInt(Console.ReadLine()) 
      Exit While 
     Catch 
      Console.WriteLine("Error: Please enter a number:") 
     End Try 
    End While 
End Sub 
Sub Validate(ByVal Variable As Integer, ByVal LandscapeSize As Integer) 
    Dim Size As Integer 
    Size = (LandscapeSize * LandscapeSize) 
    While Variable <= 0 Or Variable >= Size 
     Console.WriteLine("Error: Please enter a number:") 
     While True 
      Try 
       Variable = CInt(Console.ReadLine()) 
       Exit While 
      Catch 
       Console.WriteLine("Error: Please enter a number:") 
      End Try 
     End While 
    End While 
End Sub 

非常感謝

+0

我沒有看到很多你可以改變的地方......也許你可以結合幾行,但它不會幫助你。 –

+0

兩條評論:1.不要使用名稱IsNumeric ..這是一個保留的系統函數名稱。 2.使用try/catch來捕獲非數字不是最好的方法。錯誤處理具有與其相關的大量開銷。您最好閱讀一個字符串並使用系統函數IsNumeric()進行測試。 –

+0

@Trevor在某種程度上,我對你說的那種感覺很滿意。有兩次嘗試抓住聲明似乎非常辛苦。謝謝。編輯 - 所以聲明爲字符串和使用IsNumeric ..聽起來更好... – Rich

回答

1

那麼重命名則IsNumeric .. 使用TryParse代替嘗試捕獲

Sub ReadNumber(ByRef Variable As Integer) 
    Do 
     If Integer.TryParse(Console.ReadLine(), variable) Then Exit Sub 
     Console.WriteLine("Error: Please enter a number:") 
    Loop 
End Sub 

Sub Validate(ByVal Variable As Integer, ByVal LandscapeSize As Integer) 
    Dim Size As Integer = LandscapeSize * LandscapeSize 
    While Variable <= 0 Or Variable >= Size 
     Console.WriteLine("Error: Please enter a number:") 
     do 
      If Integer.TryParse(Console.ReadLine(), variable) Then Exit Do 
      Console.WriteLine("Error: Please enter a number:") 
     loop 
    End While 
End Sub 

但是,我猜你確實希望Validate中的第一個變量是ByRef NOT ByVal。

+0

我很感激。 TryParse似乎是一種更高效的方法。謝謝。 – Rich