Convenções de código em Java

Olá a todos.

Meu nome é Guilherme e apesar de gostar muito de Java, sou programador profissional em C/C++ não em Java :frowning:

É bem provável que alguém já tenha colocado essa pergunta aqui no fórum, mas como eu não encontrei, não custa nada perguntar e responder novamente.

Eu já li este documento da Sun sobre convenção de código:

http://java.sun.com/docs/codeconv/

mas eu achei ele meio fraco.

Em C/C++ eu uso uma convenção chamada “notação húngara”, que define coisas do tipo:

  • no nome da variável membro um “m_”;
  • o tipo da variável ou do objeto no nome de qualquer variável;
  • um “C” antes do nome das classes e um “I” antes do nome das interfaces;
    e assim por diante.

Por exemplo, uma classe Java normal seria:

public interface MinhaInterface {
    public void meuMetodoAbstrato();
}

public class MinhaClasse {

    protected Tipo1 atributo1;
    protected Tipo2 atributo2;

    public void meuMetodo(Tipo1 argumento1, Tipo2 argumento2) {
        Tipo2 variavelLocal1;
        Tipo3 variavelLocal2;

        atributo1 = argumento1;
        atributo2 = argumento2;
    }

}

Já com a notação húngara, ficaria assim:

public interface IMinhaInterface {
    public void meuMetodoAbstrato();
}

public class CMinhaClasse {

    protected Tipo1 m_atributo1;
    protected Tipo2 m_atributo2;

    public void meuMetodo(Tipo1 _argumento1, Tipo2 _argumento2) {
        Tipo2 variavelLocal1;
        Tipo3 variavelLocal2;

        m_atributo1 = _argumento1;
        m_atributo2 = _argumento2;
    }

}

Facilita por exemplo no seguinte:

  • tirar as referências “this”;

  • evita confusão entre o nome de parâmetros, atributos (variáveis membro) e variáveis locais.

  • evita confundir interfaces com classes;

  • em muitos casos pode-se saber de antemão o tipo da variável, por exemplo:


// Ao invés de usar:
String numero1 = JOptionPane.showInputDialog("Digite um numero");
int numero2 = Integer.parseInt(numero1);

// pode-se usar:
String sNumero = JOptionPane.showInputDialog("Digite um numero");
int iNumero = Integer.parseInt(sNumero);

Etc…

Então eu queria saber se existe alguma convenção desse tipo em Java, ou somente aquelas minúsculas e maiúsculas?

Abraços.

Convenções para código é um negócio complicado.

Eu acho que a única que funciona, pelo menos em termos de estética, é a do Python, que força você a indentar o código, e acaba ajudando todo mundo a fazer uma coisa mais “na forminha”. :slight_smile:

Mas até lá a convenção de nomeação é complicada. É coisa bem pessoal, e dificilmente mesmo tendo uma convenção a ser seguida você vai encontrar uma porcentagem boa de similaridade.

Até o Linus Torvalds falou que os padrões para programas GNU da FSF servem pra imprimir, dobrar e por no bolso ehehe!!! Então, fica complicado. :slight_smile:

Bom, sem querer ser chato mas já sendo, eu acho que a notação húngara é esteticamente feia…

Mas você pode usá-la em Java normalmente…o único problema que você vai ter é que muitas das APIs que você vai usar vão seguir a convenção Java que vc achou no site da Sun…

Particularmente eu gosto de nomes de métodos e variáveis o mais descritivos possíveis, então normalmente dá pra saber o que eles representam…o problema é que alguns nomes ficam bem grandes.

Enfim, como disse o TaQ, é muito pessoal :stuck_out_tongue:

[quote=“New__Radical”]
Eclipse -> CTRL + F :wink:[/quote]

Que que isso faz? :slight_smile:
Eu uso Vim! :smiley:

Eclipse -> CTRL + I 8)

biowarrior, o problema surgirá quando for trabalhar com uma equipe. Considero imprescindível que haja uniformidade nas convenções utilizadas por todos os programadores.

E sobre o ctrl+f no Eclipse, ele formata o código baseado em configurações default ou num padrão configurado por você em:
window >> preferences >> Java >> Code Style >> Code Formatter

[quote=“LIPE”]biowarrior, o problema surgirá quando for trabalhar com uma equipe. Considero imprescindível que haja uniformidade nas convenções utilizadas por todos os programadores.
[/quote]
Senão vira aquela lambança. :slight_smile:

[quote=“LIPE”]
E sobre o ctrl+f no Eclipse, ele formata o código baseado em configurações default ou num padrão configurado por você em:
window >> preferences >> Java >> Code Style >> Code Formatter[/quote]
Obrigado pela explicação. Esses estilos englobam tanto aqueles lances de:

if(x==y){
   System.out.println("ok");
}

e

if(x==y)
{
   System.out.println("ok");
}

? Pergunto por que nunca usei o Eclipse. :slight_smile:

Bom, sim, como disse o LIPE, vc vai em

e escolhe o padrão de formatação, e pode alterar o existente…por default, vem habilitado o padrão das convenções Java

