Estou lendo o livro de Introdução à Arquitetura e Design de software e fiquei com uma dúvida em relação a criar ou não varias instâncias de um objeto.
Aqui no livro diz que “segurar objetos em memória estressa demais o GC baseado em cópia de objetos. A boa pratica de OO já diz que devemos criar pequenos objetos encapsulados, sem muitos dados estáticos, originando instãncias sem nos preocuparmos com caches e outros alegadas otimizações.” e tambem que “devemos adequar nossa aplicação a hipótese de gerações”.
Mas eu vejo por ai, inclusive na empresa onde trabalho, as classes chamadas de Core, que contém varios objetos e funcionalidades comuns a todas as classes do sistemas, e esse Core é iniciado assim que a aplicação é iniciada, criando várias instâncias dos objetos e disponibilizando-os para o resto da aplicação.
A minha dúvida é: É bom fazer assim? Ou seria melhor criar o objeto, desde que não seja pesado, toda vez que invocarmos um método get?
Um exemplo na minha aplicação é uma classe responsável por armazenar todos os repositórios (40). Esses repositórios que são instânciados assim que a classe é instanciada mesmo sendo uma classe bem simples, que recebe apenas um objeto no construtor e se serve apenas dele. Nesse caso não seria melhor guardar só a classe e criar a instância apenas quando dão um get?
a resposta à sua pergunta depende que voce analise os seguintes pontos abaixo, alem de outros especificos que houver:
-> o recurso que estou instanciando uma vez para toda a aplicacao é ‘pesado’, ou deve ser unico necessariamente para toda a aplicacao? ex: algum pool de conexoes
-> faz sentido eu instanciar o recurso x na inicializacao da aplicacao, ou na primeira vez que vier a ser utilizado? é um recurso muito demorado de ser preparado? é bastante utilizado ou é algo que é pouco utilizado?
ou seja, nao tem uma resposta pronta. minha recomendacao geral é: faça e matenha uma arquitetura sempre tao simples quanto possivel, evite a “generalidade especulativa” que martin fowler comenta, e evolua à medida que for (realmente) necessario.
fazer coisas a mais traz complicacoes que tendem a se mostrar desnecessarias e confusas com o decorrer da evolucao do seu projeto.
[quote]“segurar objetos em memória estressa demais o GC baseado em cópia de objetos. A boa pratica de OO já diz que devemos criar pequenos objetos encapsulados, sem muitos dados estáticos, originando instãncias sem nos preocuparmos com caches e outros alegadas otimizações.” e tambem que “devemos adequar nossa aplicação a hipótese de gerações”.
[/quote]
Muitos livros falam coisas lindas e maravilhosas do mundo conceitual desejável, mas na pratica vemos que as coisas funcionam bem diferentes…
Segue um material no qual eu ja abordei o assunto: