"Oi, amigo! Hoje vou falar sobre estilos de código e a importância do estilo de código."

"Vou começar com o que é mais importante.  O código Java deve ser fácil de ler.  A abordagem geral do código é esta: o código é escrito uma vez, mas lido cem vezes."

"Suponha que você e 10 outros programadores estejam escrevendo um aplicativo. Você trabalha no aplicativo por três anos, com lançamentos intermediários a cada três meses."

"Tanto tempo?"

"Isto é Java, meu jovem gafanhoto! "Que tal um sistema empresarial rodando em uma dúzia de servidores e escrito por 100 pessoas ao longo de mais de 6 anos? Isso também acontece às vezes."

"Uau."

"De qualquer forma, a regra principal, o principal requisito para o código é que seja fácil de ler para outros desenvolvedores."

"Em outras linguagens de programação, as pessoas costumam trabalhar como pequenas equipes em pequenas tarefas, portanto, podem ter outra regra principal, como 'Funciona? Excelente'."

"Ao longo de alguns anos, todos os membros de sua equipe farão várias alterações no código que você escreveu. E todas as vezes eles terão que entender como o código funciona."

"E o código incompreensível que funciona perfeitamente é difícil de mudar.  Eles vão descartá-lo e reescrevê-lo à sua maneira.  Portanto, escreva um código que outros possam entender.  Se você pode melhorar seu código, melhore-o. Se puder ser melhorado, então precisa ser melhorado! "

"Se você escrever código por 15 minutos e depois passar duas horas melhorando, você está fazendo certo. Quanto tempo você está economizando para a equipe?"

"'2 horas para entender seu código' x 'as 100 vezes em que as pessoas precisarão entendê-lo' = 200 horas."

"Tirei esses números do nada, mas quero que você entenda o problema e seu escopo.  Seu código foi criado para ser lido por outros programadores.  Todo o resto é secundário."

"O código não está funcionando corretamente? Vamos corrigi-lo. Não está otimizado? Vamos otimizá-lo. Não está documentado? Adicionaremos comentários."

" O código é difícil de ler? Jogue essa porcaria no lixo e escreva tudo de novo do zero! "

"Não pensei que fosse grande coisa."

"Uma das razões pelas quais Java é uma linguagem de programação líder é que todo o código Java é escrito para ser lido por outros programadores."

"Agora vamos para a segunda pergunta: como você torna seu código o mais fácil de ler possível? "

"Qualquer um pode entender quando alguém fala palavras familiares em seu idioma nativo. O mesmo é verdade aqui. O código é fácil de ler quando um programador pode facilmente adivinhar:

A)  O que cada método faz

B)  O objetivo de cada aula

C)  Exatamente o que cada variável armazena.

Tudo isso é comunicado em nomes: nomes de classes, nomes de métodos e nomes de variáveis. Além disso, há estilo quando se trata de nomear variáveis. E há estilo de código."

"Estou pronto para ouvir."

" A programação é baseada em um bom inglês!  Um programa bem escrito é lido como uma documentação técnica comum. "

" Vamos começar com os nomes. "

"Um nome de método deve descrever brevemente o que o método faz. Então o código pode ser lido como uma prosa simples."

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;
}

"Aqui está como tal programa é lido."

Linha 1.

"O método é chamado 'downloadPhoto'. Parece que ele baixa um arquivo de foto da Internet. Para onde ele baixa? Ainda não sabemos. De onde? O método tem um parâmetro chamado url - provavelmente é o URL para a transferência."

Linha 3.

"A variável resultFileName é declarada e recebe um valor atribuído por TempHelper.createTempFileName();"

Portanto, este deve ser o caminho local para o arquivo onde salvaremos nosso arquivo baixado.

"O nome 'TempHelper' não nos diz nada. O sufixo 'Helper' diz que este é um tipo de classe utilitária que não contém lógica de negócios importante, mas é usada para simplificar tarefas de rotina que ocorrem com frequência."

