Conversión Celsius y Fahrenheit -- java campo con beginner campo con unit-conversion camp codereview Relacionados El problema

Celsius and Fahrenheit Conversion


5
vote

problema

Español

Este es un proyecto escolar presentado el año pasado, y lo he estado mirando y tratando de averiguar qué podría mejorar. Sé que usé x + 14 y x + 15 El camino incorrecto en Fahrenheit, que era simplemente la pereza en ese momento y no queriendo romper algo antes de entregarlo. Me gustaría Algunos consejos sobre mejoras que puedo hacer, o malos hábitos, debería mantenerme alejado de en el futuro.

  x + 16  
Original en ingles

This is a school project submitted last year, and I've been looking over it and trying to figure out what I could improve on. I know I used celsiusInput and fahrenheitOutput the wrong way around in Fahrenheit conversion, that was just laziness at that point and not wanting to break something before handing it in. I would like some advice on improvements I can make, or bad habits I should stay away from in the future.

import java.awt.*; import javax.swing.*; import java.awt.event.*;  public class window{     static boolean refresh, celsius=true, fahrenheit=true;     protected static JTextField celsiusInput;     protected static JTextArea fahrenheitOutput;      private static void createAndShowGUIfahrenheit() {         celsiusInput = new JTextField(8);         fahrenheitOutput = new JTextArea(1, 8);         fahrenheitOutput.setEditable(false);                  JFrame window = new JFrame("Temperature Conversion");         JButton convert = new JButton ("Convert");         JLabel label = new JLabel("Fahrenheit to Celsius");          JPanel convert1 = new JPanel();             convert1.add(convert);         JPanel celsius = new JPanel();             celsius.add(celsiusInput);         JPanel fahrenheit = new JPanel();             fahrenheit.add(fahrenheitOutput);           window.setSize(350, 150);         window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);         window.setVisible(true);         window.setResizable(false);         window.setLocation(1235, 465);          window.add(convert1, BorderLayout.CENTER);         window.add(celsius, BorderLayout.WEST);         window.add(fahrenheit, BorderLayout.EAST);         window.add(label, BorderLayout.NORTH);          convert.addActionListener (new ActionListener(){             public void actionPerformed(ActionEvent ae){                 refresh = !refresh;                  System.out.println("toggled");                  if(refresh==true){                      float celTemp = Float.parseFloat(celsiusInput.getText());                     float T = celTemp - 32;                     T = T * 5/9;                     fahrenheitOutput.setText(String.valueOf(T));                     System.out.println("true");                                      refresh=false;                 }             }         });     }      private static void createAndShowGUIcelsius() {         celsiusInput = new JTextField(8);         fahrenheitOutput = new JTextArea(1, 8);         fahrenheitOutput.setEditable(false);                  JFrame window = new JFrame("Temperature Conversion");         JButton convert = new JButton ("Convert");         JLabel label = new JLabel("Celsius to Fahrenheit");           JPanel convert1 = new JPanel();             convert1.add(convert);         JPanel celsius = new JPanel();             celsius.add(celsiusInput);         JPanel fahrenheit = new JPanel();             fahrenheit.add(fahrenheitOutput);           window.setSize(350, 150);         window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);         window.setVisible(true);         window.setResizable(false);         window.setLocation(385, 465);          window.add(convert1, BorderLayout.CENTER);         window.add(celsius, BorderLayout.WEST);         window.add(fahrenheit, BorderLayout.EAST);         window.add(label, BorderLayout.NORTH);          convert.addActionListener (new ActionListener(){             public void actionPerformed(ActionEvent ae){                 refresh = !refresh;                  System.out.println("toggled");                  if(refresh==true){                      float celTemp = Float.parseFloat(celsiusInput.getText());                     float T = celTemp * 9/5;                     T = T + 32;                     fahrenheitOutput.setText(String.valueOf(T));                     System.out.println("true");                          refresh=false;                 }             }         });     }      public static void main( String[] args){          JFrame mainwindow = new JFrame("Temperature Conversion");         JButton quitbtn = new JButton("Exit");         JButton cels = new JButton ("Celsius to Fahrenheit");         JButton fahr = new JButton ("Fahrenheit to Celsius");         JLabel label = new JLabel("Choose an option");           mainwindow.setSize(350, 150);         mainwindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         mainwindow.setVisible(true);         mainwindow.setResizable(false);         mainwindow.setLocation(785, 265);          mainwindow.add(quitbtn, BorderLayout.SOUTH);         mainwindow.add(cels, BorderLayout.WEST);         mainwindow.add(fahr, BorderLayout.EAST);         mainwindow.add(label, BorderLayout.NORTH);          quitbtn.addActionListener(e -> System.exit(0));           cels.addActionListener (new ActionListener(){             public void actionPerformed(ActionEvent ae){                 celsius = false;                 System.out.println("CELSIUS TRIGGERED");                                 if (celsius==false){                     createAndShowGUIcelsius();                     System.out.println("new window celsius");                     celsius = true;                 }             }         });          fahr.addActionListener (new ActionListener(){             public void actionPerformed(ActionEvent ae){                 fahrenheit = false;                 System.out.println("FAHRENHEIT TRIGGERED");                 if (fahrenheit==false){                     createAndShowGUIfahrenheit();                     System.out.println("new window fahrenheit");                     fahrenheit = true;                 }             }         });     } } 
        

