Dúvida: criar uma classe ou um atributo?

Boa noite colegas !

Qual a melhor saída para essa situação:

Tenho uma classe cliente que deve possuir Endereço e Telefone Residencial, Endereço e Telefone Comercial.

Endereço é composto por Tipo (R, AV, etc), Nome, Numero, CEP, Cidade, Estado.
Telefone é composto por DDD e Numero.

Minha primeira dúvida:
-crio os atributos necessários diretamente na classe Cliente


public class Cliente {

String tipoEnderecoComercial;
String nomeEnderecoComercial;
String numeroEnderecoComercial;
String dddTelefoneComercial;
String numeroTelefoneComercial;

String tipoEnderecoResidencial;
String nomeEnderecoResidencial;
String numeroEnderecoResidencial;
String dddTelefoneResidencial;
String numeroTelefoneResidencial;

-crio uma classe Endereço com os atributos referentes ao endereço e dois atributos do tipo Endereço na classe Cliente.


public class Cliente {

Endereco enderecoComercial;
Endereco enderecoResidencial;

Minha segunda dúvida:

Telefone me parece um objeto separado de endereco, sendo assim devo também criar uma classe para Telefone criar um atributo do tipo Telefone na classe Cliente.

E para finalizar… minha terceira dúvida:

Na hora de persistir esses dados é errado criar só uma tabela cliente com todos os atributos ?

Desculpem se abusei nas perguntas… mas é que estou começando.

Qualquer ajuda que puderem dar será de muita valia !

Obrigado.

Abraços.

IAEW KRA… BLZ

seguinte…

eu faria assim

O cliente TEM UM endereço; (agregação)
O cliente TEM um telefone;
O cliente E UMA pessoa certo (herança)

eu criaria 3 classes bem distintas! isso se vc fosse é claro fazer uma aplicação de porte consideravel…
tornaria seu codigo mais leve e menos embaraçado!

ate agora falei de principios! nem tudo deve seguir essas riscas ok…

ficaria assim:

class Cliente{
     nome;
     sobrenome;
     cpf;
     idade;
     End_contato contato;
     rg;
     //e por ai vai... tente colocar coisas que nao saia muito fora de um cliente

}


class End_Contato{
      endereco;
      cep;
      cidade;
      estado;
      telefone1;
      telefone2;
    //e por ai vai..........
}

se sua aplicaçao nao for grande… coloca isso tudo em uma classe so e manda ve que da menos trabalho e vc trabalha com um objeto só (sem utilizar agregação e talls)

quando for salvar… se nao for uma grande aplicação, coloque tudo em uma tabela so… vai te poupar um bom tempo e vai funcionar do mesmo jeito…

espero ter ajudado…
t+

Olá!

Pense assim: “O atributo terá algum comportamento/mudará seu estado? Ele terá alguma importância na lógica do problema? Ele se relacionará com os outros Objetos?”, se a resposta for SIM para pelo menos 2 dessas perguntas então você deve criar uma classe… agora se for NÃO, não vale a pena escrever uma classe que vai se relacionar APENAS com uma outra classe sem modificar seu estado… vai ser uma somente classe com gets/sets sem utilidade…

Abraços

Link_pg:

Não sei se concordo exatamente com a métrica que você propos, mas valeu pela dica !
Neste exemplo que citei imaginei o seguinte:

-Primeiro o Endereço: terei validação de campo, por exemplo CEP, criando uma classe posso reutilizar essa validação em todas os lugares em que tiver um endereço. Então pensei em criar na classe Cliente dois atributos do tipo Endereco, um enderecoResidencial e outro enderecoComercial.

-Agora o Telefone: não terei regras relacionadas a ele, mas terei TelefoneComercial, TelefoneResidencial e TelefoneCelular, sendo assim pensei em criar um atributo do tipo Telefone na classe Endereco, logo eu teria la na classe cliente um telefone para o atributo enderecoComercial e outro para o atributo enderecoResidencial.
Para complicar, vamos supor que eu tenha um atributo telefoneCelular, algum problema em criar esse atributo na classe Cliente ? Já que ele não esta ligado a nenhum endereço.

Alias, validação é outra duvida que postei a um tempo atras e não obtive resposta satisafatória: devo colocar validações dentro desta classe ?
Mas neste caso acho que a classe Cliente serve melhor como exemplo:
considerando que tenho uma classe Cliente que representa um modelo para os meus objetos Cliente e uma classe ClienteControl, onde colocarei as regras de negócio de negócio relacionadas a Clientes, uma validação do tipo “Nome não pode ser vazio” deve ficar na classe Cliente, que pelo que entendo é responsável por garantir a criação de objetos Clientes válidos, ou na classe ClienteControl, responsável pelas regras da aplicação ?

Obrigado a todos.

Abraços.

[quote=Zeed01]Link_pg:

-Primeiro o Endereço: terei validação de campo, por exemplo CEP, criando uma classe posso reutilizar essa validação em todas os lugares em que tiver um endereço. Então pensei em criar na classe Cliente dois atributos do tipo Endereco, um enderecoResidencial e outro enderecoComercial.

[/quote]

Se voce for ter validação dos dados do endereço telefone (DDD) e outros metodos para o tratamento desses dados…

faça separado!

"Quanto mais flexivel! Mais complexo é! é uma faca de dois legumes… :stuck_out_tongue:
Encapsule o que varia! …invista nos principios de design OO…

Olá!

Então como eu disse, se esse atributo será reutilizado em outras classes então separe…

Agora se for apenas por validação, então coloque na mesma classe… não há necessidade de criar outra classe apenas pra validar um campo… faça a validação no get do atributo, a não ser que você vá utilizar essa validação em alguma outra classe dai crie uma classe separada…

Imagine um diagrama de classes… lá que você define as suas classes do sistema… se você estiver pensando apenas na lógica/resolução do problema verá que uma classe Endereço não será necessária… mas nada impede você criar outra classe… só que essa classe não terá um papel relevante na resolução do problema :wink:

Abraços