Sugestão de Implementação com Design Parttner
21/02/2011
0
Sempre que possível gosto de utilizar algum design partner em meus códigos.
Tenho um em particular que fico em dúvida sobre a real necessidade e sobre qual usar.
Os requisitos são os seguintes:
1) Recebo em um método parâmetros provenientes de servlet, que chega como string (obviamente).
2) Essa string possui 2 parâmetros que devo decompor (através de splits).
3) O primeiro parâmetro a ser decomposto dessa string é uma ação, como por exemplo: incluir_ids ou excluir_ids.
4) O segundo parâmetro seriam quais id´s seriam incluidas ou excluídas.
De cara pensei no padrão factory para as ações de incluir e excluir.
Mas ai entra também uma dúvida sobre a implementação desse padrão: A classe AcaoFactory seria a responsável por decompor e validar os parâmetros da string, e após isso atribuir para a classe correta ?
O que acham ?
Opinem por favor.[google]
Obs.: Vou tentar depois colar as classes aqui para vocês opinarem.
Obrigado.
public class AcaoRun { /** * @param args */ public static void main(String[] args) { //Esse seria o parâmetro obtido da servlet String parametroDaSerlvet = "incluir_id={0001,0002,0003,0004}"; Acao acao = AcaoFactory.getAcao( parametroDaSerlvet ); if ( acao == null ){ System.out.println("Acao nula"); return; } acao.processarID(); } }
public class AcaoFactory { final static String ACAO_INCLUIR = "incluir_id"; final static String ACAO_EXCLUIR = "excluir_id"; private static String[] listaDeID; public static Acao getAcao(String param){ // Caso fosse java 7 poderia utilizar Switch !!! if ( param.contains( ACAO_INCLUIR ) && validarIDs(param) ){ return new Inclusao(listaDeID); }else if ( param.contains( ACAO_EXCLUIR ) && validarIDs(param) ){ return new Exclusao(listaDeID); } return null; } public static boolean validarIDs( String parametro ){ if ( parametro.contains("={") && parametro.contains("}") ){ try { // Removendo caraceteres não utilizados parametro = parametro.replace(ACAO_INCLUIR, ""); parametro = parametro.replace(ACAO_EXCLUIR, ""); parametro = parametro.replace("={", ""); parametro = parametro.replace("}", ""); listaDeID = parametro.split(","); return true; } catch (Exception e) { // TODO: handle exception return false; } } return false; } }
public class Exclusao extends Acao { public Exclusao(String[] listaDeID) { this.setListaDeid(listaDeID); } @Override public void processarID() { // Realiza as eclusões dos ids ...... Exemplifico com esse for alguma coisa for (int i = 0; i < this.getListaDeid().length; i++) { System.out.println("Lista Exclusao " + getID(i) ); } } }
public class Inclusao extends Acao{ public Inclusao(String[] listaDeID) { this.setListaDeid(listaDeID); } @Override public void processarID() { // Realiza as inclusões dos ids ...... Exemplifico com esse for alguma coisa for (int i = 0; i < this.getListaDeid().length; i++) { System.out.println("Lista Inclusao " + getID(i) ); } } }
public abstract class Acao { /** Array onde os IDS que serão incluídos ou excluídos ficarão armazenados */ private String[] listaDeid; public void processarID(){} public void setListaDeid(String[] listaDeID2) { this.listaDeid = listaDeID2; } public String[] getListaDeid() { return listaDeid; } /* * Obtém um id da lista */ public String getID( int id ){ return this.listaDeid[id]; } }
Fernando Figueiredo
Posts
22/02/2011
Davi Costa
Espero ter ajudado.
Att Davi
22/02/2011
Fernando Figueiredo
Fora essas observações (muito importantes por sinal), teria mais alguma dica ?
Tipo, se existiria um padrão mais conveniente para realizar essa mesma tarefa ?
Qualquer dica para mim é valiosa, desde nome de atributos até outra abordagem mais funcional e elegante.
Abçs.
22/02/2011
Davi Costa
realmente não é simples avaliar qual o melhor padrão de projeto, vai depender muito da necessidade e o que realmente é esperado da aplicação.
Um exemplo bem prático, se sua aplicação só tiver essa funcionalidade eu não usaria um Factory e atravessaria várias camadas para isso, mas se sua aplicação tiver outros propositos onde vc possa utilizar sua Factory ai sim valeria a pena. Mas fique tranquilo que o Factory casado com o Singleton como falei cabem bem na sua proposta.
Tem que saber a fundo os propósitos da aplicação, as regras de negócio, apesar desses propósitos e regras de negócio variarem bastante na construção de um software(desde mudança de requisitos, alteração na legislaçao.. e por aí vai) é muito importante termos uma idéia parcial do que a aplicação como um todo faz.
Acredito que é muito interessante, vc ver implementação para interfaces, vai facilitar bastante suas futuras manutenções, buscar também sempre o baixo acoplamento(diminuir a dependência de classes) e a alta coesão(classes bem específicas fazendo somente determinada função).
A respeito dos nomes das variáveis sugiro que siga a especificação do Java, segue inclusive uns links de artigos que falam um pouco do assunto:
https://www.devmedia.com.br/post-19153-Desmistificando-a-Certificacao-SCJP6-Parte-IV-Parte-2.html
https://www.devmedia.com.br/post-19152-Desmistificando-a-Certificacao-SCJP6-Parte-IV-Parte-1.html
Espero ter ajudado
Att Davi
24/02/2011
Dyego Carmo
Não são balas de prata...
Use com parcimonia... caso contrario voce acaba criando uma torre de babel...
Clique aqui para fazer login e interagir na Comunidade :)