Fórum Estruturação de Código #13884
11/01/2010
0
Ola pessoal
Estou iniciando uma aplicação desktop em swing utilizando JGoodies. No entanto preciso
saber se é possível que me orientem sobre boas praticas de programação no
desenvolvimento desse aplicativo. Sem aquela filosofia de que o cliente quer o
sistema funcionando e não codigo bonito e bem estruturado.
Gostaria de desenvolver um código bem estruturado baseado em padrões de projeto
e que não viole os principios de orientação a objetos.
No entanto para que isto seja possível talvez seja necessário um esforço adicional
por parte do consultor pois será necessário a analise do código fonte de alguns
exemplos que acompanham o ZIP de distribuição da API, principalmente de Binding
e que estou disponiblizando no meu disco virtual,
no link:http://video.devmedia.com.br/discovirtual/200152/AlbumManager/AlbumManager.zip
Os exemplos são bem documentados e servem como ponto de inicio.
A pasta AlbumManagerDocs contem o javaDocs das classes do exemplo AlbumManager
o qual acredito que seja uma boa base e pretendo me basear para construçao deste sistema
Caso haja possibilidade podemos iniciar o desenvolvimento pela estrutura de pacotes.
O que vc acha do exemplo e de começar pela estrutura de pacotes, passando pela definição das classes
do sistema seus relacionamentos e metodos antes de implementar?
O sistema que pretendo construir é didatico contendo somente 7 entidades.
Israel Barbosa
Curtir tópico
+ 0Posts
13/01/2010
Dyego Carmo
Gostei + 0
14/01/2010
Israel Barbosa
Gostei + 0
19/01/2010
Henrique Weissmann
Gostei + 0
19/01/2010
Israel Barbosa
Gostei + 0
19/01/2010
Henrique Weissmann
Gostei + 0
20/01/2010
Israel Barbosa
http://video.devmedia.com.br/discovirtual/200152/AlbumManager/AlbumManager.zip
Gostei + 0
21/01/2010
Henrique Weissmann
Gostei + 0
23/01/2010
Israel Barbosa
Gostei + 0
26/01/2010
Israel Barbosa
a arquitetura da aplicação de exemplo. Uma de minhas duvidas
é a seguinte:
Repare na classe em amarelo, ela representa um formulário para edição
dos dados de um compositor. Vc acha que vou encontrar problemas
com esta arquitetura na hora de acrescentar novos formulários a aplicaçao
visto que todas as ações devem ficar na classe PresentationModel Um dos problemas que vejo é com relação ao owner do dialogo
que ficará nulo, pois a classe presentationModel não possui referencia
para um JFrame que sera o owner do dialogo. Vc vê algum outro problema com esta arquitetura quando formos
aumentar a quantidade de classes ? Vc Propõe alguma alteração nesta
arquitetura?
Gostei + 0
26/01/2010
Henrique Weissmann
bom: vou começar pelos detalhes ok?
no seu diagrama, você diz que classe AlbumPresentationModel recebe uma instância de Album como parâmetro em seu construtor, certo?
Dica: sempre tenha um construtor padrão implementado, a não ser que seja uma situação muito (mas muito mesmo) singular. Lhe digo isto por experiência própria: 99,9999% das vezes em que adotei um raciocínio similar a este passado algum tempo acabei incluindo algum construtor default posteriormente, fosse para que funcionasse com algum outro framework/biblioteca fosse por alguma outra razão.
Outro questionamento deve ser incluído nesta linha de raciocínio: na sua classe AlbumPresentationModel, por exemplo: você tem certeza ABSOLUTA de que no decorrer da vida desta classe ela deverá receber apenas uma vez uma instância de Album? Lembre-se: objetos são caros. Quanto menos instâncias você possuir de suas classes, melhor.
Agora, à sua pergunta principal: "Repare na classe em amarelo, ela representa um formulário para edição
dos dados de um compositor. Vc acha que vou encontrar problemas
com esta arquitetura na hora de acrescentar novos formulários a aplicaçao
visto que todas as ações devem ficar na classe PresentationModel"
Não terá problema na medida em que manter a sua classe PresentationModel o mais independente possível de qualquer formulário. Este é o ponto. Vou fazer uma tradução livre de uma frase de Martin Fowler a respeito deste assunto: "a essência do padrão Presentation Model consiste em se ter uma classe auto contida que represnete todas as informações do modelo da interface gráfica, mas que seja completamente independente dos componentes usados no formulário para representar estas informações".
Acho que talvez você conheça este texto, visto que seu exemplo é basicamente o contido nele (http://martinfowler.com/eaaDev/PresentationModel.html). Se não leu, está ai uma leitura muito interessante sobre o assunto.
Agora, à pergunta seguinte: "Um dos problemas que vejo é com relação ao owner do dialogo
que ficará nulo, pois a classe presentationModel não possui referencia
para um JFrame que sera o owner do dialogo."
Neste ponto, a responsabilidade pelo formulário pai da sua caixa de diálogo deve ser a sua instância do formulário, e não o presentation model.
E, finalmente, a pergunta final: "Vc vê algum outro problema com esta arquitetura quando formos
aumentar a quantidade de classes ? Vc Propõe alguma alteração nesta
arquitetura?"
Olha, sei que você quer usar o JGoodies e por isto se interessou pelo Presentation Model. No entanto, acho qeu ele complica demais o que pode ser fácilmente obtido pelo padrão MVC (que já é adotado como fundamento do Swing). O que pude observar no seu diagrama de classes é que não há uma distinção nítida entre modelo e visualização. O ideal seria se você primeiro os separasse em pacotes. Um para sua lógica de negócios, entidades, etc e outro apenas para a sua interface gráfica.
Neste ponto, sou inclusive radical. Costumo criar projetos distintos para estes dois pontos. Assim fica mais fácil de se garantir a independència de suas clásses de domínio a respeito de qualquer visualização.
Precisnado, já sabe: estamos ai para lhe ajudar neste caminho.
Gostei + 0
29/01/2010
Israel Barbosa
Gostei + 0
29/01/2010
Henrique Weissmann
Gostei + 0
09/02/2010
Israel Barbosa
tanto utilizando o padrão Presentation Model quanto
utilizando o padrão MVC. Como vc disse em ambos os
casos teremos o modelo, então podemos começar por ele.
Pelo que eu entendi o modelo contém as classes de negócio como categoria sub Categoria
produto, usuário e seus respectivos DAOs para acesso ao banco além de integração com plataforma baixa e outras coisas. Não é? Porem estava pensando no seguinte: Criar implementações diferentes para os DAOs,
uma implementação que acessa os dados via JDBC e outra
que utiliza um framework ORM como Hibernate, tudo
isto utilizando o padrão Abstract Factory. Qual sua opinião? Como vc disse é aconselhavel que se crie dois projetos um para o modelo e outro para visão e o controlador. Como será feita a comunicação entre os dois projetos?
Será através de um façade?
Se a resposta for sim em qual dos dois projetos este façade ficará? Vc acha que devo começar criando as classes de negócio (pojos) logo em seguida criando um
dao generico e depois para cada classe de negócio criar um DAO especifico. Ou seja quais os passos que devo seguir? Segue abaixo o diagrama de Entidade Relacionamento que cotém o modelo de dados a ser programado.
Gostei + 0
09/02/2010
Henrique Weissmann
bom: vamos por partes ok?
> Pelo que eu entendi o modelo contém as classes de negócio como categoria sub Categoria
> produto, usuário e seus respectivos DAOs para acesso ao banco além de integração com plataforma baixa e > outras coisas. > Não é?
Exatamente. Toda a sua lógica de negócio fica na camada de modelo.
> Porem estava pensando no seguinte: Criar implementações diferentes para os DAOs,
> uma implementação que acessa os dados via JDBC e outra
> que utiliza um framework ORM como Hibernate, tudo
> isto utilizando o padrão Abstract Factory.
> Qual sua opinião?
Bem Israel, neste caso, cada caso é um caso é a melhor resposta em um primeiro momento. No entanto, o que costumo observar é o seguinte: na ânsia de se criar uma arquitetura capaz de obter/persistir dados na maior variedade de fontes possível (bancos de dados, web services, arquivos texto, etc) complica-se algo que poderia ser simples.Por exemplo: banco de dados. Já vi demais ser usado ao extremo o padrão DAO no qual cria-se interfaces para cada DAO de cada classe de domínio e, em seguida, uma implementação para cada tipo de banco de dados. Parece lindo num primeiro momento, porém passado algum tempo observa-se os seguintes pontos:* Em 99,9999999999% dos casos durante toda a vida da aplicação será usada apenas uma base de dados
* Com uma ferramenta ORM como o Hibernate ou TopLink por exemplo consegue-se com uma única classe acessar práticamente qualquer tipo de BD (bastando alterar os arquivos de configuração).Sinceramente, após a popularização das ferramentas ORM não vejo mais esta necessidade em se ficar implementando interfaces e logo em seguida implementações que serão escolhidas em tempo de execução ou por um container de inversão de controle ou arquivos de configuração.
Resumindo: na teoria, é lindo. Na prática, nem um pouco.
> Como vc disse é aconselhavel que se crie dois projetos um para o modelo e outro para visão e o > controlador. > Como será feita a comunicação entre os dois projetos?
> Será através de um façade?
> Se a resposta for sim em qual dos dois projetos este façade ficará?
Eis algo que parece complexo num primeiro ponto, porém com o estudo se mostra banal. Basta disponibilizar para o seu projeto responsável pela camada de controle/visualização os arquivos jar (incluindo dependências) da sua camada de controle.Se estiver usando o Netbeans ou o Eclipse, basta que você referencie o projeto que contém a sua camada de modelo no projeto responsável pela visualização/controle.
Lembre-se do porquê de uma fachada: nela você inclui métodos que encapsulam procedimentos mais complexos que são executados com frequência. (dê uma lida no capítulo sobre facades no "Padrões de Projeto" da GoF).Lembre-se também do grande problema com fachadas: elas crescem! E com o tempo, você vai acabar tendo uma fachada com dezenas de centenas de métodos, lhe forçando a adotar uma abordagem procedural ao invés de orientada a objetos, que seria o ideal.
Qualquer coisa, já sabe: estamos aqui para auxiliá-lo ok?
Gostei + 0
13/02/2010
Israel Barbosa
como segue abaixo?
Vejo muito por ai o pessoal utilizar uma classe chamada de
por exemplo CategoriaService, ProdutoService... que simplesmente que serve como intermediaria entre o DAO
e a classe que o utiliza, então na sua opnião isto é algo desnecessário? Tem algo mais que devo fazer para incrementar o modelo?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)