Mi primera aplicación en vb.net

Iniciado por Orb, 17 Diciembre 2014, 13:44 PM

0 Miembros y 1 Visitante están viendo este tema.

Orb

Buenos días , desde hace una semana estoy siguiendo un curso de visual basic.net , y hoy me he puesto a intentar hacer algo MUY básico como lo es una calculadora.Pido que no se me infravalore solo por ello , ya que estoy empezando , y el haber podido llevar a cabo la calculadora , por muy fácil que sea , es un gran paso para mí.
Realmente la calculadora no tiene nada innovador , toda ella se basa en los operadores aritméticos incluyendo lel operador mod(si es que se le llama operador).La aplicación se compone en cuatro bloques , por llamarlo de alguna manera , cada bloque con dos textbox y un button , un bloque para multiplicar , otro para sacar el resto de una división , otro para la suma y un último para la resta.

Me gustaría que me dierais opiniones respecto al código , respecto a si puede simplificarse el código , si hay expresiones mal utilizadas o algún consejo a tener en cuenta para más adelante.Sin más , aquí os lo dejo , un saludo y gracias.

Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
       Dim numero1, numero2, resultadosuma As Integer
       numero1 = txt1.Text
       numero2 = txt2.Text
       resultadosuma = numero1 + numero2
       MsgBox(resultadosuma)


   End Sub

   Private Sub txt3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt3.TextChanged
       
   End Sub

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       Dim numero3, numero4, resultadoresta As Integer
       numero3 = txt3.Text
       numero4 = txt4.Text
       resultadoresta = numero3 - numero4
       MsgBox(resultadoresta)
   End Sub

   Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
       Dim numero5, numero6, resultadoresto As Integer
       numero5 = txt5.Text
       numero6 = txt6.Text
       resultadoresto = numero5 Mod numero6
       MsgBox(resultadoresto)

   End Sub

   Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
       Dim numero7, numero8, resultadomultiplicacion As Integer
       numero7 = txt7.Text
       numero8 = txt8.Text
       resultadomultiplicacion = numero7 * numero8
       MsgBox(resultadomultiplicacion)


   End Sub
End Class

Shell Root

Como siempre se utilizan las 2 variables para recoger los valores y uno para calcularas, ponerlas generales. Es decir,
Código (vbnet) [Seleccionar]
Public Class Form1

   ' # Aqui sólo que no me acuerdo como se programa en .NET jajajaja
   Public iNum1, iNum2, iResultado As Integer

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
      ' Cada vez que requieras usarla, sólo la seteas con un valor 0 o directamente con el valor del TextBox
      iNum1 = txt1.Text
      iNum2 = txt1.Text
      iResultado = iNum1 + iNum2
      MsgBox "Resultado: " & iResultado
   End Sub

   ' --- SNIP ----
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Eleкtro

#2
Cita de: Orb en 17 Diciembre 2014, 13:44 PMhoy me he puesto a intentar hacer algo MUY básico como lo es una calculadora.Pido que no se me infravalore solo por ello , ya que estoy empezando

No creo que eso sea algo que deba preocuparte, aqui estamos para ayudar, no para juzgar quien eres por cuanto sabes.


Cita de: Orb en 17 Diciembre 2014, 13:44 PMtoda ella se basa en los operadores aritméticos incluyendo lel operador mod(si es que se le llama operador)

Si, es un operador:
Mod Operator (Visual Basic)


Cita de: Orb en 17 Diciembre 2014, 13:44 PMMe gustaría que me dierais opiniones respecto al código , respecto a si puede simplificarse el código , si hay expresiones mal utilizadas.

El único inconveniente que le veo es que estás utilizando el DataType Integer, y esto para una calculadora no es lo más apropiado xD, ya que la capacidad máxima de un Integer es poca, y excluye la posibilidad de usar y calcular correctamente decimales.

Aparte de eso, el código en general se puede simplificar mucho, ya que utilizas la abundante repetición de código para hacer lo mismo 4 veces,
eso es de lo más normal en alguien que está aprendiendo, pero mi consejo es que debes acostumbrarte cuanto antes a programar de forma dinámica, es una aventura que te brindará un sin fin de posibilidades, te ayudará a estructurar el código y eso evitará en parte que acabes escribiendo un código spaghetti (Spaghetti code - Wikipedia, the free encyclopedia).

Por un lado, está la Class principal.
Lo más destacable de esta modificación que he escrito sería el Type "MathInfo" y la multiple subscripción del mismo evento de todos los botones, combinando ambas cosas nos ayuda a elaborar la tarea de forma dinámica utilizando la propiedad Tag de los botones para asociar un objeto "MathInfo" a cada botón, esto nos evita tener que duplicar código innecesario.
Y en fín, todo esto nos lleva siempre al método "DoMaths", donde podemos implementar controles de errores, etc. (eso ya es cosa tuya)

