Boa arquitetura?

9 respostas
T

Prezados senhores,

Acabei de me registrar no fórum e pretendo me tornar um participante ativo na comunidade. Tenho um grande projeto java que pretendo tornar em uma empresa e vender como um serviço web num futuro. Eu sou um estudante de doutorado na puc-rio e não estive muito tempo no mercado.

Eu gostaria de iniciar meus posts dando uma idéia da arquitetura que eu estou seguindo e pedindo sugestões e críticas.

Primeiramente, eu desenvolvi a lógica do negócio usando padrões de projetos, diagramas de classe, sequência e casos de uso. Tudo feito em java.

Eu decidi utilizar 3 frameworks java em meu programa web. A parte de pertinência é feita pelo Hibernate, o controle é componentizado pelo JSF (java rich faces) e eu uso Spring para colar esses 2 frameworks à lógica do negócio.

Meu desenvolvimento tem sido incremental. Toda vez que eu quero adicionar uma nova funcionalidade ao site, eu crio um novo bean de controle que contém uma fachada. A fachada possui um conjunto de métodos de comunicação com o banco de dados, retornando ao bean de controle classes persistidas que ele necessita.

Toda vez que eu tenho de criar uma nova funcionalidade, eu crio uma nova pagina jsp com componentes JSF que se ligam a beans de controle, que se ligam a uma fachada. As vezes aumento a fachada com novos métodos a medida em que necessito. Fora isso eu atualizo o XML do JSF, web.xml e o xml do spring.

Esse modelo de desenvolvimento tem sido eficiente até o presente momento. Num futuro eu pretendo botar isso num servidor Tomcat e deixar o programa recebendo usuários na rede.

Eu gostaria de ouvir comentários de vocês sobre todo esse modelo. Eu fico muito na faculdade e gostaria de saber se o mercado tb segue esse caminho ou mesmo erros que tenho feito.

Atenciosamente,
Miguel

9 Respostas

fpavao

Olá Miguel,

Acho interessante vc mencionar alguns requisitos não-funcionais de seu projeto, questões como desempenho, escalabilidade, etc… pois a principio a arquitetura que vc mencionou parece ser bem aderente a muitos projetos que tenho visto no mercado, mas são os requisitos não funcionais principalmente que darão uma idéia para o pessoal avaliar se ela esta de acordo com o que vêm sendo praticado…

jMacaxera

Opa! Na empresa onde estou fazendo estágio a metodologia utilizada é focada em serviços. Assim, para cada caso de uso, por exemplo, Manter Produto, há um Front-Controller e diversas páginas jsp para operações CRUD de produto.

Algo que andei vasculhando é sobre Programação Orientada a Aspectos para satisfação dos requisitos não-funcionais do sistema. Na teoria é uma maravilha, no entanto, na prática é algo bem diferente.

urubatan

jMacaxera:
Opa! Na empresa onde estou fazendo estágio a metodologia utilizada é focada em serviços. Assim, para cada caso de uso, por exemplo, Manter Produto, há um Front-Controller e diversas páginas jsp para operações CRUD de produto.

Algo que andei vasculhando é sobre Programação Orientada a Aspectos para satisfação dos requisitos não-funcionais do sistema. Na teoria é uma maravilha, no entanto, na prática é algo bem diferente.


AOP não é para implementação de requisitos não funcionais …
é para conceitos transversais …

Por exemplo, normalmente, usando AOP tu não vai melhorar a performance do sistema (claro, pode fazer cache, mas isto seria apenas tapar o sol com a peneira)

gleise

É um bom comço, mas realmente falta falar sobre os requisitos não-funcionais.

Outra coisa que me chamou a atenção foi que você não mencionou de atualizar o projeto ao adicionar nova funcionalidade. É importante você atualizar seu projeto (casos de uso, sequencia, etc) cada vez que acrescentar nova funcionalidade, ainda mais em um projeto grande. :wink:

T

jMacaxera:
Opa! Na empresa onde estou fazendo estágio a metodologia utilizada é focada em serviços. Assim, para cada caso de uso, por exemplo, Manter Produto, há um Front-Controller e diversas páginas jsp para operações CRUD de produto.

Algo que andei vasculhando é sobre Programação Orientada a Aspectos para satisfação dos requisitos não-funcionais do sistema. Na teoria é uma maravilha, no entanto, na prática é algo bem diferente.

porque na prática é algo bem diferente? lembre-se que geralmente quem vende uma idéia, faz de tudo para os outros aceitá-la, mascarando alguns aspectos negativos, SEMPRE. rs

aleck

