Em um livro em C ++, o autor diz que não precisamos mais de uma função com uma longa lista de parâmetros porque a maioria dos parâmetros pode ser refatorada em variáveis de estado em uma classe. Por outro lado, um livro de programação funcional diz que as variáveis de estado são más porque causa efeitos colaterais que causam códigos propensos a erros e dificilmente paralelizados. Estou ficando confuso. O código deve evitar confiar tanto em variáveis de estado quanto possível, movendo sua variável de estado para a lista de parâmetros de função?
10
Respostas:
Depende se você estiver programando em um
procedural
oufunctional
paradigma. Um estado mutável é necessário para o primeiro e incapacitante para o posterior. Isto é maçãs e laranjas. Ambos estão corretos em bailiwicks!Você pode aplicar atribuição única e outras técnicas funcionais a linguagens procedimentais imperativas; o estado imutável torna a programação simultânea mais determinística, mas tornar quase todos os objetos imutáveis em uma linguagem como Java ou C ++ é quase impossível porque seus modelos de memória não suportam facilmente esse paradigma.
fonte
Se entendi bem sua pergunta, você está questionando que condições qualificam o uso de um parâmetro ou variável de classe / membro / campo / etc? Suponho que você esteja se referindo a um método, e não a uma função. Se for especificamente sobre C ++, sugiro que mova sua pergunta para o estouro de pilha.
Uma longa lista de parâmetros pode ser um sinal de que você pode precisar refatorar seu método para um conjunto de métodos mais granulares. Geralmente, o uso de parâmetros tornará seu código mais frouxamente acoplado. Não tenho mais certeza se isso é verdade para a maioria das linguagens OO modernas, mas a criação de objetos pode ser cara, especialmente se houver muitas variáveis de classe envolvidas; portanto, se suas variáveis de classe eram objetos e eram frequentemente referenciadas em um programa, elas podem ser justificadas como variáveis de classe.
Além disso:
fonte
Não, as variáveis de estado em si não causam efeitos colaterais.
Chamar um método setter (em uma estrutura de dados visível em outro lugar) é um efeito colateral.
Você pode ter estruturas de dados para ocultar longas listas de parâmetros e ainda evitar efeitos colaterais se construí-las adequadamente. Aqui está um pequeno exemplo (em Java, não testado):
Obviamente, o construtor de ManyParams ainda terá uma longa lista de parâmetros dessa maneira. Mas está escondido.
fonte