Notação húngara está para o código assim como o cancer está para o ser humano.

Eu vejo notação húngara como sujeira, lixo que mais atrapalha que ajuda.

Pode ser que ate seja util durante as etapas iniciais de um projeto, mas quando começa a manutenção, o negocio vira 1 inferno, das “iNaoSouUmInteiro” ao odioso “LCZSTRING”.

Sinceramente, use uma IDE de qualidade que é ferramenta muito mais útil que notação húgara.

Sou muito mais ícone verde e ícone roxo que “Trambolho” e “ITrambolho”.

[quote=“TaQ”]
Obrigado pela explicação. Esses estilos englobam tanto aqueles lances de:

if(x==y){
   System.out.println("ok");
}

e

if(x==y)
{
   System.out.println("ok");
}

? Pergunto por que nunca usei o Eclipse. :-)[/quote]

Sim. E mais 181 outras opções a se configurar hehe

:lol: :lol: :lol:

Ok, depois que comencei a programar em Java eu entendo o ponto de vista de vocês.

Esta foi cruel:

Abusivamente sim, eu concordo, mas entenda que C++ é bem diferente que Java.
Adotar algumas convenções são importantes e deveriam ser adotadas, embora não sejam.

Bem, eu faço Computação e não Sistemas de Informação. Não quero ser preconceituoso nem grosseiro contigo, mas a maioria das ferramentas que você provavelmente usa passaram, em algum momento, por C++, e para tal, aposto que alguma notação foi usada. Pois como eu disse, o código C++ tende a ficar confuso e complexo, enquanto um código Java pode manter-se sempre simples e legível.

Realmente, e por isso eu fiz a pergunta.

Apesar de haver mais oportunidades de trabalho em Java/Web, é por essa e outras razões eu estou com receio de migrar do mercado C/C++ para Java/C#, etc.
Sabem, não quero criar uma polêmica nem nenosprezar ninguém (mesmo porque adoro Java), entretanto, só o fato de virar um simples usuário, escravo de ícones coloridas…

Quanto ao Linus, bem, o cara é um caso a parte, pois ele é muito inteligente e realmente pode descartar convenções pois ele têm uma grande capacidade de compreenção de código.

Obrigado pelas suas opiniões.

Calma lá… Pelo o que eu entendi, ele falou que a notação húngara é ruim (concordo!! :twisted: ) e não que todas as notações o são…

Sinceramente, esta foi a coisa mais preconceituosa que você poderia ter escrito. Não é porque alguém faz Sistemas de Informação ou Letras que não vai ser programador, ou vai ser ‘escravo de ícones’, e nem alguém que faz Ciência da Compuitação é ‘o cara que escreve tudo na mão’. Conheço excelentes programadores bacharéis em história, isso quando são formados! E conheço muito ‘cientista da computação’ que não sabe fazer absolutamente nada que preste sem precisar de um milhão de assistentes, incluindo gente saindo das melhroes faculdades de que tenho notícia.

E se você acha que código em Java sem convenções fica legível, é porque nunca trabalhou em um projeto grande.

Notação húgara é ruim sim, exatamente pelo motivo que o louds falou: manutenção.

biowarrior, qual a importancia de você fazer ciências da computação? Eu também faço, e dai?

Hoje eu trabalho em um projeto envolvendo c++ e java, e a notação hungara mais atrapalha que ajuda.

Eu tive o desgosto de trabalhar por 7 meses com winapi e c++ em 2000/01, todo meu ódio vem dessa época.

Já trabalhei com bases de código com dezenas de milhares de linhas de código c++ e notação hungara nunca ajudou, normalmente mais atrapalhava que ajudava.

Quando eu falei sobre preferir roxo e verde a ILeroLero e LeroLero me referia ao fato que esse tipo de informação não pertence ao nome do artefato, que somente deve carregar seu nome.

Diferente do c++, onde o fundamental é adotar um conjunto de regras, idiomas e recursos a serem usados; java não precisa de tanto, uma convensão minimalista que não exige que se decore trocentos prefixos.

Nossa galera … calma!

Acha mesmo ? Conhece o código fonte do jboss, eclipse, sun one ?
O que está sendo discutido aqui afinal? Se você acha que códigos mais complexos exigem uma notação melhor que a notação padrão da SUN, e que java não tem esta necessidade porque o público alvo são sistemas mais simples, então acredito que você possa estar enganado em vários pontos (Sugestão de leitura: código fonte do eclipse simplezinho)

A notação do java é mais moderna, e permite o uso de variáveis com nomes mais significativos. A linguagem C é muito antiga para sugerir nomes como: RemoteInterfaceRedBlackTree. Enfim, a notação húngara já teve sua utilidade histórica:

mas, felizmente, hoje é totalmente desnecessária.

Com o tempo você pode se acostumar a escrever com os nomes inteiros, e mais compreensíveis. Algumas IDEs são de incalculável importância para preguiçosos (como eu) : descubra as maravilhas que “Ctrl + espaço” do Eclipse pode fazer.