"O nome do método 'createTempFileName' indica que este método cria e retorna o nome de um arquivo temporário (arquivo temporário). Um arquivo temporário é um arquivo temporário que é criado por um tempo e geralmente excluído quando o programa é fechado. "

Linha 5.

"Um objeto SingleFileDownloader é criado e atribuído ao downloader variável."

Este é o objeto que irá baixar nosso arquivo da Internet.

"Um objeto SingleFileDownloader é atribuído ao downloader variável. Pelo nome, podemos assumir que o programa tem vários tipos de classes de downloader. Um foi escrito para baixar arquivos únicos e provavelmente podemos esperar encontrar outros downloaders no código para grupos de arquivos com nomes como: MultiFileDownloader, FileGroupDownloader ou DirectoryDownloader"

Linha 6.

"Definimos a propriedade resultFileName do objeto downloader igual ao valor da variável resultFileName. Em outras palavras, dizemos ao carregador onde salvar o arquivo baixado. Como seria de esperar. Portanto, estamos basicamente prevendo o código!"

Linha 7.

"Chamamos o método start. O download começa. Isso faz sentido. Eu me pergunto como o download acontece: em partes, em um thread separado ou tudo aqui mesmo? Se baixarmos tudo aqui, pode demorar um pouco muito tempo e ter consequências."

Linhas 8-11.

"Ah. Aqui vemos o loop padrão escrito por alguém esperando o download terminar. O objeto downloder tem uma propriedade done, que é retornada pelo método isDone(). Porque o método é chamado isDone(), em vez de getDone( ), concluímos que a variável concluída é um booleano ou talvez um booleano."

Linhas 13-14.

"Se ocorrer um erro durante o download, o método downloadPhoto retornará nulo. É bom que ele lide com erros. É ruim que apenas retorne nulo - não está claro qual é o erro. Seria melhor lançar uma exceção com informações sobre o erro."

Linha 16.

"Retornamos o caminho para o arquivo local que contém o arquivo baixado."

"Uau!"

"O código deste programa deixa absolutamente claro o que ele faz. Você pode até fazer suposições sobre como o programa está organizado e quais outras classes/métodos encontraremos."

"Agora eu entendo como os nomes são importantes."

"Mais sobre nomes. Muitas vezes você pode adivinhar quais métodos um objeto/classe possui. Por exemplo, se um objeto é uma coleção, provavelmente terá um método size() ou count() para obter o número de elementos. Também , provavelmente terá um método add() ou insert(). Os elementos são recuperados das classes de coleção usando os métodos get/getItem/getElement."

"Se uma variável é chamada i, j ou k, provavelmente é um contador de loop."

"Se uma variável é chamada de m ou n, provavelmente é o tamanho de uma matriz/coleção."

"Se uma variável é chamada de nome, provavelmente é uma String contendo o nome de alguém."

"Se uma classe é chamada FileInputStream, ela é simultaneamente um arquivo e um fluxo de entrada."

"Quanto mais código você vê, mais fácil é ler o código dos outros."

"Mas às vezes há um código muito difícil de ler. Nesse caso, aqui vai um conselho muito prático:"

Dica
Escreva o código como se fosse mantido por um psicopata violento que sabe onde você mora .

"Isso é engraçado e não é engraçado ao mesmo tempo."

"Agora um pouco sobre os estilos usados ​​para nomear variáveis."

"Os desenvolvedores Java tentam dar nomes altamente informativos para variáveis ​​e métodos. Como resultado, os nomes geralmente consistem em várias palavras. Existem 4 estilos para a capitalização de nomes compostos."

1) Minúsculas  – Todas as palavras são escritas com letras minúsculas. Por exemplo:

'Casa verde'  torna-se 'estufa'

'Garota de Hollywood'  se torna  'Garota de Hollywood'

Este estilo é usado para nomes de pacotes.

2) Maiúsculas  – Todas as palavras são escritas com letras maiúsculas e separadas por sublinhado. Por exemplo:

