Killing the getter´s and setter´s

Vagando pela net, achei um artigo bem interessante de um tal de Allen Holub AQUI,
onde o autor mostra uma alternativa aos famigerados getter´s e setter´s que tanta gente detesta.
Apesar de eu ter achado uma boa solução pra matá-los :mrgreen: , tambem achei um pouco complexa. Gostaria de ter a opinião da galera sobre a alternativa usada pelo autor, e também, como é que vc´s tem feito para evitar o uso dos getter´s e setter´s.

cara, eu nao tenho absolutamente nada contra os getters e setters
Mas mesmo q eu tivesse, essa ideia de usar um monte de Interfaces e tal da muito trabalho…

Fora a parte do HTML, achei bonito. Mas realmente trabalhoso. Preferi o meu jeito fazendo uma gambiarrinha com reflection hehe

E maxguzenski, quando estiver envolvido num projeto médio/grande, vai ver que dói bastante colocar tudo nas actions, como o autor demonstra aqui:

value       =  amount.getValue();
currency    =  amount.getCurrency();
conversion  =  CurrencyTable.getConversionFactor( currency, USDOLLARS );
total       += value * conversion;

[ainda não li o artigo, o site aparece lento demais aqui :(]

O problema não é get/set, o problema é expôr desnecessariamente um atributo :wink:

Eu gostei da idéia de deixar seus atributos e getters/setters como privado, e só expor a interface dométodo responsável por alguma ação.

hm, sera q o projeto q estou trabalhando a 2 anos pra uma multinacional , com uma equipe de 10 pessoas , utilizando Spring/Hibernate e Jboss é um projeto de medio/grande porte ?

E exatamente por isso, o projeto tem cerca de 50 tabelas, mais de 50 classes de hibernate… sem contar classes de view, controller , toneladas de DAO

me parece q essa ideia das Interfaces iria aumentar de forma desnecessária o trabalho para projetos grandes, pois nao iria diminuir a possibilidades de erro… no maximo ia ficar mais elefante (e atrazado).

max, isso é pequeno, na verdade pequeníssimo hehe temos dois projetos desse tamanho aqui. Se o cv aparecer, quem sabe ele fale do projeto com 20mbs de .java em que está trabalhando.

Concordo que o que o autor sugere é um pouco exagerado. Mas aprendi que colocar lógica de negócio fora dos objetos é uma grande cagada, obviamente, tudo tem exceções. No princípio não parece, mas depois vai doer, acredite :smiley:

Aidna não li tud, mas já vou pitacar:

Como java não tem selective export (falei sobre isso aqui outro dia), você pdoe sim utilizar interfaces para demarcar o que um cliente pdoe ver de uma classe, entretanto a abordagem dele acaba criando tantas interfaces distintas e em lugares tão exóticos que parece complicar as coisas muito mais.

20mb? Sao 150 :mrgreen:

Gostei dessa ideia mas pela integração da UI do que pela eliminação das getters e setters.
Dá para fazer binding de uma maneira bem interessante.

Agora o que eu não gosto dos getters e setters é somente a nomeclatura.
Em outras linguagens como PHP eu usava
definirXXX e obterXXX.
Podem achar que é uma frescura, mas se a classe está toda em portugues fica muito esquisito colocar coisas em ingles.
Esse negócio de get e set eu uso só por inércia como muita coisa do java.
como retornar collection generica.
eu acho melhor não expor a collection mas sim criar métodos de manipulação.
ex:


class Nota
{
    private int codigo;
    private Date data;
    private List itens;

   public void definirCodigo(int codigo) {}
   public void definirData(int codigo) {}

   public int obterCodigo() {}
   public Date obterData() {}

  public void adicionarItem(ItemNota item)
  {
      itens.add(item);
  }

  public ItemNota obterItem(int indice)
  {
     //
  }

  public int obterNumeroDeItens() {}
}

Quando expondo um atributo, eu preferiria


class Teste{

int idade;

public int idade(){return idade;}

public void definirIdade(int idade){this.idade=idade;

}

Na verdade, o setter tanto faz (ccom código em inglês eu usaria get), mas a query sendo apenas o nome do que se quer obter (não necessariamente o nome do atributo, você pdoe, por exemplo, calcular idade em runtime baseado na data de nascimento) é mais natural.

O que é melhor:

int idade=  usuario.getIdade();

ou

int idade = usuario.idade():

? (nota: esqueça padronização aqui)

Ficou melhor ainda sem o obterXXX.
É verdade, fica mais intuitivo você ter funcionario.idade().

Eu acho que o pessoal do GUJ deveria fazer uma campanha.
“Vamos adotar padrões decentes !!!”.

O que complica é que em frameworks como hibernate, struts a gente fica dependente dos getters e setters.
Ou Nao ?

[quote=maxguzenski]hm, sera q o projeto q estou trabalhando a 2 anos pra uma multinacional , com uma equipe de 10 pessoas , utilizando Spring/Hibernate e Jboss é um projeto de medio/grande porte ?

E exatamente por isso, o projeto tem cerca de 50 tabelas, mais de 50 classes de hibernate… sem contar classes de view, controller , toneladas de DAO

me parece q essa ideia das Interfaces iria aumentar de forma desnecessária o trabalho para projetos grandes, pois nao iria diminuir a possibilidades de erro… no maximo ia ficar mais elefante (e atrazado).[/quote]

Garanto que muitas dessas classes poderiam ser jogadas fora. Quantas so de VO/DTO que nao fazem nada a nao ser um monte de get/set tem por ai?

]['s

[quote=pcalcado]

int idade=  usuario.getIdade();

ou

int idade = usuario.idade():

? (nota: esqueça padronização aqui)[/quote]

Eu prefiro a segunda, mas uso a primeira pela padronizacao.

Pois é, apesard e mais natural, na verdade quando você trabalha com algo que outras pessoas precisam ler é melhor seguir padrões.

BTW: http://www.guj.com.br/posts/list/23490.java

Nao eh soh importante seguir os padroes, como eh ESSENCIAL seguir a nomenclatura de getters e setters se vc for usar coisas como o java.beans.Introspector e afins (que eh o que o Hibernate, Struts, WebWork e amigos usam). A menos que voce esteja afim de testar os limites do codigo dos outros provendo BeanInfo…

Ninguém usa BeanInfo’s… N.I.N.G.U.E.M
Ou seja, ou segue a nomenclatura, ou tá perdido.

Esse é o principal impecilio para deixar de usar getters e setters.
Que Mer…

ressuscitando tópico…

Pessoal nosso amigo Sabella comenta:

existe um artigo do Calçado: http://fragmental.com.br/wiki/index.php?title=Fantoches, no qual ele diz:

se n me engano, o livro java efetivo tambem diz algo a respeito.

oque entendi disso tudo e que presensio é que a maioria dos sistemas possuem objetos apenas com seus dados e os getters e setters. Oque é “terrivel”, uma vez que pode-se mudar o estado de um objeto tornando-o inconsistente sem contar que toda a logica de negocios fica numa classe manipuladora desse objeto, logo a logica nao pode ser reaproveitada.

Postando na pratica:

ESTRUTURADO:

struct de luxo

public class Chamado {
  private StatusChamado status;
  private Calendar dataEncerramento;

  //getters e setters
}

classe de negocios

public class ChamadoBusiness {
  public void encerrar(Chamado chamado) {
    chamado.setStatus(StatusChamado.ENCERRADO);
    chamado.setDataEncerramento(Calendar.getInstance());
  }
}

beleza, funciona, porem fica estruturado, sem contar que alguem em algum lugar do codigo pode fazer:

chamado.setStatus(StatusChamado.ENCERRADO);

e esquecer de setar a data criando assim um objeto num estado invalido.

o certo seria colocar o comportamento dentro do proprio chamado e nao fazer o setter:

public class Chamado {
  private StatusChamado status;
  private Calendar dataEncerramento;

  private void encerra() {
    this.status = StatusChamado.ENCERRADO;
    this.dataEncerramento(Calendar.getInstance());
  }

  // getters

}

Prezados amigos, entendi certo ou “viajei na maionese” ? rsrsrs

Outra pergunta, o que fazer quando frameworks exigem os getters e setters ?

grande abrasssssss

Também sou da mesma opnião de que o autor cria interfaces desnecessárias. Image isso em uma sistema de 100 tabelas no banco e consequentemente teremos 100 classes. Usando a abordagem do autor não teria como você usar o framework por exemplo que depende dos getters e setters, ou qualquer outro que dependa.
Acho o seguinte que devemos ter estes atributos somente onde é necessário