Lista de respuestas

4
 
vote

Primero, algunos nitpicks de estilo: En todo momento, sería mejor tener más nombres de variables descriptivos, deletreados, deletreados. Como lector, 9988777665544330 es mucho más fácil de entender que quitbtn .

Los nombres de las clases deben estar en mayúsculas ( window - & gt; Window3 ). Tampoco es genial tener una variable local el mismo nombre que su clase. Me sorprende que no te haya dado una advertencia.

Dado que refresh==true siempre evaluará a refresh , puede simplificar if (refresh==true) a if (refresh ).

Mi conocimiento de Java no es genial, por lo que esta parte siguiente será en gran medida una sugerencia vaga, pero debería ser clara lo que estoy tratando de decir. Tienes mucho código repetido, que es una bandera para refactorizar. En particular, podría tener una clase 99887766555443388 FarhenheitToCelsiusConverter y quitbtn0 como subclases. Luego podría tener un método abstracto 998877666554433111 que anulan. La ubicación podría ser pasada como un parámetro. Esto sigue al Principio seco .

Al final, está configurando quitbtn2 a FALSE, y luego verifique si son falsos ... No estoy seguro de entender en qué sirven las banderas. Son necesarios?

En un nivel superior, esto probablemente no sería genial si necesita agregar unidades Kelvin o Rankine. No voy a tratar de dar un consejo de UX, pero si es algo de lo que quiere preocuparse, hay un montón de muestras en línea para buscar inspiración.

 

First, some style nitpicks: Throughout, it would be better to have more descriptive, spelled out, camelCased variable names. As a reader, quitButton is so much easier to understand than quitbtn.

Class names should be capitalized (window -> Window). It's also not great to have a local variable the same name as your class. I'm surprised that didn't give you a warning.

Since refresh==true will always evaluate to refresh, you can simplify if (refresh==true) to if (refresh).

My knowledge of Java is not great, so this next part will be largely a vague suggestion, but it should be clear what I'm trying to say. You have a lot of repeated code, which is a flag for refactoring. In particular, you could have a TemperatureConverter class, with FarhenheitToCelsiusConverter and CelsiusToFahrenheitConverter as subclasses. Then you could have an abstract convertTemperature method that they override. The location could be passed in as a parameter. This follows the DRY Principle.

At the very end, you're setting fahrenheit/celsius to false, and then checking if they're false... I'm not sure I understand what purpose the flags serve at all. Are they needed?

On a higher-level, this probably wouldn't be great if you need to add Kelvin or Rankine units. I'm not going to try to give UX advice, but if that's something you want to worry about, there are plenty of online samples to look at for inspiration.

 
 
3
 
vote

No tengo mucha experiencia con Java, pero hay algún consejo general que puedo ofrecer.


En este momento no tiene componentes reutilizables. La lógica para la conversión de temperaturas se acumula dentro de su código GUI.

Si quiso adaptar este programa para ejecutar desde un CLI o ser usado dentro de otro programa, actualmente sería imposible.

