"¡Hola, amigo! Hoy te hablaré sobre los estilos de código y la importancia del estilo de código".

"Comenzaré con lo que más importa.  El código Java debe ser fácil de leer.  El enfoque general del código es este: el código se escribe una vez pero se lee cien veces".

"Suponga que usted y otros 10 programadores están escribiendo una aplicación. Trabajan en la aplicación durante tres años, con lanzamientos intermedios cada tres meses".

"¿Así de largo?"

"¡Esto es Java, mi joven saltamontes! "¿Qué tal un sistema empresarial que se ejecuta en una docena de servidores y está escrito por 100 personas durante más de 6 años? Eso también pasa a veces".

"Guau".

"De todos modos, la regla principal, el requisito principal para el código es que debe ser fácil de leer para otros desarrolladores".

"En otros lenguajes de programación, las personas a menudo trabajan en pequeños equipos en tareas pequeñas, por lo que pueden tener otra regla principal, como '¿Funciona? Excelente'".

"En el transcurso de un par de años, todos los miembros de su equipo realizarán varios cambios en el código que ha escrito. Y cada vez tendrán que entender cómo funciona el código".

"Y el código incomprensible que funciona perfectamente es difícil de cambiar.  Lo desecharán y lo reescribirán a su manera.  Entonces, escriba código que otros puedan entender.  Si puede mejorar su código, entonces mejórelo. Si se puede mejorar, entonces hay que mejorarlo! "

"Si escribe código durante 15 minutos y luego pasa dos horas mejorándolo, lo está haciendo bien. ¿Cuánto tiempo le está ahorrando al equipo?"

"'2 horas para entender tu código' x 'las 100 veces que la gente necesitará entenderlo' = 200 horas".

"Saqué estas cifras de la nada, pero quiero que entiendas el problema y su alcance.  Tu código está creado para que lo lean otros programadores.  Todo lo demás es secundario".

"¿El código no funciona correctamente? Lo arreglaremos. ¿No está optimizado? Lo optimizaremos. ¿No está documentado? Agregaremos comentarios".

"¿ El código es difícil de leer? ¡Tira esa basura a la basura y escribe todo de nuevo desde cero! "

"No pensé que fuera tan importante".

"Una de las razones por las que Java es un lenguaje de programación líder es que todo el código Java está escrito para que lo lean otros programadores".

"Ahora pasemos a la segunda pregunta: ¿ cómo hace que su código sea lo más fácil de leer posible? "

"Cualquiera puede entender cuando alguien habla palabras familiares en su idioma nativo. Lo mismo es cierto aquí. El código es fácil de leer cuando un programador puede adivinar fácilmente:

A)  Qué hace cada método

B)  El propósito de cada clase

C)  Exactamente lo que almacena cada variable.

Todo esto se comunica en nombres: nombres de clases, nombres de métodos y nombres de variables. Además, hay estilo cuando se trata de nombrar variables. Y está el estilo de código".

"Estoy listo para escuchar".

" ¡ La programación se basa en un buen inglés!  Un programa bien escrito se lee como documentación técnica ordinaria. "

" Empecemos con los nombres " .

"El nombre de un método debe describir brevemente lo que hace el método. Luego, el código se puede leer como prosa simple".

Programa
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

"Así es como se lee un programa así".

Línea 1.

"El método se llama 'downloadPhoto'. Parece que descarga un archivo de fotos de Internet. ¿Dónde se descarga? Todavía no lo sabemos. ¿Desde dónde? El método tiene un parámetro llamado url, probablemente sea la URL para La descarga."

Línea 3.

"La variable resultFileName es declarada y asignada por TempHelper.createTempFileName();"

Así que esta debe ser la ruta local al archivo donde guardaremos nuestro archivo descargado.

"El nombre 'TempHelper' no nos dice nada. El sufijo 'Helper' dice que este es un tipo de clase de utilidad que no contiene una lógica comercial importante, sino que se usa para simplificar las tareas rutinarias que ocurren con frecuencia".

