3
respostas

Extends, implements ou Objeto como atributos?

Fiquei com uma grande dúvida na hora de praticar alguns exercícios de minha própria criação. Eu trabalho em uma universidade pública e imaginei como criar um projeto com várias classes e como inter-relaciona-las. Por força do hábito, imaginei inicialmente um DER de BD tradicional, e classes meio que se comportando como tabelas. Primeiramente uma tabela PESSOA como a mais genérica, depois ALUNO, SERVIDOR como extendendo pessoa. Ai entra FORNECEDOR, CHEFIA, CURSO, DEPARTAMENTO. Aluno e Servidor inicialmente me parece bem obvio extender Pessoa. Mas já em Chefia, que pode estar ligada a um Departamento, e Fornecedor que pode ser um tipo de Pessoa, além de Curso que de alguma forma está ligada a Aluno, começou a me dar um nó na cabeça, pois não sei em que momento deveria ser melhor um objeto de uma classe dentro de um atributo, extender uma com outra ou até mesmo quando criar uma interface para implementar outra. Alguem pode me dar uma direção na orientação a objetos, que não deve ser igual ao BD relacional e suas formas de normalização, em como projetar bem um projeto e essas classes?

3 respostas

Gostei de suas colocações elas são pertinentes, talvez o que você precisa é se fazer são perguntas.

Aluno e Servidor são uma pessoa? SIM

Fornecedor é uma pessoa? se formos pensar em pessoa jurídica, SIM. mas perceba que terá comportamentos diferentes. ( Aproveite o necessário de pessoa para criar, e como está utilizando Herança coloque seus atributos pertinentes)

em relação a cargos como por exemplo chefia, em minha opinião você poderia ter uma classe Cargo e na classe Servidor poderia definir um cargo, isso pode ser feito com composição, acho que seria a melhor forma, então uma Pessoa poderia ter um cargo e um cargo poderia estar em muitas pessoas, pegou a ideia?

eu realmente não entendo muito o que poderia ser um departamento, mas aparentemente é um lugar que agrupa determinados cargos (eu realmente não sei, isso é um chute rsrs) então você pode pensar que em um departamento você pode ter muitas Pessoas e Cargos, ou seja ao criar um departamento que pode ter nome, descrição entre outros atributos e comportamentos você pode ter uma lista de pessoas cargos que esse departamento suporta.

Pensei mais ou menos assim:

public class Pessoa {
    private String nome;

    // outros comportamentos
}
public class Aluno extends Pessoa {
    private String curso; // isso também pode ser uma outra classe, é somente um exemplo
    // outros comportamentos

}
public class Cargo {
    private String nomeCargo;

}
public class Departamento {
    private String nomeDepartamento;
    private List<Servidor> servidor;
    private List<Cargo> cargo;

    // construtor

    //get&set
}
public class Servidor extends Pessoa{
    private Integer numeroMatricula;
    private Cargo cargo; // pode até ser um chefe
    // outros comportamentos
}

Bons estudos e boa sorte!

Sim, essa modelagem em um ambiente de universidade pública tem suas complexidades e peculiaridades. Cargo por exemplo pode ser o concurso que a pessoa prestou, como Técnico Administrativo, Analista de TI, Engenheiro, Professor... faz parte da carreira dele. Já Chefias são algo a mais, um cargo comissionado e ainda tem níveis de chefia, como chefe de departamento, coordenador, diretor, reitor, pró-reitor... são chefias diferentes e níveis diferentes. Departamentos são outro abacaxi sem tamanho, pois de fato departamento pode ser um espaço "virtual" onde são lotados servidores, mas esse departamento pode ocupar mais de um espaço físico. Ai começa uma confusão semântica quando se discute isso por aqui, pois setor se confunde com departamento, contas orçamentárias (Uorg como o governo considera sua lotação, que é uma conta tratada orçamentariamente)... não é uma modelagem fácil... rs. A classe Pessoa também é complicada, porque tem pessoa fisica, pessoa juridica, fornecedores, e também uma "pessoa estrangeira" porque tem muitos alunos de fora que entram também no sistema. Tem também pessoas externas que não tem vínculo direto com a universidade, mas podem eventualmente vir na universidade e pedirem algum serviço.

Esta é uma dúvida que também tenho, principalmente quando preciso fazer a modelagem das classes diretamente na linha de código. Uma prática que me ajuda muito, mesmo assim eu preciso praticar mais, é fazer os desenhos (diagrama) das classes, interfaces e relacionamentos como o Nico apresentou nas aulas. Eles nos permitem criar, de forma objetiva, cada classe, atribuindo as respectivas responsabilidades, assim como as interfaces e relacionamentos. Eu não consegui compreender sua modelagem pelo que você apresentou pois, existem muitas variáveis envolvidas no processo, que você conhece bem. Ao meu ver, você poderá fazê-lo pois já sabe quais os relacionamentos entre elas. Minha sugestão é, desenhe os grafos antes de colocar a mão no código. ;) Espero ter ajudado. Ah... procure por UML caso tenha alguma dúvida de como montar estes desenhos. Acredito que aqui mesmo na Alura deva ter cursos sobre isso. Se bem que o Nico foi extremamente claro em seus desenhos que , acredito, seguindo os videos vc conseguirá. :D