Ir ao conteúdo
  • Cadastre-se

Melhores práticas: Onde realizar as conversões de campos?


niloleite

Posts recomendados

Olá a todos.

Estou desenvolvendo um pequeno sistema (apenas para aprendizagem) em C# com windows form.

Para realizar a contas de campos onde o usuário insere números, tenho que converter a string que o textbox armazena para número utilizando a função Convert nativa do C# antes de realizar a conta e converter o valor final da conta novamente para string para exibir nos textbox de resultado da tela.

A dúvida é: onde realizar esta conversão?

Pergunto isto pois enxergo vários cenários possíveis e não sei qual deles deixaria meu código mais "elegante", "profissional", "leve", de fácil entendimento ou sei lá mais o que...

Apenas para simplificar aqui, vou assumir todas as conversões de string para decimal e de decimal para string. Os códigos e nomes de variáveis não serão os realmente utilizados, pois não vem ao caso. Vamos a eles:

Crio a função do tipo decimal e converto o resultado retornado para string



decimal val1 = Convert.ToDecimal(tbVal1.Text);
decimal val2 = Convert.ToDecimal(tbVal2.Text);

tbResultado.Text = soma(val1, val2).ToString;

Não crio as variáveis e converto na chamada da função:


tbResultado.Text = soma(Convert.ToDecimal(tbVal1.Text), Convert.ToDecimal(tbVal2.Text)).ToString;

Crio a função como tipo string (assim como seus parâmetros) e realizo as conversões dentro da função:


tbResultado.Text = soma(tbVal1.Text, tbVal2.Text);

É melhor delegar as conversões à função, deixando o código que chama estas menor, e biblioteca de funções maior?

Ou não delego as conversões à função, o código que chama as funções fica maior, e a biblioteca de funções menor?

E se eu criar várias funções fazendo sobrecarga destas para os diversos tipos a serem recebidos, deixando minha biblioteca maior ainda, mas deixando o código principal livre e aí ele faz a conta do jeito que "vier"?

E quanto a criar as variáveis? É melhor ficar reservando um espaço na memória para criar estas ou deixo as chamadas das funções "feias" (ao meu ver) cheia de conversões?

Eu gostaria de ir praticando já com as melhores práticas...

Valeu a todos!

Link para o comentário
Compartilhar em outros sites

acho que não tem necessidade de pensar nisso, escolha o jeito que você acha mais fácil de entender, para esse tipo de conta, não havera diferença de performance.

no meu caso, eu faria assim

double d = double.Parse(textBox1.Text) + double.Parse(textBox2.Text);
textBox3.Text = d.ToString();

vi que você esta usando decimal, recomendo usar double ou float.

use FLOAT para ter calculos mais rapidos e com menos precisão

DECIMAL para codigos com grande precisão

e DOUBLE é o meio termo.

Link para o comentário
Compartilhar em outros sites

Cara, que bom saber isso. Vou usar o convert, assim fica menos 1 exception pra tratar... Valeu!

tem um outro metodo que sempre uso, o tryparse


string s = " ";
int i;

bool result = int.TryParse(s, out i); // variavel result é FALSE, i é 0

string s = "123";
int i;

bool result = int.TryParse(s, out i); // variavel result é TRUE, i é 123

Link para o comentário
Compartilhar em outros sites

Achei no MSDN uma forma mais "elegante" de fazer as conversões (além de outras coisas como só aceitar números) e resolvi compartilhar aqui.

Criei uma classe "NumericTextBox" que herda TextBox e implementam diversas coisas, dentre elas a propriedade "DecimalValue" que já retorna no valor convertido.

Com isso, as funções da minha classe recebem os parametros do tipo decimal, e a única conversão que preciso fazer é o .ToString() no final da conta, na hora de atribuir o valor ao TextBox (no meu caso NumericTextBox)

Vejam o código de como ficou a chamada da função:


tbBaseSTUn.Text = Calculos.calcBaseST(tbValLiquido.DecimalValue, tbValIPIUn.DecimalValue, tbAliqMva.DecimalValue, cbMVApauta.Checked).ToString();

Para quem quiser o codigo da classe NumericTextBox que vi no MSDN:


using System.Windows.Forms;
using System.Globalization;

namespace NOMEDOPROJETO
{
public partial class NumericTextBox : TextBox
{
bool allowSpace = false;

// Restricts the entry of characters to digits (including hex), the negative sign,
// the decimal point, and editing keystrokes (backspace).
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);

NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
string decimalSeparator = numberFormatInfo.NumberDecimalSeparator;
string groupSeparator = numberFormatInfo.NumberGroupSeparator;
string negativeSign = numberFormatInfo.NegativeSign;

// Workaround for groupSeparator equal to non-breaking space
if (groupSeparator == ((char)160).ToString())
{
groupSeparator = " ";
}

string keyInput = e.KeyChar.ToString();

if (Char.IsDigit(e.KeyChar))
{
// Digits are OK
}
else if (keyInput.Equals(decimalSeparator) || keyInput.Equals(groupSeparator) ||
keyInput.Equals(negativeSign))
{
// Decimal separator is OK
}
else if (e.KeyChar == '\b')
{
// Backspace key is OK
}
else if (e.KeyChar == 13)
{
e.KeyChar = (char)Keys.Tab;
SendKeys.Send(e.KeyChar.ToString());
}
// else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0)
// {
// // Let the edit control handle control and alt key combinations
// }
else if (this.allowSpace && e.KeyChar == ' ')
{

}
else
{
// Consume this invalid key and beep
e.Handled = true;
// MessageBeep();
}
}

public int IntValue
{
get
{
return Int32.Parse(this.Text);
}
}

public decimal DecimalValue
{
get
{
return Convert.ToDecimal(this.Text);
}
}

public bool AllowSpace
{
set
{
this.allowSpace = value;
}

get
{
return this.allowSpace;
}
}

}
}
using System;

Valeu a todos pelas respostas. RESOLVIDO

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...