Re:Legibilidade de código

16 respostas
T

Bom, sabem que eu não gosto de código de criação de interfaces visuais gerado “manualmente” - a menos do caso em que se quer criar uma superclasse que deve ser usada e reusada no seu código - digamos um componente de entrada de CPF, datas etc.
Acho que para interfaces de usuário, ou usar uma descrição XML (como é o SwiXML ou então o Thinlet), ou então deixar isso por conta da IDE - se você já viu o que o NetBeans faz, ele gera uma descrição XML da sua tela e a converte para código…
Mas gosto não se discute.

16 Respostas

S

Código bonito e bastante legível!

agora com realção a "“caminho certo”, como o colega thingol citou, interface é uma parte de programacão que tem sido “automatizada” pelas IDE`s em nome da produtividade.

A mesma identação e regras utilizadas, se fossem aplicadas a uma classe que envolvesse o algoritmo que de fato resolve o problema não estaria melhor ou pior do que você apresentou, apenas estaria sendo usada em uma área onde de fato o talento em programação é mais crítico.

Lembrando que o “java code conventions” http://java.sun.com/docs/codeconv/ também podem lhe auxiliar nisso, ok?

boa sorte!

K

Ja que voce perguntou… :slight_smile:

  • Nao abrevie o nome das coisas, exceto em casos especiais. No caso estou me referindo ao “AutGUI”. Como nao mexo no dia-a-dia com codigo de GUI, nao sei dizer como isso pode ser interpretado para o caso dos prefixos para componentes (lbl, btn, etc), mas no nome da classe isso eh fundamental.

  • Utilize Javadoc.

  • Identacao mais compacta (4 espacos) e instrucoes no mesmo nivel devem utilizar a mesma identacao. Hehehehe - eu sei, provavelmente isso eh por causa da formatacao no forum, estou forcando. :slight_smile:

No geral esta legal. Parabens. Nao pelo codigo, mas pela atitude. Sempre pense que outra pessoa pode vir (provavelmente vira) a ler seu codigo e tambem no que voce gostaria de encontrar quando estivesse lendo codigo de outras pessoas.

Marcio Kuchma

D