¿Recomendaría que extraerá el canalización de la conversión de temperatura en su propia clase, tal vez quitbtn3 ?

  quitbtn4  

Esto le permitiría agregar fácilmente la conversión a otras unidades.


No sé nada sobre las clases de la GUI que está usando, pero parece que se está repitiendo cuando las construyas. ¿Podría extender quitbtn5 para construir todo el componente, o escribir su propia clase de GUI?

algo como:

  quitbtn6  
 

I don't have much experiance with Java but there is some general advice that I can offer.


At the moment you have no reusable components. The logic for converting temperatures is bueried inside your GUI code.

If you wanted to adapt this program to run from a CLI or be used within another program it would currently be impossible.

I would recomend that you extract the handeling of temperature conversion into its own class, maybe Temperature?

public class Temperature {      private float temperature; // the temperature stored in Celsuis      public function Temperature(float temperature, String unit) {         // Convert from the current unit to Celsius     }      public float inFahrenheit() {         // perform conversion here     }  } 

This would allow you to easily add conversion to other units.


I don't know anything about the GUI classes that you are using but you seem to be repeating yourself when building them. Could you extend JFrame to build the entire component, or write your own GUI class?

Something like:

public class TemperatureWindow {     public function TemperatureWindow() {         // build up a the frame and button and input and so on          // store them as member variables     }      public void setInputText(String text){...}      public void setListener(/* whatever */){...} }  
 
 
 
 

Relacionados problema

1  Formateo de datos en un Controlador UIView en una aplicación de entrenamiento de peso  ( Formatting data in a uiviewcontroller in a weight training app ) 
Estoy escribiendo una aplicación de entrenamiento con pesas que calcula un máximo de una repetición y tiene varias opciones, incluida la grabación de sus asce...

0  Convertidor de escala de temperatura en java  ( Temperature scale converter in java ) 
Estoy creando este convertidor. Hay tres unidades que se pueden convertir: Kelvin, Celcius y Fahrenheit. Utilicé dos variables para verificar qué unidad se el...

6  Control angular para ingresar latitud y longitud con validación  ( Angular control for inputting latitude and longitude with validation ) 
He construido un control personalizado para manejar la entrada del usuario en un formato legible por humanos, pero ahorre en un formato de máquina. Debe tene...

4  Conversión entre diferentes unidades de temperatura  ( Converting between different units of temperature ) 
La tarea es convertir una temperatura en una lista de Fahrenheit, Celsius o Kelvin a las otras dos temperaturas en la lista. Aquí está mi código: /* *...

3  Convertir el valor de bitcoin basado en el tipo de cambio de JSON API  ( Convert bitcoin value based on exchange rate from json api ) 
Estoy aprendiendo F # e intentando encontrar una forma más 'funcional' de codificar un programa simple que recupera el precio de BTC y calcula el valor del EU...

23  Celsius → Tabla de conversión Fahrenheit  ( Celsius %e2%86%92 fahrenheit conversion table ) 
Es más difícil de hacer que criticar . Aquí está mi intento de implementar una tabla de conversión Celsius-to-Fahrenheit en C ++. dataclass3 Algunas pr...

2  Aplicación de conversión de la unidad  ( Unit conversion application ) 
Tengo un formulario con los cuadros de lista utilizados para las conversiones de la unidad. Estoy usando el unitnetnet paquete. Aquí están mis preguntas: ...

4  Enum Class para unidades de peso  ( Enum class for weight units ) 
Tengo algunas clases de enumeración para unidades, como unidades de peso (kg y lb). Estoy traduciendo el código a Qt C ++ de Java, y me pregunto cuál es la me...

2  Conversión de Celsius a Fahrenheit y viceversa  ( Converting from celsius to fahrenheit and vice versa ) 
Mi código le pide al usuario el tipo de conversión, los grados y escupe el resultado de nuevo. Preguntará al usuario que solicite nuevamente el tipo de conver...

4  Aplicación de conversión de la unidad  ( Unit converter application ) 
Estoy trabajando en una aplicación de convertidor de unidad de Android, pero llegué al punto en que tengo que asignar las fórmulas al método de cálculo. En es...




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