Prezados,
Tenho um grande projeto em andamento e preciso passar uma informação de contexto para dezenas ou até centenas de classes, porém não gosto muito da ideia de inserir parâmetros de contexto em um montão de métodos ou construtores por estas classes.
Alguma sugestão de um método alternativo que me livrasse de modificar tantas assinaturas e construtores de classes assim?
Obs. 1: Já o uso o modelo com uma classe tipo God e estática, mas a necessidade de criar contextos em múltiplas janelas inviabilizou tal ideia.
Atenciosamente
Leandro S.
Se eu entendi a sua questão, você precisa usar um objeto para ser usado em várias classes.
E não quer fazer isso passando esse objeto pelo construtor ou método de outras classes.
Recentemente passei por uma posição semelhante, eu usei o padrão Singleton.
Esse Padrão de Projeto (Design Pattern) permite que se crie apenas uma instância da classe.
Você poderia criar o objeto dentro da classe que pretende usar, sempre como única instância.
Com o padrao Singleton apenas uma váriavel tem o método static.
Se isso solucionar seu problema, dê uma pesquisada no Google que vai ter bastante material abordando o assunto.
Eu poderia até por um exemplo aqui, mas como programo em Java, não sei se vc iria testar o código
Olá,
Pode falar livremente em DP, não tenho problemas com GoF, mas o singleton ao meu ver resolve apenas uma parte do problema, é que você ter um único ponto de onde os contextos brotariam, mas a questão ainda fica pendente, como transmitir entre as dezenas e centenas de classes aquele contexto específico sem necessitar ficar passando por construtores a informação. Lembrando que preciso de infinitos contextos para a aplicação.
De qualquer forma, muito obrigado.
Atenciosamente
Leandro Segatti
Vou dar um exemplo prático e simples:
-
Tenho uma aplicação que através de janelas faz o processamento de várias coisas, pois bem, cada janela inicia um Id de contexto que serve para os mais variados tipos de funcionalidades, cada janela terá a sua. Cada classe de serviço funcionando ao longo de qualquer tempo usará exclusivamente o id da janela e não poderá “se enganar” usando IDs de outras janelas.
-
Conforme os objetos se instanciam eu sou obrigado a passar o ID através dos construtores ou métodos para que as funcionalidades executem apropriadamente.
Obs. Via singleton eu tenho um único lugar para pegar a informação, mas preciso entender como controlar a identificação daquele contexto para que não misture com as demais janelas que estão abertas. (Sem uso de multithreading)
Talvez FactoryMethod possa ajudar… dá uma olhada na implementação e vê será útil para você
Cria-se uma interface que define os metodos dos objetos
public interface Grupo
{
public void configurar();
}
Depois as classe concretas que realizam as operações
public class Comum implements Grupo
{
@Override
public void configurar()
{
// faz algo aqui
}
}
public class Proprietario implements Grupo
{
@Override
public void configurar()
{
// faz algo aqui
}
}
E a classe responsável que “cria” o Grupo (Comum, Proprietario)
public class CriadorGrupo
{
public static final int COMUM = 1, PROPRIETARIO = 2;
public Grupo criar( int id )
{
Grupo grupo = null;
if ( id == COMUM )
{
grupo = new Comum();
}
else if ( id == PROPRIETARIO )
{
grupo = new Proprietario();
}
return grupo;
}
}
A classe CriadorGrupo pode ser Singleton tbm, se precisar se uma instância somente para cada objeto segundo o id…
Espero não ter complicado e ter ajudado de alguma forma…
A ideia de usar esse DP é usar a classe CriadorGrupo dentro da classe, ao invés de passar o id por construtor ou por outro metodo.
Bloco de Citação
A ideia de usar esse DP é usar a classe CriadorGrupo dentro da classe, ao invés de passar o id por construtor ou por outro metodo.
A solução é boa, mas somente quando o significado do Id é previsível para que as instanciações dentro do grupocriar possam acontecer.
No meu caso, o Id é imprevisível, podendo ser qualquer valor no limite do int32 e este precisa ser passado entre os objetos.
Por mais que eu olhe o livro do GoF aqui não consigo achar um padrão bom evitar de passar um simples Id entre centenas de classes e seus construtores, to concluindo que vou ter que fazer a passagem em cada construtor mesmo, é algo basilar da resolução deste problema, não dá para fugir.
De qualquer forma, muito obrigado Lemos pelo seu esforço, qquer outra sugestão estamos aí.