Eu não gosto de notação hungara (http://en.wikipedia.org/wiki/Hungarian_notation), portanto nomes de variáveis como lblPassword ou txtNome não são legais, em minha opinião…

K

Concordo. Mas como ficam as variaveis para a programacao de GUI nesse caso? (label para nome, edit para nome, variavel String para nome, etc)

Quem costuma desenvolver esse tipo de coisa por aqui? Como voce faz?

Marcio Kuchma

1

Complementando a dica do Marcio, use espaços para identar, não tabs. Se tiver um editor que substitua tabs por espaços, fica melhor ainda. Isso porque cada um configura a exibição dos tabs com um tamanho diferente.

Outra coisa que não me agradou muito foi usar métodos públicos para a configuração dos componentes de tela. Separar em métodos pode ser interessante para separar melhor o código, mas, a menos que você pretenda usar essas configurações de componentes em outras classes, deixar os métodos públicos é uma quebra de encapsulamento.

Kuchma, eu mexo com gui e acho que, usando uma IDE que indique o tipo da variável, indicar o formato do componente é bobagem. O importante é saber qual vai ser a entrada lá. Só os labels que são chatos nesse sentido, mas até a existência deles já é chata.

T

Devido a um costume antigo eu ainda prefiro, quando um dado (modelo) é representado em uma interface visual (visão), usar o nome sem notação húngara para o modelo, e a notação húngara para a visão.

Exemplo:

txtUsuario (visão) --> JTextField
usuario (modelo) --> String

Mas concordo que isso é questão de costume e não é muito razoável. Imagine isso quando usado em uma interface HTML:

<input type="text" id="txtUsuario" name="txtUsuario">

É óbvio que é mais simples e mais direto usar

<input type="text" id="usuario" name="usuario">

sem notação húngara, mesmo para a visão.

T
  • Coisas que na sua interface de usuário são fixas (como "lblUsuario") não deveriam ter nem métodos, nem variáveis públicas ou protegidas associadas a elas. Nesse caso cabe o tal do método "init".
    Na verdade nem deveriam ser codificadas, mas carregadas a partir de uma descrição. Imagine se o HTML em vez de ser uma descrição da página fosse uma codificação.
    Talvez você até quebrasse o método "init" em vários, para as diversas partes de sua tela. Mas ainda acho que é a IDE que deve preparar a interface de usuário.
  • Coisas que representam uma visão de seu modelo de dados (como "txtUsuario" --> "usuario") já merecem uma variável, ou um "getter" para ela.
1

A questão dos métodos para os componentes é meio complicada. No geral, eu concordo com o thingol no sentido de que isso não deveria ser programado, deveria ser descrito. Por exemplo, você ter separado em métodos auxilia na separação do código e ajuda na abstração das coisas, mas os métodos públicos fazem com que quem use a sua classe tenha o direito de chamá-los, o que pode ser inconveniente. Deixar os métodos private ia conter este problema apenas à sua classe, mas não ia eliminá-lo. A solução “método init”/construtor/bloco de inicialização é até válida. Apenas tome cuidado para separar as coisas. Algumas coisas vão ocorrer e devem ocorrer apenas uma vez, que é a montagem da tela. Porém, a atualização da tela vai ocorrer várias vezes, então seria conveniente deixar tudo que é relativo à atualização (limpar conteúdo de campos, zerar validações, etc) em um método separado.

<blockquote><div class="quote-author">Spool:</div> Como gosto de programar “na unha”, pelo menos para mim fica bem mais fácil de “decifrar” o que é um label ( lbl ), o que é um textfield ( txt ), o que é um botão ( cmd ) etc etc etc…

(…)

magine um momento em que vc pegue uma variavel usuario.setText(“Nome”)

como saberia se ela é um label ou um tField sem consultar a declaração da variavel??

Pelo bem da sua sanidade, espero que “na unha” simplesmente signifique “editar código” e não “usar bloco de notas”. Se significa “editar código”, a coisa fica mais simples, já que IDEs como Eclipse e NetBeans indicam o tipo da variável quando você coloca o mouse em cima (ou no caso do Eclipse, quando aperta F2 com o cursor sobre a variável), o que já amena esta necessidade. De resto, você sempre pode saber o que algo é pelas suas ações, que devem estar indicadas no nome. Se for um verbo, é uma ação (botão), se for um nome é uma indicação ao seu modelo (campo), etc. O problema da notação húngara vem quando se muda de um ComboBox para um TextField e não se muda o nome da variável de cmbTipo para txtTipo.

Claro que tudo isso que eu estou falando é prontamente desobedecido quando se trata de labels, já que estes em geral estão acoplados aos campos de edição, portanto se simplesmente nomeá-los de acordo com o modelo, fica-se com variáveis duplicadas. Então é mais prático mandar o que eu falei às favas e usar um “lb” ali, mesmo porque labels só vão ser usados duas vezes, uma na criação e outra na hora de mostrar.

D

Spool:
Quer dizer então que me enquadro no grupo de insanos?! hehehe
No mínimo! hehehe… Acho difícil você trabalhar em um projeto grande e achar que usar o bloco de notas é uma opção viável. :wink:

1

Na realidade, TextPad!!! :stuck_out_tongue:

To “fuçando” em IDE´s ( Eclipse / NetBeans ). Mas não me agrada muito a idéia.
Vou tentar me acostumar.

:slight_smile:

hehehehe

Quer dizer então que me enquadro no grupo de insanos?! hehehe

Por mais que minha sanidade seja questionável, editores de texto simples só servem para estudar. Usar uma IDE é essencial para o dia-a-dia, visto que além de programar, você tem que fazer deploy, builds, unit cases, subir webserver, configurar framework e tomar cafézinho. Sem contar que as opções de refactoring do Eclipse são sensacionais.

L
Spool:
Olá pessoal. Gostaria de saber se estou indo pelo caminho certo.

Gostaria de algumas opiniões a respeito.

- Voce considera o codigo abaixo "legível"?
- O que faria para melhorá-lo?

public class AutGUI extends JFrame {

		private static final int PANEL_LEFT_MARGIN = 25;

		public AutGUI() {
				super();

				setDefaultCloseOperation(EXIT_ON_CLOSE);
				setTitle("Ful-Control - [v0.1]");
				setSize(300, 250);
				setLocationRelativeTo(null);
				setResizable(false);

				getContentPane().add(BorderLayout.CENTER, mainPanel());

				setVisible(true);
		}

		public JPanel mainPanel() {
			JPanel mainPanel = new JPanel();

				mainPanel.setSize(280, 230);
				mainPanel.setLayout(null);

				mainPanel.add(lblUserName());
				mainPanel.add(lblPassword());

				return mainPanel;
		}

		public JLabel lblUserName() {
			JLabel lblUsername = new JLabel("Usuário:");

				lblUsername.setFont(new Font("Arial", Font.BOLD, 12));
				lblUsername.setBounds(PANEL_LEFT_MARGIN, 10, 50, 20);
				lblUsername.setBorder(BorderFactory.createLineBorder(Color.white));
				lblUsername.setHorizontalAlignment(JLabel.RIGHT);

				return lblUsername;
		}

		public JLabel lblPassword() {
			JLabel lblPassword = new JLabel("Senha:");

				lblPassword.setFont(new Font("Arial", Font.BOLD, 12));
				lblPassword.setBounds(PANEL_LEFT_MARGIN, 35, 50, 20);
				lblPassword.setBorder(BorderFactory.createLineBorder(Color.white));
				lblPassword.setHorizontalAlignment(JLabel.RIGHT);

				return lblPassword;
		}

sendAbraços();

opa!!! uma dica!! as chaves deve ficar na mesma tabulação a qual se refere ficaria 100% legivel!!!

S

Olá pessoal.
Gostaria de saber se estou indo pelo caminho certo.

Gostaria de algumas opiniões a respeito.

- Voce considera o codigo abaixo "legível"?
- O que faria para melhorá-lo?

public class AutGUI extends JFrame {

		private static final int PANEL_LEFT_MARGIN = 25;

		public AutGUI() {
				super();

				setDefaultCloseOperation(EXIT_ON_CLOSE);
				setTitle("Ful-Control - [v0.1]");
				setSize(300, 250);
				setLocationRelativeTo(null);
				setResizable(false);

				getContentPane().add(BorderLayout.CENTER, mainPanel());

				setVisible(true);
		}

		public JPanel mainPanel() {
			JPanel mainPanel = new JPanel();

				mainPanel.setSize(280, 230);
				mainPanel.setLayout(null);

				mainPanel.add(lblUserName());
				mainPanel.add(lblPassword());

				return mainPanel;
		}

		public JLabel lblUserName() {
			JLabel lblUsername = new JLabel("Usuário:");

				lblUsername.setFont(new Font("Arial", Font.BOLD, 12));
				lblUsername.setBounds(PANEL_LEFT_MARGIN, 10, 50, 20);
				lblUsername.setBorder(BorderFactory.createLineBorder(Color.white));
				lblUsername.setHorizontalAlignment(JLabel.RIGHT);

				return lblUsername;
		}

		public JLabel lblPassword() {
			JLabel lblPassword = new JLabel("Senha:");

				lblPassword.setFont(new Font("Arial", Font.BOLD, 12));
				lblPassword.setBounds(PANEL_LEFT_MARGIN, 35, 50, 20);
				lblPassword.setBorder(BorderFactory.createLineBorder(Color.white));
				lblPassword.setHorizontalAlignment(JLabel.RIGHT);

				return lblPassword;
		}

sendAbraços();

S

Valew pelas sugestões.
To dando uma olhada mais completa nas convenções. Conheço algumas, mas tem muitas que estão lá que eu nem imaginava.

Mais dicas e opiniões são sempre bem vindas.

sendAbraços();

S

Se eu colocar os métodos como privados?
Resolveria? Ou ainda seria uma forma de quebrar o encapsulamento?

O que sugeria para não criar componentes em métodos separados? Criar todos dentro do construtor?

Ou criar um único método ( por ex. init() ) e criar os componentes lá?

Valew!

S

Devido a um costume antigo eu ainda prefiro, quando um dado (modelo) é representado em uma interface visual (visão), usar o nome sem notação húngara para o modelo, e a notação húngara para a visão.

Exemplo:

txtUsuario (visão) --> JTextField
usuario (modelo) --> String

Mas concordo que isso é questão de costume e não é muito razoável. Imagine isso quando usado em uma interface HTML:

<input type="text" id="txtUsuario" name="txtUsuario">

É óbvio que é mais simples e mais direto usar

<input type="text" id="usuario" name="usuario">

sem notação húngara, mesmo para a visão.

Eu mantenho essa notação por herança do VB. :S
Como gosto de programar “na unha”, pelo menos para mim fica bem mais fácil de “decifrar” o que é um label ( lbl ), o que é um textfield ( txt ), o que é um botão ( cmd ) etc etc etc…

Mas acho interessante discutir isso, pelo menos esse é o tema do tópico: Legibilidade de Código.
Isso só pode ser alcançado em grande escala ( assim creio eu ) se todos os programadores tiverem a mesma mentalidade ( nesse momento me refiro a nomenclatura :stuck_out_tongue: ) para programar.

Isso em codigos implementados por diversos desenvolvedores faz a GRANDE diferença.

Imagine um momento em que vc pegue uma variavel usuario.setText(“Nome”)

como saberia se ela é um label ou um tField sem consultar a declaração da variavel??

Eu acho bem mais complicado.

Mas vou ver se na convenção Java existe alguma coisa a respeito.
Depois posto a respeito.

S

Na realidade, TextPad!!! :stuck_out_tongue:

To “fuçando” em IDE´s ( Eclipse / NetBeans ). Mas não me agrada muito a idéia.
Vou tentar me acostumar.

:slight_smile:

hehehehe

Quer dizer então que me enquadro no grupo de insanos?! hehehe

Criado 2 de maio de 2006
Ultima resposta 3 de mai. de 2006
Respostas 16
Participantes 7