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.
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
Como siempre se utilizan las 2 variables para recoger los valores y uno para calcularas, ponerlas generales. Es decir,
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 ----
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) (http://msdn.microsoft.com/en-us/library/se0w9esz.aspx)
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 (http://en.wikipedia.org/wiki/Spaghetti_code)).
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.
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 )
''' <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.
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