'Valor máximo'  torna-se MAX_VALUE

'Contagem de gatos'  torna-se CAT_COUNT

"Este estilo é usado para nomes de constantes (campos estáticos finais)."

3) CamelCase  – Todas as palavras são escritas com letras minúsculas, exceto a primeira letra de cada palavra que é maiúscula. Por exemplo:

'Green House'  torna-se  'GreenHouse'

'Garota de Hollywood'  se torna 'Garota de Hollywood'

Este estilo é usado para nomes de classes e interfaces.

4) Lower CamelCase (caso misto)  – Todas as palavras são escritas com letras minúsculas, exceto a primeira letra de cada palavra, exceto que a primeira é maiúscula. Por exemplo:

'Obter largura' torna-se 'getWidth'

'Get Hollywood girl name' torna-se  'getHollywoodGirlName'

"Este estilo é usado para nomes de variáveis ​​e métodos."

"Então, não há muitas regras."

1)  Tudo está escrito em Lower CamelCase.

2)  Nomes de classes e interfaces são sempre em letras maiúsculas.

3)  Os nomes dos pacotes são sempre minúsculos.

4)  As constantes são sempre maiúsculas.

"Existem algumas nuances, mas em geral é isso."

"Agora sobre os métodos.  "Os nomes dos métodos quase sempre começam com um verbo! 'count' é um nome ruim para um método. É melhor chamá-lo de getCount(). Um método executa alguma ação no objeto:  startDownload , interrupção  , sleep  , loadPirateMusic ."

"Como você já sabe, existem getters e setters para trabalhar com as propriedades/campos de um objeto:  getName / setName , getCount / setCount , etc."

"A única exceção é para booleanos. Para booleanos, os nomes getter usam 'is', não 'get', por exemplo, isDone, isEmpty. Dessa forma, está mais próximo da fala comum."

"Que tal trabalhar duas horas por dia em vez de 8? Tentado?"

"Sim!"

"Como você deve ser. Para um desenvolvedor Java júnior, o requisito básico é um excelente entendimento dos fundamentos do Java, ou seja, Java Core."

"Tenho outra pergunta. Por que temos esses métodos diferentes para obter o número de elementos?"

Aula Método/propriedade para obter o número de elementos
Corda comprimento ()
Variedade comprimento
ArrayList tamanho ()
ThreadGroup contagem ativa ()

"Em primeiro lugar, o Java foi inventado há mais de 20 anos, antes que requisitos como setCount / getCount fossem estabelecidos, e havia uma abordagem comum tirada da linguagem C para 'torná-la o mais curta possível'."

"Em segundo lugar, a semântica desempenha um papel aqui. Ao falar sobre uma matriz, falamos de seu comprimento. Ao falar sobre uma coleção, falamos de seu tamanho."

"Que lição interessante."

"Eu gostaria de lhe contar mais, mas temo que você não se lembre de tudo de uma vez. É melhor distribuí-lo em pequenas porções."

"Mas quero abordar o estilo em relação ao uso de chaves: {}. Existem duas abordagens:"

1)  O colchete vai em uma nova linha toda vez

2)  O colchete de abertura vai no final da linha anterior, enquanto o colchete de fechamento vai em uma nova linha. Este estilo é chamado de 'suportes egípcios'.

"Honestamente, você pode escolher como codificar. Muitas pessoas usam uma chave de abertura na mesma linha. Muitas pessoas colocam em uma nova linha. É como o debate sobre qual extremidade do ovo quebrar: a pequena ou a grande fim."

"A única coisa que posso recomendar é manter qualquer estilo que esteja sendo usado no projeto em que você está trabalhando. Não altere o código de outra pessoa para corresponder ao seu estilo preferido.  As pessoas são imperfeitas. Estou lhe dizendo isso como Doutor Bilaabo. "

"Obrigado pela interessante aula, Bilaabo. Irei refletir sobre o que você disse."