Creando un refugio para perros -- # campo con beginner campo con object-oriented camp codereview Relacionados El problema

Creating a Dog Shelter


2
vote

problema

Español

Fondo: He creado un programa que permite a un usuario ingresar información sobre su perro. La salida es la factura que recibirán acorde el peso de su perro.

El problema: creo que estoy haciendo esto ineficientemente. No me gusta la forma en que he estructurado el código actual y me gustaría mejorar mi código. Me gustaría criticar a otros programadores sobre cómo mejorar este código

El código:

  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace TheBarkingLotHasslerChasenB {     class Program     {         static bool isInt = false;         static bool isDouble = false;          static void Main(string[] args)         {             int id = 0;             int age = 0;             double weight = 0.0;              id = HandleInput("Please enter your Owner ID", id);             String name = HandleInput("Please enter the name of your dog");             String breed = HandleInput("Please enter the breed of your dog");             age = HandleInput("Please enter the age of your dog", age);             weight = HandleInput("Please enter the weight of your dog", weight);              DogOwner dogOwner = new DogOwner(id);              Dog fido = new Dog(age, name, breed, weight);              DetermineCost(fido.GetDogWeight());                Console.Read();         }          private static int HandleInput(String input, int output)         {             do             {                 Console.WriteLine(input);                 isInt = int.TryParse(Console.ReadLine(), out output);                 if (isInt)                 {                     Console.WriteLine("");                     return output;                 }                  Console.WriteLine("Please enter an integer value ");               } while (!isInt);              return 0;          }          private static String HandleInput(String input)         {             String output;              Console.WriteLine(input);              output = Console.ReadLine();              Console.WriteLine("");              return output;         }          private static double HandleInput(String input, double output)         {             do             {                 Console.WriteLine(input);                 isDouble = double.TryParse(Console.ReadLine(), out output);                 if (!isDouble)                 {                     Console.WriteLine("Please enter a decimal value ");                 }                 // If the user didn't enter a decimal, they are asked for input once again                 else                 {                     Console.WriteLine("");                     return output;                 }             } while (!isDouble);              return 0.0;         }          private static void DetermineCost(double weight)         {             if (weight < 15.0)             {                 Console.WriteLine("Your bill for weekly day care is going to be: $55.00");             }             else if (weight > 15.0 && weight <= 30.0)             {                 Console.WriteLine("Your bill for weekly day care is going to be: $75.00");             }             else if (weight > 30.0 && weight <= 80.0)             {                 Console.WriteLine("Your bill for weekly day care is going to be: $105.00");             }             else             {                 Console.WriteLine("Your bill for weekly day care is going to be: $125.00");             }         }     } }   
Original en ingles

Background: I have created a program that allows a user to input information about their dog. The output is the bill they will receive commensurate their dog's weight.

The Problem: I believe I am doing this inefficiently. I don't like the way I have structured the current code and would like to improve upon my code. I would like critique from other programmers on how to improve this code

The Code:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace TheBarkingLotHasslerChasenB {     class Program     {         static bool isInt = false;         static bool isDouble = false;          static void Main(string[] args)         {             int id = 0;             int age = 0;             double weight = 0.0;              id = HandleInput("Please enter your Owner ID", id);             String name = HandleInput("Please enter the name of your dog");             String breed = HandleInput("Please enter the breed of your dog");             age = HandleInput("Please enter the age of your dog", age);             weight = HandleInput("Please enter the weight of your dog", weight);              DogOwner dogOwner = new DogOwner(id);              Dog fido = new Dog(age, name, breed, weight);              DetermineCost(fido.GetDogWeight());                Console.Read();         }          private static int HandleInput(String input, int output)         {             do             {                 Console.WriteLine(input);                 isInt = int.TryParse(Console.ReadLine(), out output);                 if (isInt)                 {                     Console.WriteLine("");                     return output;                 }                  Console.WriteLine("Please enter an integer value\n");               } while (!isInt);              return 0;          }          private static String HandleInput(String input)         {             String output;              Console.WriteLine(input);              output = Console.ReadLine();              Console.WriteLine("");              return output;         }          private static double HandleInput(String input, double output)         {             do             {                 Console.WriteLine(input);                 isDouble = double.TryParse(Console.ReadLine(), out output);                 if (!isDouble)                 {                     Console.WriteLine("Please enter a decimal value\n");                 }                 // If the user didn't enter a decimal, they are asked for input once again                 else                 {                     Console.WriteLine("");                     return output;                 }             } while (!isDouble);              return 0.0;         }          private static void DetermineCost(double weight)         {             if (weight < 15.0)             {                 Console.WriteLine("Your bill for weekly day care is going to be: $55.00");             }             else if (weight > 15.0 && weight <= 30.0)             {                 Console.WriteLine("Your bill for weekly day care is going to be: $75.00");             }             else if (weight > 30.0 && weight <= 80.0)             {                 Console.WriteLine("Your bill for weekly day care is going to be: $105.00");             }             else             {                 Console.WriteLine("Your bill for weekly day care is going to be: $125.00");             }         }     } } 
        

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

1.- Debe intentar declarar y instarte las variables al mismo tiempo. En lugar de int age = 0; age = getUserInput(); esto es mejor: int age = getUserInput();


2.- Un método debe hacer una cosa, DeterminecostEctETET debe "determinar el costo", si desea informar cuánto es el costo, debe crear otro método (en este caso, creé PrintWeeklyCost() )


3.- Debes saber dónde viven las variables, quiero decir, el alcance de las variables. En su caso isInt y isDouble debe ir solo donde se utilizarán.


4.- El if else if para ver rangos numéricos; Es realmente fácil dar pequeños errores. ¿Qué pasa si el perro es exactamente 15 kg / libras / lo que sea? ¿Será el costo 125? Una forma fácil de descubrir pequeños errores es ser consistente y, para mí, ese estilo ayuda mucho.


5.- ¿Qué pasa si el usuario no ingresa texto en absoluto en HandlestringInput? (Aquí cambié el nombre de los métodos, creo que los métodos de sobrecarga pueden agregar más complejidad a su programa cuando no es necesario, ¡ahora si está aprendiendo, adelante!) ¡El cheque por errores en la entrada es una buena práctica!
  class Program {      static void Main(string[] args)     {         int id = HandleIntegerInput("Please enter your Owner ID");         String name = HandleStringInput("Please enter the name of your dog");         String breed = HandleStringInput("Please enter the breed of your dog");         int age = HandleIntInput("Please enter the age of your dog");         double weight = HandleDoubleInput("Please enter the weight of your dog");          DogOwner dogOwner = new DogOwner(id);         Dog newDog = new Dog(age, name, breed, weight);          double cost = DetermineCost(newDog.GetDogWeight());         PrintWeeklyBill(cost);          Console.Read();     }       private static int HandleIntInput(String input)     {         Console.WriteLine(input);          int output;         bool validInput = false;         while(!validInput)         {             Console.WriteLine("Please enter an integer value ");                 validInput = int.TryParse(Console.ReadLine(), out output);         }          Console.WriteLine("");         return output;     }       private static String HandleStringInput(String input)     {         Console.WriteLine(input);          String output;         bool validInput = false;         while(String.IsNullOrEmpty(output))         {             Console.WriteLine("Please enter a valid text value ");                 output = Console.ReadLine();         }          Console.WriteLine("");         return output;     }       private static double HandleDoubleInput(String input)     {         Console.WriteLine(input);          double output;         bool validInput = false;         while(!validInput)         {             Console.WriteLine("Please enter an decimal value ");                 validInput = double.TryParse(Console.ReadLine(), out output);         }          Console.WriteLine("");         return output;     }       private static double DetermineCost(double weight)     {         double cost;         if (weight <= 15.0)         {             cost = 55.00;         }         else if (15.0 < weight && weight <= 30.0)         {             cost = 75.00;         }         else if (30.0 < weight && weight <= 80.0)         {             cost = 105.00;         }         else         {             cost = 125.00;         }          return cost;     }      private static void PrintWeeklyBill(double costPerWeek)     {         String costMsge = String.Format("Your bill for weekly day care is going to be: $", costPerWeek);         Console.WriteLine(costMsge);     } }   
 

1.- You should try to declare and instance variables at the same time. Instead of int age = 0; age = getUserInput(); this is better: int age = getUserInput();


2.- One method should do one thing, DetermineCost should 'determine cost', if you want to inform how much the cost is, then you should create another method (in this case I created PrintWeeklyCost())


3.- You should know where the variables are going to live, I mean, the scope of the variables. In you case isInt and isDouble should go only where they are going to be used.


4.- The if else if to see numeric ranges; it's really easy to make little mistakes. What if the dog is exactly 15 kg/pounds/whatever?. Will the cost be 125? An easy way to discover little errors is being consistent and, for me, that style helps a lot.


5.- What if the user doesn't enter text at all in HandleStringInput? (here I changed the name of the methods, I think that overloading methods can add more complexity to your program when it is not needed, now if you are learning go ahead!) Check for errors in input is a good practice !
class Program {      static void Main(string[] args)     {         int id = HandleIntegerInput("Please enter your Owner ID");         String name = HandleStringInput("Please enter the name of your dog");         String breed = HandleStringInput("Please enter the breed of your dog");         int age = HandleIntInput("Please enter the age of your dog");         double weight = HandleDoubleInput("Please enter the weight of your dog");          DogOwner dogOwner = new DogOwner(id);         Dog newDog = new Dog(age, name, breed, weight);          double cost = DetermineCost(newDog.GetDogWeight());         PrintWeeklyBill(cost);          Console.Read();     }       private static int HandleIntInput(String input)     {         Console.WriteLine(input);          int output;         bool validInput = false;         while(!validInput)         {             Console.WriteLine("Please enter an integer value\n");                 validInput = int.TryParse(Console.ReadLine(), out output);         }          Console.WriteLine("");         return output;     }       private static String HandleStringInput(String input)     {         Console.WriteLine(input);          String output;         bool validInput = false;         while(String.IsNullOrEmpty(output))         {             Console.WriteLine("Please enter a valid text value\n");                 output = Console.ReadLine();         }          Console.WriteLine("");         return output;     }       private static double HandleDoubleInput(String input)     {         Console.WriteLine(input);          double output;         bool validInput = false;         while(!validInput)         {             Console.WriteLine("Please enter an decimal value\n");                 validInput = double.TryParse(Console.ReadLine(), out output);         }          Console.WriteLine("");         return output;     }       private static double DetermineCost(double weight)     {         double cost;         if (weight <= 15.0)         {             cost = 55.00;         }         else if (15.0 < weight && weight <= 30.0)         {             cost = 75.00;         }         else if (30.0 < weight && weight <= 80.0)         {             cost = 105.00;         }         else         {             cost = 125.00;         }          return cost;     }      private static void PrintWeeklyBill(double costPerWeek)     {         String costMsge = String.Format("Your bill for weekly day care is going to be: $", costPerWeek);         Console.WriteLine(costMsge);     } } 
 
 
   
   
3
 
vote

Aquí hay algunos más consejos sobre cómo optimizarlo con C # 7 .


Primero cree algunos métodos de propósito general. Ellos se encargarán de leer la entrada.

El método principal es el ReadString . Seguirá tratando de leer hasta que la entrada no sea nula o vacía.

  private static string ReadString(string prompt) {     var result = default(string);     do Console.WriteLine(prompt); while (string.IsNullOrEmpty(result = Console.ReadLine()));     return result; }   

El siguiente método es el ReadInt32 . Internamente utiliza int age = getUserInput();0 , pero intenta analizar la entrada como int age = getUserInput();1 siempre que sea necesario. No hay necesidad de una variable extra con C # 7.

  int age = getUserInput();2  

Lo mismo ocurre con el método 99887766555443313 . Con los pesos y las monedas que más probablemente quiera usar int age = getUserInput();4 y no int age = getUserInput();5 debido a los posibles errores de redondeo.

  int age = getUserInput();6  

El método antiguo int age = getUserInput();7 se puede dividir en dos métodos.

Uno solo calculará el costo UND utiliza el nuevo interruptor con filtros. Para obtener el valor correcto, solo necesita verificar el límite superior y comience con el más bajo. No es necesario especificar el rango.

  int age = getUserInput();8  

y el otro lo imprimirá. Utiliza una interrupción de cadena con formato.

  int age = getUserInput();9  

Por último, ensamblarlos en un programa de trabajo:

  PrintWeeklyCost()0  
 

Here are some more tips how to optimize it with C# 7.


Create a few general-purpose methods first. They'll take care of reading the input.

The main method is the ReadString. It'll keep trying to read until the input is not null or empty.

private static string ReadString(string prompt) {     var result = default(string);     do Console.WriteLine(prompt); while (string.IsNullOrEmpty(result = Console.ReadLine()));     return result; } 

The next method is the ReadInt32. Internally it uses ReadString but tries to parse the input as int as long as necessary. There's no need for an extra variable with C# 7.

private static int ReadInt32(string prompt) {     while (!int.TryParse(ReadString(prompt), out int result)) Console.WriteLine("Please enter an integer value.");     return result; } 

The same does the ReadDecimal method. With weights and currencies you most probably want to use decimal and not double because of the possible rounding errors.

private static decimal ReadDecimal(string prompt) {     while (!decimal.TryParse(ReadString(prompt), out decimal result)) Console.WriteLine("Please enter an decimal value.");     return result; } 

The old DetermineCost method can be splitted up into two methods.

One will only calculate the cost und utilizes the new switch with filters. To get the right value you just need to check the upper bound and start with the lowest one. You don't need to specify the range.

private static decimal CalcCost(decimal weight) {     switch (weight)     {         case decimal i when i <= 15: return 55.0m;         case decimal i when i <= 30: return 75.0m;         case decimal i when i <= 80: return 105.0m;         default: return 125.0m;     } } 

and the other one will print it. It uses string-interpolation with formatting.

private static void PrintCost(decimal cost) {     Console.WriteLine($"Your bill for weekly day care is going to be: ${cost:0.00}"); } 

Lastly you assemble them into a working program:

static void Main(string[] args) {     var id = ReadInt32("Please enter your Owner ID");     var name = ReadString("Please enter the name of your dog");     var breed = ReadString("Please enter the breed of your dog");     var age = ReadInt32("Please enter the age of your dog");     var weight = ReadDecimal("Please enter the weight of your dog");      var cost = CalcCost(weight);     PrintCost(cost);     Console.Read(); } 
 
 
   
   
3
 
vote
  • No devuelva PrintWeeklyCost()1 . Devuelva PrintWeeklyCost()2 o no use PrintWeeklyCost()3 y devuelva el PrintWeeklyCost()4 .

      PrintWeeklyCost()5  
  • PrintWeeklyCost()6 debe devolver un PrintWeeklyCost()7 .

  • Cálculo separado de los informes.
 
  • Don't return 0. Return void or don't use output and return the int.

    private static int HandleInput(String input, int output) 
  • DetermineCost should return a string.

  • Separate calculation from reporting .
 
 

Relacionados problema

0  Creación de múltiples objetos del extracto de SQL Server  ( Creating multiple objects from sql server extract ) 
He creado una solución prototipo simplificada como una especie de prueba de concepto antes de comenzar un programa más grande. Aquí están los datos de prueb...

1  Pasando un objeto a la vista en CodeIgner  ( Passing an object to the view in codeigniter ) 
Estoy tratando de usar un objeto y persistirlo en la base de datos. He creado una clase en la carpeta de la biblioteca. <?php if (!defined('BASEPATH'))...

3  General Pathfinder en Python  ( General pathfinder in python ) 
Recientemente trabajé en un proyecto donde tuve la siguiente configuración: $_{456}$6 Ninguno del Código es relevante, no tendrá que poder ejecutar nada...

1  Clase de juego, escrito usando enums  ( Playing card class written using enums ) 
Escribí una clase de tarjeta A Mientras vuelvas a esta publicación aquí: Pregunta previa Sé que ha pasado mucho tiempo, pero recientemente regresé al proyec...

5  Solicitud de Tkinter para administrar las tareas escolares  ( Tkinter application to manage school tasks ) 
Soy un principiante en la programación de la OOP y me pregunto cuál es la mejor manera de poner todas las ventanas y funciones de una aplicación de ventana en...

8  Árbol fractal orientado a objetos  ( Object oriented fractal tree ) 
Hice un árbol fractal orientado a objetos en JavaScript utilizando la biblioteca P5, consta de tres archivos: fraternal tree.js sucursal.js flower.js ...

10  "Stardust" Simulador 2D Gravity - Seguimiento 1: Los planetas  ( Stardust 2d gravity simulator follow up 1 the planets ) 
Este es un seguimiento para el juego de gravedad del simulador 2D pregunta. Desde entonces, he desarrollado mis habilidades de JavaScript, y ahora esto...

6  Objetos de Java para un programa de sniffer de red  ( Java objects for a network sniffer program ) 
Estoy trabajando en un programa de sniffer de red, cuya estructura utiliza 3 clases principales: clase de marco - uno por marco monitoreado, sostiene la re...

8  Envoltura Libusb Library en C ++  ( Wrapping libusb library in c ) 
Quiero usar la biblioteca de Libusb en mi aplicación C ++. He creado clases que envuelven las funciones de Libusb. Puede ver que la API de Libusb se divide en...

5  ¿Podría mejorarse este sistema de profundidad para un juego?  ( Could this depth system for a game be improved ) 
Todavía soy nuevo en C ++ y no tengo una gran idea de mi codificación, así que estaría muy agradecido a cualquiera y todos los que le otorgan consejos. Ade...




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