Sua Arquitetura:
apresentação ==> controller==> fachada ==> Banco de Dados

1 - Seu conceito de facade esta um pouco distorcido, você criou um POJO com acesso a dados. O correto seria seu facade servidor para manter o contrato com as outras camadas, ou seja, se o seu facade for modificado o cliente terá que ser modificado.

2 - Verifique a divisão da lógica de negócio com o acesso aos dados.
http://www.guj.com.br/posts/list/60916.java

Arquitetura comentada:
apresentação ==> controller==> fachada ==> negocio ==> repositorio

T

Prezados,

Agradeço a resposta de todos, Concordo que é difícil avaliar a arquitetura com tão poucas informações, vou tentar esclarecer um pouco mais o que estou desenvolvendo.

Trata-se de um site web feito em java usando os frameworks que mencionei acima. O site deve receber no primeiro ano algo em torno de 40 usuários. Esse site presta um serviço que se compõe de um algoritmo que desenvolvi para resolver um problema do usuário. Este algoritmo quando utilizado requer elevado uso do processador.

Quanto à segurança, eu pretendo utilizar os recursos de validação e conversão para impedir usuários de fazer sql injections no meu BD. Além disto, usuários entram com um login e senha e o servidor conta com SSL. Além do SSL eu criptografo tudo que é importante antes de botar no BD.

Quanto à escalabilidade, esse é um ponto fraco. Eu não sei como fazer o site ser escalável. Talvez isso valha para um segundo post mas se alguém puder me dar umas dicas neste mesmo, eu agradeço. Eu sei que meu algoritmo que pede mto processamento pode ser distribuido em diversas máquinas. Eu pretendo pegar uma matéria de Sistemas distribuídos proximo semestre. Fora o algoritmo, o que o programa faz é basicamente buscar informações em BD e salvar.

Aleck, talvez eu deva explicar melhor como eu fiz a fachada. Tipo…eu tenho um DAO que tem métodos hibernate de manipulação com o BD. As classes implementadas nessa DAO me retornam objetos persistidos com o banco de dados. A fachada tem uma associação com uma interface desta DAO, me permitindo trocar a DAO futuramente se eu quiser. Vou dar um exemplo:

==========//=============//================//
Apresentação:
<h:selectOneMenu id=“cmbCompanySelect” value="#{cmbselectcompany.inventoryId}" required=“true”>
<f:selectItem itemValue=“0” itemLabel=“Selecione Empresa”/>
<f:selectItems value="#{cmbselectcompany.inventoryList}" />
</h:selectOneMenu>

Bean de controle (CmbSelectCompany):

public List getInventoryList() {
	Inventory inventory=(Inventory) vc.getInventory();
	Resource user = inventory.getResource()
      .....................................
	List inventories=[b]companyFacade.getCompanies(inventory);[/b]//ask for data in the database
	Iterator i =inventories.iterator();
      ,,,,,,,,,,,,,,,,,,,,,,
   		return this.inventoryList;//I garantee the returning list exists and have the correct itens
}

fachada (CompanyFacade)

public List getCompanies(Inventory inventory) {
	// TODO Auto-generated method stub
	List ret = new ArrayList();
	if (inventory==null) return ret; //pre garanteed
	if (inventory.getResource()==null) return ret; //pre garanteed
	ret=IDAO.findInventories(inventory.getResource());
	return ret;

}

DAO (InventoryDAO)

public List findInventories(Resource resource){

Assert.notNull(resource, Error UserContainerHibernateDAO method findInventories -> received a null resource);

Assert.notNull(resource.getResourceId(), Error UserContainerHibernateDAO method findInventories -> received a resource with  null id);

List list= getHibernateTemplate().find(from UserContainer uc where uc.resource=?,resource);//always return a list, may be empty

return list;

}

======//==========//========//
Basicamente é esse o caminho da apresentação até o BD. Se houver uma forma melhor de fazer isto, eu estou aberto a sugestões.

Obrigado.

jMacaxera

Agradeço pelo esclarecimento.

aleck

Duas dúvidas:

1 - Esse Bean de controle fica em qual camada?

2 - Você viu o link que mandei sobre o padrão facade? Com a quantidade de logica que seu facade possui fica dificil o cliente nao ter que ser alterado caso a logica mude.

Basicamente o facade serve como referencia para o mundo externo, voce pode mudar todo seu interior, porem o facade deve manter a mesma “cara”.

Caso eu esteja interpretando mal, por favor me desculpe.

Criado 30 de novembro de 2007
Ultima resposta 30 de nov. de 2007
Respostas 9
Participantes 7