[]´s
Rodrigo

Só mais uma coisa… A convenção da SUN também fala sobre os tipos e nomes de variáveis :
Ex:

ArrayList list ou
ArrayList arrayList ou
ArrayList algumNomeList

de acordo com o padrão, deve-se evitar ainda:

variáveis locais com mesmo nome de membros;
tirar as referências “this”;
entre outras coisas do gênero

[quote=rodrigousp]Só mais uma coisa… A convenção da SUN também fala sobre os tipos e nomes de variáveis :
Ex:

ArrayList list ou
ArrayList arrayList ou
ArrayList algumNomeList

de acordo com o padrão, deve-se evitar ainda:

variáveis locais com mesmo nome de membros;
tirar as referências “this”;
entre outras coisas do gênero[/quote]

Ta legal o JForum :slight_smile:

Desculpem-me se ofendi alguém aqui, não era a minha intenção. Mas costumo não reagir muito bem a comentários jocosos como o do Louds.

Realmente, fiz um comentário infeliz.

[quote]Acha mesmo ? Conhece o código fonte do jboss, eclipse, sun one ?
[/quote]
Em nenhum momento quis dizer que Java é voltado a sistemas simples, entretanto, é possível sim, manter um código Java bem simples. Por exemplo, ao invés de criar um super método com trocentas linhas, criar objetos e outros métodos para transferir parte da funcionalidade. E sendo que a disponibilidade de classes pré-prontas em Java é infinitamente maior que qualquer outra linguagem, isso é possível.

[quote]
A notação do java é mais moderna, e permite o uso de variáveis com nomes mais significativos. A linguagem C é muito antiga para sugerir nomes como: RemoteInterfaceRedBlackTree. Enfim, a notação húngara já teve sua utilidade histórica:

mas, felizmente, hoje é totalmente desnecessária. [/quote]

  1. C é antiga, realmente, mas eu estou falando de C++ aqui.
  2. Com todo respeito, Rodrigo, mas dizer que: “C++ e notação húngara é totalmente desnecessária hoje” é uma baita ignorância.
  3. Olha, não quero ser chato, mas muitas partes da JVM e de algumas classes da Java API são feitas em C++ e (Assembly talvez).

[quote]Hoje eu trabalho em um projeto envolvendo c++ e java, e a notação hungara mais atrapalha que ajuda.

Eu tive o desgosto de trabalhar por 7 meses com winapi e c++ em 2000/01, todo meu ódio vem dessa época.

Já trabalhei com bases de código com dezenas de milhares de linhas de código c++ e notação hungara nunca ajudou, normalmente mais atrapalhava que ajudava. [/quote]

Sinto muito por sua experiência negativa, Louds, entretanto, eu também trabalho com isso é acho demais. Só acho que sua opinião poderia ser mais técnica e menos pessoal.

Abraços.

Vejamos, a JVM da Sun é escrita em C++ e não usa notação húngara, se lembro bem, ou se usa, é de forma muito leve (somente prefixo p/ variaveis de instância m_xxx).

Mas isso pouco importa, não vejo como um ou um milhão de programas escritos em c, c++, cobol, vsam, delphi, vb, algol, fortran ou qualquer outra linguagem que não seja java tenha algum valor que não seja “na linguagem xxx notação húngara funciona/não funciona”.

Quanto a méritos técnicos para não se usar notação húngara eu vejo vários:

-Java é uma linguagem que carrega muito mais semântica entre unidades de compilação, isso elimina erros devido a importação de símbolos externos com tipo errado.

-Java possui boas práticas que eliminam muitos dos problemas que a notação húgara tenta resolver, como evitar o uso de variaveis públicas, compilação muito mais rápida (melhor feedback pro desenvolvedor) e por ai vai.

-Notação húngara exige muito mais energia mental para sua devida compreenção. Um símbolo em notação húngrara exige que o desenvolvedor extraia os prefixos e sufixos, decodifique eles e contextualize eles para a variavel.
Por exêmplo, “m_sNome” exige que primeiro se separe em “m_”, “s” e “Nome”, se decodifique o significado de “m_” e “s”, e por fim contextualize em “variavel de instancia do tipo string Nome”.
Isso é muito mais complexo que simplesmente “nome”, com java é trivial pro desenvolvedor decifrar a origem e o tipo da variavel, caso precise.

-Em C++ um símbolo pode significar um milhão de coisas e vir de um milhão de lugares diferentes, em java o fechamento de todas opções é ordens de magnitude menor. Por exemplo, na seguinte linha de um método:

Em c++ podemos ter milhares de coisas acontecendo, assim como a origem dos símbolos “a” e “b”.

Em java não, eles são parâmetros, variaveis locais, atributos da classe ou atributos herdados da classe; e temos uma atribuição acontecendo.

-Notação húngara exige que se digite mais, que o código fique mais longo, que seja necessario ler mais para entender o mesmo.

Ou seja, em c/c++ NH pode ate ajudar em dar ordem à casa, mas em java não faz sentido já que a linguagem oferece suporte muito superior.