Aplicación que calcula el interés en un pago mensual -- # campo con beginner campo con finance camp codereview Relacionados El problema

App that calculates interest into a monthly payment


5
vote

problema

Español

Esto funciona y sirve al propósito. Pero, al ser mi primer código, es descuidado y sé que hay algo que pude hacer para que sea más fácil. Me gustaría la opinión de todos sobre lo que podría hacer para simplificar esto.

Esto lleva la entrada del usuario desde un formulario de estudio visual y sale los datos después de calcular las cosas. Me gustaría limpiar esto o conocer diferentes rutas que pueden ser más útiles. Si pudieras explicar por qué funciona mejor, eso es una ventaja porque estoy tratando de aprender!

  private void buttonPayment_Click(object sender, EventArgs e)     {          double sellPrice = 0;         double stateTax = 0;         double totalFinanced = 0;         double amtTax = 0;         double docFee = 179;         double tagFees = 0;         double tradeAllowance = 0;         double interestRate = 0;         double taxableAmount = 0;         double rebate = 0;         double cashDown = 0;         double term = 0;         double monthlyRate = 0;         double monthlyPayment = 0;         double topNumber1 = 0;         double topNumber = 0;         double bottomNumber = 0;         double topNumber2 = 0;         double totalInterest = 0;         double interestCharge = 0;          sellPrice = Double.Parse(textBoxSellPrice.Text);         tradeAllowance = Double.Parse(textBoxTradeAllowance.Text);         tagFees = Double.Parse(textBoxTagFees.Text);         rebate = Double.Parse(textBoxRebate.Text);         interestRate = Double.Parse(textBoxRate.Text);         term = Double.Parse(textBoxTerm.Text);         cashDown = Double.Parse(textBoxCashDown.Text);           if (comboBoxState.Text.Contains("NJ"))         {             stateTax = .06875;         }          if (comboBoxState.Text.Contains("DE"))         {             stateTax = .0425;         }          if (comboBoxState.Text.Contains("PA"))         {             stateTax = .06;         }          taxableAmount = sellPrice - tradeAllowance;         amtTax = taxableAmount * stateTax;         totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);           labelTax.Text = amtTax.ToString(format: "0.00");         labelAmtFinanced.Text = totalFinanced.ToString(format: "0.00");         labelDocFee.Text = docFee.ToString(format: "0.00");         labelTagFees.Text = tagFees.ToString(format: "0.00");          if (interestRate == 0)         {              monthlyPayment = totalFinanced / term;             labelMonthlyPayment.Text = monthlyPayment.ToString(format: "0.00");             labelInterestCharge.Text = 0.ToString();          }          else         {             //Calculatations             interestRate = interestRate * .01;             monthlyRate = interestRate / 12;              //Calculates Payments              topNumber1 = 1 + monthlyRate;             topNumber2 = Math.Pow(topNumber1, term);             topNumber = monthlyRate * topNumber2;             bottomNumber = topNumber2 - 1;             totalInterest = topNumber / bottomNumber;              monthlyPayment = totalFinanced * totalInterest;             interestCharge = (monthlyPayment * term) - totalFinanced;              // Prints to the labels              labelMonthlyPayment.Text = monthlyPayment.ToString(format: "0.00");             labelInterestCharge.Text = interestCharge.ToString(format: "0.00");         }      }      private void buttonClear_Click(object sender, EventArgs e)     {         ClearAllText(this);         ClearAllCombo(this);         ClearAllmasked(this);         labelTax.Text = "---";         labelDocFee.Text = "---";         labelTagFees.Text = "---";         labelAmtFinanced.Text = "---";         labelMonthlyPayment.Text = "---";         labelInterestCharge.Text = "---";     }     private void ClearAllText(Control con)     {         foreach (Control c in this.Controls)         {             if (c is TextBox && c != null)             {                 c.Text = "0";             }         }     }      private void ClearAllCombo(Control con)     {         foreach (Control c in con.Controls)         {             if (c is ComboBox && c != null)             {                 c.Text = "NJ";             }         }     }     private void ClearAllmasked(Control con)     {         foreach (Control c in con.Controls)         {             if (c is MaskedTextBox)                 ((MaskedTextBox)c).ResetText();             else                 ClearAllText(c);         }     }   

Aquí hay una imagen pequeña del programa para que pueda hacer referencia a lo que estoy trabajando:

ingrese la descripción de la imagen aquí

¡Gran consejo! ¡Gracias un millón por el consejo hasta ahora! He estado saliendo aprendiendo C # durante tanto tiempo y me alegro de ver a una comunidad tan acogedora.

Original en ingles

This does work and serves the purpose. But, being my first code, it's sloppy and I know there are somethings I could of done to make it easier. I would like everyone's opinion on what I could do to simplify this.

This takes user input from a Visual Studio Form and outputs data after calculating things. I would like to clean this up or know different routes that may be more useful. If you could explain why it works better that's a plus because I'm trying to learn!

private void buttonPayment_Click(object sender, EventArgs e)     {          double sellPrice = 0;         double stateTax = 0;         double totalFinanced = 0;         double amtTax = 0;         double docFee = 179;         double tagFees = 0;         double tradeAllowance = 0;         double interestRate = 0;         double taxableAmount = 0;         double rebate = 0;         double cashDown = 0;         double term = 0;         double monthlyRate = 0;         double monthlyPayment = 0;         double topNumber1 = 0;         double topNumber = 0;         double bottomNumber = 0;         double topNumber2 = 0;         double totalInterest = 0;         double interestCharge = 0;          sellPrice = Double.Parse(textBoxSellPrice.Text);         tradeAllowance = Double.Parse(textBoxTradeAllowance.Text);         tagFees = Double.Parse(textBoxTagFees.Text);         rebate = Double.Parse(textBoxRebate.Text);         interestRate = Double.Parse(textBoxRate.Text);         term = Double.Parse(textBoxTerm.Text);         cashDown = Double.Parse(textBoxCashDown.Text);           if (comboBoxState.Text.Contains("NJ"))         {             stateTax = .06875;         }          if (comboBoxState.Text.Contains("DE"))         {             stateTax = .0425;         }          if (comboBoxState.Text.Contains("PA"))         {             stateTax = .06;         }          taxableAmount = sellPrice - tradeAllowance;         amtTax = taxableAmount * stateTax;         totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);           labelTax.Text = amtTax.ToString(format: "0.00");         labelAmtFinanced.Text = totalFinanced.ToString(format: "0.00");         labelDocFee.Text = docFee.ToString(format: "0.00");         labelTagFees.Text = tagFees.ToString(format: "0.00");          if (interestRate == 0)         {              monthlyPayment = totalFinanced / term;             labelMonthlyPayment.Text = monthlyPayment.ToString(format: "0.00");             labelInterestCharge.Text = 0.ToString();          }          else         {             //Calculatations             interestRate = interestRate * .01;             monthlyRate = interestRate / 12;              //Calculates Payments              topNumber1 = 1 + monthlyRate;             topNumber2 = Math.Pow(topNumber1, term);             topNumber = monthlyRate * topNumber2;             bottomNumber = topNumber2 - 1;             totalInterest = topNumber / bottomNumber;              monthlyPayment = totalFinanced * totalInterest;             interestCharge = (monthlyPayment * term) - totalFinanced;              // Prints to the labels              labelMonthlyPayment.Text = monthlyPayment.ToString(format: "0.00");             labelInterestCharge.Text = interestCharge.ToString(format: "0.00");         }      }      private void buttonClear_Click(object sender, EventArgs e)     {         ClearAllText(this);         ClearAllCombo(this);         ClearAllmasked(this);         labelTax.Text = "---";         labelDocFee.Text = "---";         labelTagFees.Text = "---";         labelAmtFinanced.Text = "---";         labelMonthlyPayment.Text = "---";         labelInterestCharge.Text = "---";     }     private void ClearAllText(Control con)     {         foreach (Control c in this.Controls)         {             if (c is TextBox && c != null)             {                 c.Text = "0";             }         }     }      private void ClearAllCombo(Control con)     {         foreach (Control c in con.Controls)         {             if (c is ComboBox && c != null)             {                 c.Text = "NJ";             }         }     }     private void ClearAllmasked(Control con)     {         foreach (Control c in con.Controls)         {             if (c is MaskedTextBox)                 ((MaskedTextBox)c).ResetText();             else                 ClearAllText(c);         }     } 

Here's a small picture of the program so you can reference to what I'm working with:

enter image description here

GREAT ADVICE! Thanks a million for the advice so far! I have been putting off learning c# for so long and I'm glad to see such a welcoming community.

        
         
         

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Mi opinión honesta sería hacer una clase de calculadora de intereses, pero podemos trabajar en una sola función.

Si aún no tiene alguna validación de entrada en otro lugar, consideraría el uso de Double.tryParse () para asegurarse de que la entrada se pueda convertir. De esta manera, puede manejar cualquier error de conversión de entrada.

  if(!Double.TryParse(textBoxSellPrice.Text, out sellPrice) {     // Error Handling }   

¿Puede el texto de entrada del usuario en el combobox? Esto presenta un problema, ya que otros valores dependen del valor. Lo bloquearía y cambiaría las declaraciones de IF a un diccionario para que pueda ser más fácil de mantener si se cambiara.

  Dictionary<string, double> stateTaxes = new Dictionary<string, int>() {     { "NJ", .06875 },     { "DE", .0425},     { "PA", .06 } };  if(stateTaxes.ContainsKey(comboBoxState.Text) {     stateTax = stateTaxes[comboBoxState.Text]; }   

Solo por mi propia preferencia, no declararía todas las variables al principio. Ese muro de las declaraciones es un poco desalentador y engañoso al intentar revisar esto. Eliminaría cualquier valores que no se deriven de la forma y funcionen con funcionalización de otros cálculos con variables localizadas. Hacer esto también podría eliminar la necesidad de los COSATRATE == 0 Bloque condicional.

  totalInterest = interestRate == 0 ? 0 : topNumber / bottomNumber;   

Y ahora que tiene todas las variables pobladas para todas las situaciones, agruparía todas las tareas de control de control para que las tenga a todos. Dado que todos estos necesitan el mismo formato, podría hacer una extensión para el doble que acepte la etiqueta como un parámetro.

  private void ToLabel(this double value, Label lbl) {     lbl.Text = value.ToString(format: "0.00") }   

entonces ...

  amtTax.ToLabel(labelTax); totalFinanced.ToLabel(labelAmtFinanced); // etc....   

Aquí es cómo podría verse como una clase

  class InterestCalculator {     private const double docFee = 179;      private double sellPrice = 0;     private double rebate= 0;     private double cashDown = 0;     private double tradeAllowance = 0;     private string state;     private double tagFees = 0;     private double interestRate = 0;     private double term = 0;     private Dictionary<string, double> stateTaxes = new Dictionary<string, int>()     {         { "NJ", .06875 },         { "DE", .0425},         { "PA", .06 }     };      public double StateTax     {         get         {             if(stateTaxes.ContainsKey(state)             {                 return stateTaxes[state];             }             return 0;         }     }      public double TaxableAmount     {         get { return sellPrice - tradeAllowance; }     }      public double Tax     {         get { return TaxableAmount * StateTax; }     }      public double Deductions     {         get { return rebate + tradeAllowance; }     }      public double Fees     {         get { return docFee + tagFees; }     }      public double TotalFinanced     {         get { return TaxableAmount + Tax + Fees - Deductions; }     }      public double MonthlyRate     {         get { return interestRate / 12; }     }      public double CompoundedInterestRate     {         get { return Math.Pow(MonthlyRate + 1, term); }     }      public double TotalInterest     {         get          {              if(interestRate == 0)             {                 return 0;             }             return ((MonthlyRate + 1) * CompoundedInterestRate) / (CompoundedInterestRate - 1);         }     }      public double MonthlyPayment     {         get { return TotalFinanced * TotalInterest; }     }      public double InterestCharge     {         get { (MonthlyPayment * term) - TotalFinanced; }     }      public InterestCalculator(string state, double sellPrice, double rebate,          double cashDown, double tradeAllowance, double tagFees, double interestRate, double term)     {         this.state = state;         this.sellPrice = sellPrice;         this.rebate = rebate;         this.cashDown = cashDown;         this.tradeAllowance = tradeAllowance;         this.tagFees = tagFees;         this.interestRate = interestRate * .01;         this.term = term;     } }   

y podría ser utilizado como este

  private void buttonPayment_Click(object sender, EventArgs e) {     // This is without validation     double sellPrice = Double.Parse(textBoxSellPrice.Text);     double tradeAllowance = Double.Parse(textBoxTradeAllowance.Text);     double tagFees = Double.Parse(textBoxTagFees.Text);     double rebate = Double.Parse(textBoxRebate.Text);     double interestRate = Double.Parse(textBoxRate.Text);     double term = Double.Parse(textBoxTerm.Text);     double cashDown = Double.Parse(textBoxCashDown.Text);     string state = comboBoxState.Text;      InterestCalculator calculator = new InterestCalculator(state, sellPrice, tradeAllowance, tagFees, rebate, interestRate, term, cashDown);      calculator.Tax.ToLabel(labelTax);     calculator.TotalFinanced.ToLabel(labelAmtFinanced);     // etc.... }   
 

My honest opinion would be to make an interest calculator class, but we can work on a single function.

If you do not already have some input validation elsewhere, I would consider the use of Double.TryParse() to ensure that the input can be converted. This way you can handle any input conversion errors.

if(!Double.TryParse(textBoxSellPrice.Text, out sellPrice) {     // Error Handling } 

Can the user input text into the combobox? This presents an issue since other values are dependent on the value. I would lock that down and change the if statements to a dictionary so that it can be easier to maintain if it were to change.

Dictionary<string, double> stateTaxes = new Dictionary<string, int>() {     { "NJ", .06875 },     { "DE", .0425},     { "PA", .06 } };  if(stateTaxes.ContainsKey(comboBoxState.Text) {     stateTax = stateTaxes[comboBoxState.Text]; } 

Just out of my own preference, I would not declare every variable at the beginning. That wall of declarations is a bit daunting and misleading when trying to review this. I would remove any values that are not derived from the form and functionalize other other calculations with localized variables. Doing this could also remove the need for the interestRate == 0 conditional block.

totalInterest = interestRate == 0 ? 0 : topNumber / bottomNumber; 

And now that you have all variables populated for all situations, I would group all of the control text assignments so that you have them all together. Since these all need the same formatting, you could make an extension for double that accepts the Label as a parameter.

private void ToLabel(this double value, Label lbl) {     lbl.Text = value.ToString(format: "0.00") } 

So then...

amtTax.ToLabel(labelTax); totalFinanced.ToLabel(labelAmtFinanced); // etc.... 

Here is how it could look as a class

class InterestCalculator {     private const double docFee = 179;      private double sellPrice = 0;     private double rebate= 0;     private double cashDown = 0;     private double tradeAllowance = 0;     private string state;     private double tagFees = 0;     private double interestRate = 0;     private double term = 0;     private Dictionary<string, double> stateTaxes = new Dictionary<string, int>()     {         { "NJ", .06875 },         { "DE", .0425},         { "PA", .06 }     };      public double StateTax     {         get         {             if(stateTaxes.ContainsKey(state)             {                 return stateTaxes[state];             }             return 0;         }     }      public double TaxableAmount     {         get { return sellPrice - tradeAllowance; }     }      public double Tax     {         get { return TaxableAmount * StateTax; }     }      public double Deductions     {         get { return rebate + tradeAllowance; }     }      public double Fees     {         get { return docFee + tagFees; }     }      public double TotalFinanced     {         get { return TaxableAmount + Tax + Fees - Deductions; }     }      public double MonthlyRate     {         get { return interestRate / 12; }     }      public double CompoundedInterestRate     {         get { return Math.Pow(MonthlyRate + 1, term); }     }      public double TotalInterest     {         get          {              if(interestRate == 0)             {                 return 0;             }             return ((MonthlyRate + 1) * CompoundedInterestRate) / (CompoundedInterestRate - 1);         }     }      public double MonthlyPayment     {         get { return TotalFinanced * TotalInterest; }     }      public double InterestCharge     {         get { (MonthlyPayment * term) - TotalFinanced; }     }      public InterestCalculator(string state, double sellPrice, double rebate,          double cashDown, double tradeAllowance, double tagFees, double interestRate, double term)     {         this.state = state;         this.sellPrice = sellPrice;         this.rebate = rebate;         this.cashDown = cashDown;         this.tradeAllowance = tradeAllowance;         this.tagFees = tagFees;         this.interestRate = interestRate * .01;         this.term = term;     } } 

And it could be used like this

private void buttonPayment_Click(object sender, EventArgs e) {     // This is without validation     double sellPrice = Double.Parse(textBoxSellPrice.Text);     double tradeAllowance = Double.Parse(textBoxTradeAllowance.Text);     double tagFees = Double.Parse(textBoxTagFees.Text);     double rebate = Double.Parse(textBoxRebate.Text);     double interestRate = Double.Parse(textBoxRate.Text);     double term = Double.Parse(textBoxTerm.Text);     double cashDown = Double.Parse(textBoxCashDown.Text);     string state = comboBoxState.Text;      InterestCalculator calculator = new InterestCalculator(state, sellPrice, tradeAllowance, tagFees, rebate, interestRate, term, cashDown);      calculator.Tax.ToLabel(labelTax);     calculator.TotalFinanced.ToLabel(labelAmtFinanced);     // etc.... } 
 
 
   
   
4
 
vote

sentencias de interruptores

Tiene alguna lógica sobre el impuesto estatal, y en este momento tiene tres casos en los que el valor no es 0. ¿Qué sucede si necesita editar el código para agregar más y más? Si se encuentra en un caso en el que tiene 3 o más si las declaraciones establecieran un valor, debe mirar las declaraciones de interruptores. Si solo tiene dos, podrían usar una Operador Ternario . Ejemplo:

  double stateTax = 0; switch (comboBoxState.Text) {     case "NJ":         stateTax = .06875;         break;     case "DE":         stateTax = .0425;         break;     case "PA":         stateTax = .06;         break;     default:         stateTax = 0; }   

Agrupación lógica de operadores matemáticos

Si echamos un vistazo a la siguiente línea: 9988776655544331 Mientras que esto tiene un orden de cálculo más obvio, no es tan obvio para cada desarrollador. Cuando agrega división y multiplicación en la mezcla, es realmente difícil de seguir. Hay una forma realmente sencilla de hacer esto, use los soportes:

  var percentageDifference = (23 / 65) * 100;   

También evitaría la cantidad de argumentos que está calculando en una declaración. Ya ha reducido esto en cierta medida mediante la introducción de taxableAmount y amtTax . ¿Puedes extraer más cálculos en las variables que tienen sentido?

nombramiento consistente de variables

Comienzas bastante firmemente con el nombramiento de tus variables, y todos tienen sentido para mí hasta que, y me disculpan si esto tiene sentido desde un punto de vista financiero:

  topNumber1 = 1 + monthlyRate; topNumber2 = Math.Pow(topNumber1, term); topNumber = monthlyRate * topNumber2;   

¿Cómo topNumber , topNumber1 y topNumber28 difierte? Por supuesto, difieren en su cálculo, pero si estoy más abajo en su método y veo topNumber + topNumber2 , tendré que desplazarse hacia arriba para obtener su significado. ¿Hay un nombre más adecuado que pueda dar estos?

Además, y esto es un poco Nitpickery, pero las variables totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);0 y totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);1 . Supongo que ha acortado el totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);2 en totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);3 de la cantidad de palabra. En primer lugar, diría que sean consistentes, ya sea que usen ambos usen totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);4 o ambos usen totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);5 . En segundo lugar, tiene intellisense, por lo que solo tiene que agregar los caracteres adicionales cuando declare la variable y, después de eso, no está ahorrando en ningún momento acortando la palabra, pero puede hacer que otro desarrollador en el código tenga que necesitar Cheque doble que usted significa la cantidad.

Separando su código lógicamente

Creo que necesita pensar cómo puede aislar mejor las partes de su código. Actualmente, toda la lógica está dentro del mismo botón, haga clic en Handler.

En primera vista, parece que la mayor parte del código se reduce a:

  totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);6  

se basa en el mismo grupo de lógica. Es posible que pueda refactar esto haciendo algo como:

  totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);7  

Cuando puede romper su lógica en funciones más pequeñas como esta, es más fácil para otros desarrolladores seguir cuando lo lean. Ha agrupado un montón de lógica en una descripción allí y reduce la complejidad de su control principal de botón. Mira qué más puedes aislar ...

 

Switch Statements

You have some logic about state tax, and right now you have three cases where the value is not 0. What about if you need to edit the code to add more and more in? If you find yourself in a case where you have 3 or more if statements to set one value, then you should look at switch statements. If you only have two you could use a ternary operator. Example:

double stateTax = 0; switch (comboBoxState.Text) {     case "NJ":         stateTax = .06875;         break;     case "DE":         stateTax = .0425;         break;     case "PA":         stateTax = .06;         break;     default:         stateTax = 0; } 

Logical grouping of mathematical operators

If we take a look at the following line: totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown); Whilst this has a more obvious calculation order, it isn't that obvious to every developer. When you add division and multiplication into the mix it gets really difficult to follow. There's a really simple way of doing this, use brackets:

var percentageDifference = (23 / 65) * 100; 

I would also avoid the number of arguments you're calculating in one statement. You've already reduced this to some extent by introducing taxableAmount and amtTax. Can you extract any more calculations into variables that make sense?

Consistent naming of variables

You start off pretty strongly with the naming of your variables, and they all make sense to me until, and do excuse me if this makes sense from a financial point of view:

topNumber1 = 1 + monthlyRate; topNumber2 = Math.Pow(topNumber1, term); topNumber = monthlyRate * topNumber2; 

How do topNumber, topNumber1 and topNumber2 differ? Of course they differ in their calculation, but if I'm further down in your method and I see topNumber + topNumber2, I'll have to scroll up to garner their meaning. Is there a more suitable name you can give these?

Furthermore, and this is a bit nitpickery but the variables taxableAmount and amtTax. I'm assuming you've shortened the amt in amtTax from the word amount. Firstly, I'd say be consistent, either make them both use amt or both use amount. Secondly, you have intellisense so you only have to add in the extra characters when you declare the variable and after that you're not really saving any time by shortening the word, but you might make another developer in the code feel like they need to double check that you do mean amount.

Separating your code logically

I think you need to think how you can better isolate parts of your code. Currently all of your logic is within the same button click handler.

On first glance, it looks like most of the code down to:

labelTagFees.Text = tagFees.ToString(format: "0.00"); 

Is based on the same group of logic. You might be able to refactor this by doing something like:

private int CalculateTotalFinanced() {     double stateTax = 0;     switch (comboBoxState.Text)     {         case "NJ":             stateTax = .06875;             break;         case "DE":             stateTax = .0425;             break;         case "PA":             stateTax = .06;             break;         default:             stateTax = 0;     }      taxableAmount = sellPrice - tradeAllowance;     amtTax = taxableAmount * stateTax;     totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown); } 

When you can break your logic into smaller functions like this, its easier for other developers to follow when they read it. You've grouped a bunch of logic into one description there and it reduces the complexity of your main click button handler. See what else you can isolate...

 
 
     
     
1
 
vote

un par de cosas:

aquí:

  totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);8  

A totalFinanced = (amtTax + taxableAmount + docFee + tagFees - rebate - cashDown);9 (Impuestos) Simplificará ese código a:

  var percentageDifference = (23 / 65) * 100; 0  

En lugar de borrar cada control individualmente, cree una clase personalizada (MyPanel) que hereda de un contenedor como var percentageDifference = (23 / 65) * 100; 1 . Poblas el panel con los controles que necesita y sus valores predeterminados. Una vez que cree una instancia global (Newpanel) de este contenedor y agregue a su formulario, puede volver a inicializarlo al asistir a la instancia en un nuevo constructor:

  var percentageDifference = (23 / 65) * 100; 2  
 

A couple of things:

Here:

if (comboBoxState.Text.Contains("NJ")) {     stateTax = .06875; }  if (comboBoxState.Text.Contains("DE")) {     stateTax = .0425; }  if (comboBoxState.Text.Contains("PA")) {     stateTax = .06; } 

A Dictionary<string,double>(taxes) will simplify that code to:

stateTax = taxes[comboBoxState.Text]; 

Instead of clearing every control individually, create a custom class(MyPanel) that inherits from a container like Panel. You populate the panel with the controls you need and their default values. Once you create a global instance(newPanel) of this container and add it to your form, you can re-initialize it by assiging the instance to a new constructor:

newPanel = new MyPanel(); 
 
 
   
   
1
 
vote

Aquí hay algunos más trucos:

  var percentageDifference = (23 / 65) * 100; 3  

Puede convertir estas líneas en:

  var percentageDifference = (23 / 65) * 100; 4  

o puede simplemente crear una extensión

  var percentageDifference = (23 / 65) * 100; 5  

y úsalo como:

  var percentageDifference = (23 / 65) * 100; 6  

  var percentageDifference = (23 / 65) * 100; 7  

con C # 6 ahora puede hacer:

  var percentageDifference = (23 / 65) * 100; 8  
 

Here are some more tricks:

labelTax.Text = "---"; labelDocFee.Text = "---"; labelTagFees.Text = "---"; labelAmtFinanced.Text = "---"; labelMonthlyPayment.Text = "---"; labelInterestCharge.Text = "---"; 

You can turn these lines into:

labelTax.Text = labelDocFee.Text = labelTagFees.Text = labelAmtFinanced.Text = labelMonthlyPayment.Text = labelInterestCharge.Text = "---"; 

or you can just create an extension

 public static Label ResetText(this Label label)  {       label.Text = "---";       return label;  } 

and use it like:

labelTax.ResetText(); 

labelTax.Text = amtTax.ToString(format: "0.00"); 

With C# 6 you can now do:

labelTax.Text = $"{amtTax:0.00}"; 
 
 
   
   
1
 
vote

mis dos centavos, Con respecto a la vida útil de las variables.

Cuando está declarando variables, debe hacerlo justo antes del lugar que se utilizará la variable. Y trate de mantener al mínimo el lapso donde va a vivir la variable.

Por ejemplo, en lugar de declarar estas variables al comienzo de su método, debe declararlas / instigarlas donde las usará.

en lugar de:

      double topNumber1 = 0;     double topNumber = 0;     double bottomNumber = 0;     double topNumber2 = 0;     double totalInterest = 0;     double interestCharge = 0;     ....(many, many lines of code before variables being used)..   

deberías hacer:

      ....         //Calculates Payments         double topNumber1 = 1 + monthlyRate;         double topNumber2 = Math.Pow(topNumber1, term);         double topNumber = monthlyRate * topNumber2;         ... etc..   

Básicamente si las variables deben vivir lo menos posible. Y deben ser declarados en su alcance respectivo (esas variables solo existen dentro del bloque if / también).

 

My two cents, Regarding variables life span.

When you are declaring variables, you should to do that just before the place that the variable will be used. And try to keep at minimum the span where the variable is going to live.

For example instead of declaring this variables at the beginning of your method you should declare/instance them where you are going to use them.

Instead of:

    double topNumber1 = 0;     double topNumber = 0;     double bottomNumber = 0;     double topNumber2 = 0;     double totalInterest = 0;     double interestCharge = 0;     ....(many, many lines of code before variables being used).. 

you should do:

    ....         //Calculates Payments         double topNumber1 = 1 + monthlyRate;         double topNumber2 = Math.Pow(topNumber1, term);         double topNumber = monthlyRate * topNumber2;         ... etc.. 

Basically if variables should live as less as possible. And they should be declared in their respective scope (those variables only exists inside the if/else block).

 
 
 
 

Relacionados problema

8  Validando una tarjeta de crédito  ( Validating a credit card ) 
Recientemente creé una extensión que detecta el tipo de tarjeta de crédito en función de los números ingresados ​​y los formatos. Estoy usando el algoritmo de...

2  Parser de datos de impuestos por carretera  ( Road tax data parser ) 
Estoy haciendo un analizador de datos para los datos de impuestos por carretera (costos) que analiza un archivo JSON con todos los nombres de variables extrañ...

3  Coloque el cálculo del costo del campamento de verano utilizando las hojas de Google  ( Summer camp cost calculation using google sheets ) 
Estoy haciendo una hoja que suma el costo total para un campamento de verano después del registro. Cada padre puede registrarse hasta cinco niños. Ya he hecho...

13  "¿Debes el gobierno?" clases  ( Do you owe the government classes ) 
¿Debería mis parámetros de paso de clase de clase internamente o de referencia de la clase de referencia variables de alcance? No estoy seguro del mejor enf...

2  Calculando el precio de los medios digitales  ( Calculating the price of digital media ) 
He tomado el mantenimiento de algún código, y lo ha reestructurado después de leer algunos documentos sobre PSR-2: this3 Quería preguntar si lo que he h...

3  Obtener datos de moneda de una matriz  ( Getting currency data out of an array ) 
Tengo un abandono de un botón que puede seleccionar diferentes monedas. Cuando selecciona uno, reemplaza el valor del botón con ese tipo de moneda, y muestra ...

0  Objeto de 'tasa de interés' de Python  ( Python interest rate object ) 
Recientemente he comenzado a aprender Python y el siguiente es mi intento de crear un objeto de "tasa de interés" que, dado uno de varios tipos de tasas de in...

5  Sistema de control de stock  ( Stock control system ) 
He programado este sistema de control de stock simple utilizando Javafx para GUI y PostgreSQL para una base de datos. Por favor, vaya a través de mi código ...

6  Biblioteca de cálculo financiero básico  ( Basic financial calculation library ) 
Estoy tratando de construir una biblioteca de JavaScript que realiza cálculos financieros básicos, como NPV, IRR, PV, FV, etc. Hasta ahora, he agregado la fun...

4  Aplicación básica de banca por Internet  ( Basic internet banking application ) 
Estoy programado en Java antes, pero creo que carezco de la "forma verdadera" de la programación (conceptos de OOP, diseño, algoritmo), así que comencé a apre...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos