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
No creo que eso sea algo que deba preocuparte, aqui estamos para ayudar, no para juzgar quien eres por cuanto sabes.
toda 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)Me 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.
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.