También debo decir que lo he estructurado basándome en tu ejemplo, es decir, que esto se podría simplificar más si fuera otro caso, donde no tuvieras 8 TextBoxes para 8 valores distintos y 4 botones.

Código (vbnet) [Seleccionar]
Option Strict On : Option Explicit On : Option Infer Off

Imports WindowsApplication1.MathTools

Public Class Form1

#Region " Types "

   Private Class MathInfo
       Public Property Control1 As Control
       Public Property Control2 As Control
       Public Property MathOperation As MathOperation
   End Class

#End Region

#Region " Event Handlers "

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
   Handles Me.Load

       Me.Button1.Tag = New MathInfo With
                        {.Control1 = Me.txt1, .Control2 = Me.txt2, .MathOperation = MathOperation.Sum}

       Me.Button2.Tag = New MathInfo With
                        {.Control1 = Me.txt3, .Control2 = Me.txt4, .MathOperation = MathOperation.Rest}

       Me.Button3.Tag = New MathInfo With
                        {.Control1 = Me.txt5, .Control2 = Me.txt6, .MathOperation = MathOperation.DivisorRemainder}

       Me.Button4.Tag = New MathInfo With
                        {.Control1 = Me.txt7, .Control2 = Me.txt8, .MathOperation = MathOperation.Multiply}
   End Sub

   ''' <summary>
   ''' Handles the Click event of the Button controls.
   ''' </summary>
   Private Sub Buttons_Click(ByVal sender As Object, ByVal e As EventArgs) _
   Handles Button1.Click,
           Button2.Click,
           Button3.Click,
           Button4.Click

       Me.DoMaths(DirectCast(DirectCast(sender, Button).Tag, MathInfo))

   End Sub

#End Region

#Region " Methods "

   ''' <summary>
   ''' Performs an arithmetic operation with the values contained on the specified <see cref="T:MathInfo" />.
   ''' And shows an informative <see cref="T:MessageBox" /> with the resulting value.
   ''' </summary>
   Private Sub DoMaths(ByVal mathInfo As MathInfo)

       Dim value1 As Decimal = CDec(mathInfo.Control1.Text)
       Dim value2 As Decimal = CDec(mathInfo.Control2.Text)
       Dim mathOperation As MathOperation = mathInfo.MathOperation
       Dim result As Decimal = MathTools.GetMathResult(value1, value2, mathOperation)

       MessageBox.Show(CStr(result), String.Format("Resulting value of an {0} operation", mathOperation.ToString),
                       MessageBoxButtons.OK, MessageBoxIcon.Information)

   End Sub

#End Region

End Class


Y por otro lado, lo apropiado es separar las funciones que haces en otra Class, donde puedes implementar las herramientas relacionadas con la aritmética:

( Ten en cuenta que "simplificar", no siempre significa escribir menos )

Código (vbnet) [Seleccionar]
''' <summary>
''' Contains related Mathematial tools.
''' </summary>
Public NotInheritable Class MathTools

   ''' <summary>
   ''' Specifies an arithmetic operation.
   ''' </summary>
   Public Enum MathOperation As Integer

       Sum = 1I
       Rest = 2I
       Multiply = 3I
       DivisorRemainder = 4I

   End Enum

   ''' <summary>
   ''' Performs an arithmetic operation with the specified two values.
   ''' </summary>
   ''' <param name="value1">The first value.</param>
   ''' <param name="value2">The second value.</param>
   ''' <param name="mathOperation">The arithmetic operation.</param>
   ''' <returns>The resulting value.</returns>
   ''' <exception cref="System.ArgumentException">mathOperation</exception>
   Public Shared Function GetMathResult(ByVal value1 As Decimal,
                                        ByVal value2 As Decimal,
                                        ByVal mathOperation As MathOperation) As Decimal

       Select Case mathOperation

           Case MathTools.MathOperation.Sum
               Return (value1 + value2)

           Case MathTools.MathOperation.Rest
               Return (value1 - value2)

           Case MathTools.MathOperation.Multiply
               Return (value1 * value2)

           Case MathTools.MathOperation.DivisorRemainder
               Return (value1 Mod value2)

           Case Else
               Throw New ArgumentException("Tu mensaje de error aquí", "mathOperation")
               Return 0D

       End Select

   End Function

End Class


Espero que te haya servido.

Saludos.








Orb

Muchas gracias , Shell Root y Elektro.
Mientras continuaba con la calculadora me di cuenta de que el código era muy repetitivo y tendría que existir alguna forma de simplificarlo , aparte de otras cosas.

Muchas gracias por vuestros consejos¡

Un saludo