"El nombre del método 'createTempFileName' indica que este método crea y devuelve el nombre de un archivo temporal (archivo temporal). Un archivo temporal es un archivo temporal que se crea por un tiempo y luego generalmente se elimina cuando se cierra el programa. "

Línea 5.

"Se crea un objeto SingleFileDownloader y se asigna al descargador de variables".

Este es el objeto que descargará nuestro archivo de Internet.

"Se asigna un objeto SingleFileDownloader al descargador de variables. Por el nombre, podemos suponer que el programa tiene varios tipos de clases de descarga. Uno fue escrito para descargar archivos individuales, y probablemente podamos encontrar otros descargadores en el código para grupos de archivos con nombres como: MultiFileDownloader, FileGroupDownloader o DirectoryDownloader"

Línea 6.

"Configuramos la propiedad resultFileName del objeto del descargador igual al valor de la variable resultFileName. En otras palabras, le decimos al cargador dónde guardar el archivo descargado. Como era de esperar. Entonces, ¡básicamente estamos prediciendo el código!"

Línea 7.

"Llamamos al método de inicio. La descarga comienza. Eso tiene sentido. Me pregunto cómo sucede la descarga: en partes, en un hilo separado, ¿o todo aquí? Si descargamos todo aquí, podría tomar un mucho tiempo y tener consecuencias".

Líneas 8-11.

"Ah. Aquí vemos el bucle estándar escrito por alguien que espera que finalice una descarga. El objeto descargador tiene una propiedad done, que es devuelta por el método isDone(). Porque el método se llama isDone(), en lugar de getDone( ), concluimos que la variable done es un booleano o quizás un booleano".

Líneas 13-14.

"Si ocurre un error durante la descarga, entonces el método downloadPhoto devuelve un valor nulo. Es bueno que maneje los errores. Es malo que simplemente devuelva un valor nulo; no está claro cuál es el error. Sería mejor lanzar una excepción con información sobre el error."

Línea 16.

"Devolvemos la ruta al archivo local que contiene el archivo descargado".

"¡Vaya!"

"El código de este programa deja absolutamente claro lo que hace. Incluso puede adivinar cómo está organizado el programa y qué otras clases/métodos encontraremos".

"Ahora entiendo lo importantes que son los nombres".

"Más sobre nombres. A menudo puedes adivinar qué métodos tiene un objeto/clase. Por ejemplo, si un objeto es una colección, lo más probable es que tenga un método size() o count() para obtener el número de elementos. También , probablemente tendrá un método add() o insert(). Los elementos se recuperan de las clases de colección usando los métodos get/getItem/getElement".

"Si una variable se llama i, j o ​​k, lo más probable es que sea un contador de bucle".

"Si una variable se llama m o n, lo más probable es que tenga el tamaño de una matriz/colección".

"Si una variable se llama nombre, lo más probable es que sea una cadena que contenga el nombre de alguien".

"Si una clase se llama FileInputStream, entonces es simultáneamente un archivo y un flujo de entrada".

"Cuanto más código veas, más fácil será leer el código de los demás".

"Pero a veces hay código que es muy difícil de leer. En este caso, aquí hay un consejo muy práctico:"

Consejo
Escriba el código como si lo mantuviera un psicópata violento que sabe dónde vive .

"Eso es divertido y no divertido al mismo tiempo".

"Ahora un poco sobre los estilos utilizados para nombrar variables".

"Los desarrolladores de Java intentan dar nombres altamente informativos a las variables y métodos. Como resultado, los nombres a menudo constan de varias palabras. Hay 4 estilos para las mayúsculas de los nombres compuestos".

1) Minúsculas  : todas las palabras se escriben con letras minúsculas. Por ejemplo:

'Casa verde'  se convierte en 'invernadero'

'Chica de Hollywood'  se convierte en  'chica de Hollywood'

Este estilo se utiliza para nombres de paquetes.

2) Mayúsculas  : todas las palabras se escriben con letras mayúsculas y se separan con un guión bajo. Por ejemplo:

