Demostración de uso de matriz simple -- java campo con beginner campo con array camp codereview Relacionados El problema

Simple array usage demonstration


4
vote

problema

Español

Acabo de terminar este código para mi propio propósito de práctica. Este código funciona bien, pero entiendo que todavía hay muchos problemas insidiosos. Se apreciaría cualquier consejo de mejora. Así que aquí va:

  Package DS;  import java.util.*;   public class basic_Array {  public static void main(String[] args) {      int option;      System.out.println("Welcome to basic array test, please choose your testing subject: ");      Scanner user_option = new Scanner(System.in);       do{          System.out.println("Option 1: Simple one dimensional array.");         System.out.println("Option 2: Simple two dimensional array. (under construction)");         System.out.println("Option 0: Exit program");           option = user_option.nextInt();         System.out.println("current option is: " + option);          switch(option){          case 1:             //simple array input method              simple_a1();             break;         case 2:             simple_a2();             break;         }       }while(option != 0);      System.out.println("Program terminated...");     user_option.close();  }  private static void simple_a1() {      int[] a1 = new int[5];      int in_num;                                                             //redundant but clear.      Scanner user_input = new Scanner(System.in);      for(int i = 0; i < 5; i++){          System.out.println("Request input for item " + i);         in_num = user_input.nextInt();         a1[i] = in_num;         System.out.println("Got it, next one ");     }      System.out.println("The numbers in a1 are: ");      for(int i2: a1){         System.out.print(i2 + " ");     }      System.out.println(" End of testing 1, back to main menu...");   }  private static void simple_a2() {      System.out.println("This function still under construction, back to main menu..."); }  }   

Editar en 2/26/2017:

Gracias por Ebrown y otros ingresos, he modificado la estructura de mi programa y he agregado algunas funciones nuevas.

También tengo una pregunta sobre varios escáneres que he puesto en mi programa. Hice alguna búsqueda en ella y muchas personas dice que esta es también una mala práctica que puede confundir al programador a largo plazo. Creo que causa el error cuando intento cerrar el objeto de escáner en el método SIMPLE_A1, por lo que solo cierro el escáner User_option (ubicado en el método principal). Entonces, mi pregunta es: ¿aún causará la fuga de recursos?

Original en ingles

I just finished this code for my own practice purpose. This code works just fine but I understand there still a lot insidious problems. Any advice for improvement would be appreciated. So here it goes:

Package DS;  import java.util.*;   public class basic_Array {  public static void main(String[] args) {      int option;      System.out.println("Welcome to basic array test, please choose your testing subject: ");      Scanner user_option = new Scanner(System.in);       do{          System.out.println("Option 1: Simple one dimensional array.");         System.out.println("Option 2: Simple two dimensional array. (under construction)");         System.out.println("Option 0: Exit program");           option = user_option.nextInt();         System.out.println("current option is: " + option);          switch(option){          case 1:             //simple array input method              simple_a1();             break;         case 2:             simple_a2();             break;         }       }while(option != 0);      System.out.println("Program terminated...");     user_option.close();  }  private static void simple_a1() {      int[] a1 = new int[5];      int in_num;                                                             //redundant but clear.      Scanner user_input = new Scanner(System.in);      for(int i = 0; i < 5; i++){          System.out.println("Request input for item " + i);         in_num = user_input.nextInt();         a1[i] = in_num;         System.out.println("Got it, next one ");     }      System.out.println("The numbers in a1 are: ");      for(int i2: a1){         System.out.print(i2 + " ");     }      System.out.println("\nEnd of testing 1, back to main menu...");   }  private static void simple_a2() {      System.out.println("This function still under construction, back to main menu..."); }  } 

Edit in 2/26/2017:

Thanks for EBrown and others input, I've modified my program structure and added a few new functions.

I also have a question on multiple scanners I've put in my program. I did some search on it and many people says this is also a bad practice that may confuse the programmer in long run. I think it cause the error when I trying to close the scanner object in simple_a1 method, so I only close the user_option scanner (located in main method). So my question is: will it still cause resource leak?

        

Lista de respuestas

10
 
vote
vote
La mejor respuesta
 

Hablemos de SRP por el momento (no voy a cubrir nada más que esto). SRP (o principio de responsabilidad única) dicta que cada uno y cada uno de los componentes del código deben tener exactamente una responsabilidad .

Así que vamos a ver todo su código de arriba a abajo y determinar qué responsabilidades tenemos en cada método.

Comenzaremos con main :

  1. Información de salida sobre la definición del programa al usuario;
  2. Aceptar y procesar la entrada del usuario;
  3. Llame a los métodos apropiados basados ​​en la entrada del usuario;

Es más de uno, pero eso está bien, debemos finalizar nuestro análisis para tomar decisiones adecuadas sobre qué hacer a continuación. Veamos a simple_a1 :

  1. artículos de proceso en una matriz;
  2. Aceptar y procesar la entrada del usuario;
  3. Agregar entrada de usuario a la matriz;
  4. Información de la matriz de impresión;
  5. Informe a la persona que llama volvemos al menú principal;

Eso es mucho, e incluso simple_a2 tiene más de una responsabilidad :

  1. Informe al usuario la función no se implementa;
  2. Informe al usuario que estamos regresando al menú principal;

¿Qué sucede cuando no volveremos al menú principal de ninguno de esos métodos? Ahora tiene múltiples lugares que tiene que modificar, y en una aplicación de producción más grande que significaría roturas muy posibles .

Así que vamos a eliminar las responsabilidades hasta que cada método solo se haya ido.

Vamos a empezar con simple_a1 :

Podemos tomar el siguiente bloque y extraerlo a un nuevo método:

  System.out.println("Request input for item " + i); in_num = user_input.nextInt(); a1[i] = in_num; System.out.println("Got it, next one ");   

Esto lo hace exactamente una cosa : Pregunta al usuario por un número y lo guarde en la matriz. Nosotros no lo almacenaremos en la matriz en nuestro Sub-Método, pero obtendremos las indicaciones. Vamos a crear un nuevo método:

  private static int getNumber(Scanner input, int index) {     System.out.println("Request input for item " + index);     int result = input.nextInt();     System.out.print("Got it");     return result; }   

perfecto, así que esto tiene una responsabilidad. No es el más bonito , pero lo hará. A continuación, tenemos que implementar esto en nuestro otro método:

  for (int i = 0; i < 5; i++) {     a1[i] = getNumber(user_input, i);      if (i + 1 < 5) {         System.out.println(", next one");     } }   

Entonces, nuestra solicitud de entrada está separada de nuestro procesamiento, eso es bueno, pero podemos hacerlo mejor.

El bloque es ahora algo en la línea de:

  int[] a1 = new int[5]; Scanner input = new Scanner(System.in);  for (int i = 0; i < 5; i++) {     a1[i] = getNumber(input, i);      if (i + 1 < 5) {         System.out.println(", next one");     } }   

Bueno, todo este bloque tiene una responsabilidad: construir una matriz. Para que podamos extraer eso más allá:

  private static int[] buildArray(int size) {     int[] result = new int[5];     Scanner input = new Scanner(System.in);      for (int i = 0; i < 5; i++) {         result[i] = getNumber(input, i);          if (i + 1 < 5) {             System.out.println(", next one");         }     }      input.close();      return result; }   

Bueno, así que ahora simple_a1 parece:

  simple_a10  

Pero todavía tenemos tres Responsabilidades restantes:

  1. construir una matriz;
  2. Imprimir la matriz;
  3. Informe al usuario que volvemos al menú principal;

Bueno, podemos hacer un método 998877666554433111 :

  simple_a12  

Luego finalmente terminamos simple_a13 :

  simple_a14  

Así que estamos reduciendo a una responsabilidad: procesar una matriz . Está formado por pasos, pero la implementación para aquellos pasos no es parte de simple_a15 .

Siguiente Vamos a arreglar simple_a16 :

  simple_a17  

Entonces, no nos importa Donde Volvemos a, solo nos importa que estemos regresando.

Finalmente, arreglar simple_a18 es fácil:

  simple_a19  

Tenemos todos nuestros componentes principales separados, y podemos claramente ver qué se supone que se debe hacer cada sección.


En general, buen comienzo, espero ver más de usted aquí. :)

 

Let's talk about SRP for the moment (I'm not going to cover anything else but this). SRP (or Single-Responsibility Principle) dictates that each and every component of code should have exactly one responsibility.

So we're going to look at all your code top-to-bottom and determine what responsibilities we have in each method.

We'll start with main:

  1. Output information regarding programme definition to user;
  2. Accept and process user input;
  3. Call appropriate method(s) based on user input;

So that's more than one, but that's fine, we need to finish our analysis to make appropriate decisions on what to do next. Let's look at simple_a1:

  1. Process items in an array;
  2. Accept and process user input;
  3. Add user input to array;
  4. Print array information;
  5. Inform the caller we're going back to the main menu;

That's a lot, and even simple_a2 has more than one responsibility:

  1. Inform the user the feature is not implemented;
  2. Inform the user we are returning to the main menu;

What happens when we're not going back to the main menu again from either of those methods? Now you have multiple places that you have to modify, and in a larger, production application that would mean very possible breakages.

So we're going to eliminate responsibilities until each and every method only has one left.

Let's start with simple_a1:

We can take the following block and extract it to a new method:

System.out.println("Request input for item " + i); in_num = user_input.nextInt(); a1[i] = in_num; System.out.println("Got it, next one "); 

This does exactly one thing: prompt the user for a number and store it in the array. We won't store it in the array in our sub-method, but we'll extract the prompting out. Let's create a new method:

private static int getNumber(Scanner input, int index) {     System.out.println("Request input for item " + index);     int result = input.nextInt();     System.out.print("Got it");     return result; } 

Perfect, so this has one responsibility. It's not the prettiest, but it will do. Next we have to implement this in our other method:

for (int i = 0; i < 5; i++) {     a1[i] = getNumber(user_input, i);      if (i + 1 < 5) {         System.out.println(", next one");     } } 

So now our input prompting is separated from our processing, that's good but we can do better.

The block is now something along the lines of:

int[] a1 = new int[5]; Scanner input = new Scanner(System.in);  for (int i = 0; i < 5; i++) {     a1[i] = getNumber(input, i);      if (i + 1 < 5) {         System.out.println(", next one");     } } 

Well this whole block has one responsibility: build an array. So we can extract that out further:

private static int[] buildArray(int size) {     int[] result = new int[5];     Scanner input = new Scanner(System.in);      for (int i = 0; i < 5; i++) {         result[i] = getNumber(input, i);          if (i + 1 < 5) {             System.out.println(", next one");         }     }      input.close();      return result; } 

Good, so now simple_a1 looks like:

private static void simple_a1() {     int[] a1 = buildArray(5);      System.out.println("The numbers in a1 are: ");      for(int i2: a1){         System.out.print(i2 + " ");     }      System.out.println("\nEnd of testing 1, back to main menu..."); } 

But we still have three remaining responsibilities:

  1. Build an array;
  2. Print the array;
  3. Inform the user we're going back to the main menu;

Well we can make a printArray method:

private static void printArray(int[] printArray) {     for (int val : printArray) {         System.out.print(val + " ");     } } 

Then we finally finish simple_a1:

private static void simple_a1() {     int[] a1 = buildArray(5);     printArray(a1);     System.out.print("\nEnd of testing 1"); } 

So we're down to one responsibility: process an array. It's made up of steps, but the implementation for those steps is not part of simple_a1.

Next we'll fix simple_a2:

private static void simple_a2() {     System.out.print("This function still under construction"); } 

So we don't care where we return to, we only care that we're returning.

Finally, fixing main is easy:

public static void main(String[] args) {     System.out.println("Welcome to basic array test, please choose your testing subject: ");     Scanner input = new Scanner(System.in);      mainMenu(input);      System.out.println("Program terminated...");     input.close(); }  private static void mainMenu(Scanner input) {     int option = 0;      do {         System.out.println("Option 1: Simple one dimensional array.");         System.out.println("Option 2: Simple two dimensional array. (under construction)");         System.out.println("Option 0: Exit program");          option = user_option.nextInt();         System.out.println("current option is: " + option);          switch(option) {             case 1:                 //simple array input method                  simple_a1();                 break;             case 2:                 simple_a2();                 break;             case 0:                 return;             // In C# the `case else` is `default`, not sure what Java's is             default:                 System.out.print("Invalid option: " + option);                 break;         }          System.out.println(", back to main menu");     } while (option != 0); } 

We've got all our major components separated, and we can clearly see what each section is supposed to do.


Overall, good start, I hope to see more from you here. :)

 
 
5
 
vote

try-with-resources

Desde java 7, debe usar try-with-resources para un manejo seguro y eficiente de sus recursos de E / S subyacente, es decir, System.in . Esto significa que no tiene que volver a crear un envoltorio , o para llamar explícitamente su método 9988776665544334 al final.

Convención de nombramiento / estilo

La convención de nomenclatura predeterminada de Java es camelCase , en lugar de snake_case . Sin embargo, es más importante mantener una convención de manera consistente, por lo que está bien dentro de esta pregunta. :)

Es posible que también desee darle a sus métodos nombres más descriptivos, ya que simple_a1() / 9988776655544338 no transmite mucha información.

También encuentro que hay demasiada espacios en blanco vertical en su código, será más legible si puede eliminar todas las líneas vacías.

 

try-with-resources

Since Java 7, you should use try-with-resources for safe and efficient handling of your underlying I/O resources, i.e. System.in. This means you do not have to re-create a Scanner wrapper around it, or to explicitly call its close() method in the end.

Naming/styling convention

Java's default naming convention is camelCase, instead of snake_case. It's more important to keep to one convention consistently though, so it's fine within this question. :)

You may also want to give your methods more descriptive names, as simple_a1()/simple_a2() does not convey much information.

I also find that there's too much vertical whitespace in your code, it will be more readable if you can remove all the empty lines.

 
 
 
 
2
 
vote

Todo Ebrown dijo con esto ... excepción menor ... El cierre de la entrada debe preceder al anuncio que se realiza el programa. No puedo agregar comentarios o simplemente lo hubiera hecho un comentario que sugiere al cambio al cambio.

  public static void main(String[] args) {     System.out.println("Welcome to basic array test, please choose your testing subject: ");      Scanner input = new Scanner(System.in);      mainMenu(input);      input.close();      System.out.println("Program terminated..."); }   
 

Everything EBrown said with this ... minor exception ... the input close should precede the announcement that the program is done. I can not add comments or I would have simply made it a comment suggesting to EBrown the change.

public static void main(String[] args) {     System.out.println("Welcome to basic array test, please choose your testing subject: ");      Scanner input = new Scanner(System.in);      mainMenu(input);      input.close();      System.out.println("Program terminated..."); } 
 
 
 
 

Relacionados problema

2  Importando datos en Excel  ( Importing data into excel ) 
¿Existe una forma más fácil de importar datos en una matriz de Excel u otra estructura de datos? He intentado investigar colecciones, pero he encontrado la D...

6  Fusionando dos varias de clases  ( Merging two array of classes ) 
Tengo esta función que debe fusionar dos matriz de clases cuando id es igual a id de Array2. Para la simplicidad, convirtí una matriz en un arraylist pa...

6  Buscar número de más en una matriz 2D  ( Find number of plus in a 2d array ) 
Problema Chargrid El CharGrid La clase encapsula una matriz de 2-D con una pareja de operaciones. INT APULUS () Busque un patrón '+' en la cuadrícu...

6  Clase de matriz multidimensional simple en C ++ 11  ( Simple multi dimensional array class in c11 ) 
La nueva versión del código se puede revisar en Clase de matriz multidimensional simple en C ++ 11 - Seguimiento . El siguiente código implementa una clas...

2  Devuelve verdadero si los elementos de una matriz no contienen uno u otro  ( Return true if the elements of an array do not contain one or the other ) 
Estoy completando gradualmente los ejercicios de codificación para Java. Aquí está el uno acabo de hacer: Dada una matriz de INTS, devuelva verdadera si ...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...

5  Encuentra el primer número único de la matriz  ( Find first unique number from array ) 
Se me pidió que creara una función que devuelva el primer entero único de la matriz de enteros. En un caso de éxito, la función devuelve el número único en un...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

2  Cargando imágenes en el fondo para una vista de tabla  ( Loading images in the background for a table view ) 
Tengo fetchData2 MÉTODO QUE LLENA MI imagesArray : func fetchData(){ let imageQuery = PFUser.query() imageQuery?.whereKey("username", contained...

2  Mejora de la función que compara dos cadenas  ( Improving function that compares two strings ) 
Estoy aprendiendo C y he hecho esta función muy simple para comparar dos cuerdas. Me gustaría saber cómo se puede mejorar: int match(char* string1, char* s...




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