'Valor máximo'  se convierte en MAX_VALUE

'Recuento de gatos'  se convierte en CAT_COUNT

"Este estilo se usa para los nombres de las constantes (campos estáticos finales)".

3) CamelCase  : todas las palabras se escriben con letras minúsculas, excepto que la primera letra de cada palabra está en mayúsculas. Por ejemplo:

'Casa verde'  se convierte en  'GreenHouse'

'Chica de Hollywood'  se convierte en 'Chica de Hollywood'

Este estilo se utiliza para los nombres de clases e interfaces.

4) Lower CamelCase (caso mixto)  : todas las palabras se escriben con letras minúsculas, excepto la primera letra de cada palabra, excepto que la primera es mayúscula. Por ejemplo:

'Obtener ancho' se convierte en 'getWidth'

'Get Hollywood girl name' se convierte en  'getHollywoodGirlName'

"Este estilo se usa para los nombres de variables y métodos".

"Entonces, no hay demasiadas reglas".

1)  Todo está escrito en Lower CamelCase.

2)  Los nombres de clases e interfaces siempre se escriben con mayúscula.

3)  Los nombres de los paquetes siempre están en minúsculas.

4)  Las constantes siempre están en mayúsculas.

"Hay un par de matices, pero en general eso es lo que es".

Ahora sobre los métodos.  ¡Los nombres de los métodos casi siempre comienzan con un verbo! 'contar' es un mal nombre para un método. Es mejor llamarlo getCount(). Un método realiza alguna acción en el objeto:  startDownload , interrupt  , sleep  , loadPirateMusic .

"Como ya sabe, hay captadores y definidores para trabajar con las propiedades/campos de un objeto:  getName / setName , getCount / setCount , etc."

"La única excepción es para los booleanos. Para los booleanos, los nombres de getter usan 'es', no 'get', por ejemplo, isDone, isEmpty. De esta manera, se acerca más al habla ordinaria".

"¿Qué tal trabajar dos horas al día en lugar de 8? ¿Tentado?"

"¡Sí!"

"Como debe ser. Para un desarrollador de Java junior, el requisito básico es una excelente comprensión de los conceptos básicos de Java, es decir, Java Core".

"Tengo otra pregunta. ¿Por qué tenemos estos métodos diferentes para obtener la cantidad de elementos?"

Clase Método/propiedad para obtener el número de elementos
Cadena longitud ()
Formación longitud
Lista de arreglo tamaño ()
grupo de subprocesos cuenta activa ()

"En primer lugar, Java se inventó hace más de 20 años, antes de que se establecieran requisitos como setCount / getCount , y había un enfoque común tomado del lenguaje C para 'hacerlo lo más breve posible'".

"Segundo, la semántica juega un papel aquí. Cuando hablamos de una matriz, hablamos de su longitud. Cuando hablamos de una colección, hablamos de su tamaño".

"Qué interesante lección".

"Me gustaría contarte más, pero me temo que no lo recordarás todo de una vez. Es mejor repartirlo en porciones pequeñas".

"Pero quiero tocar el estilo con respecto al uso de corchetes: {}. Hay dos enfoques:"

1)  El corchete va en una nueva línea cada vez

2)  El paréntesis de apertura va al final de la línea anterior, mientras que el paréntesis de cierre va en una nueva línea. Este estilo se llama 'ortodoncia egipcia'.

"Honestamente, puedes elegir cómo codificar. Mucha gente usa una llave de apertura en la misma línea. Mucha gente la pone en una nueva línea. Es como el debate sobre qué extremo del huevo romper: el pequeño o el grande. fin."

"Lo único que puedo recomendar es ceñirse al estilo que se use en el proyecto en el que está trabajando. No cambie el código de otra persona para que coincida con su estilo preferido.  Las personas son imperfectas. Se lo digo como Doctor Bilaabo. "

"Gracias por la interesante lección, Bilaabo. Iré a reflexionar sobre lo que has dicho".